From 60319c6d3709718e4d079ca7cd7ebf1394d3422a Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:32:46 -0700 Subject: [PATCH 001/113] Fix: prevent stale db filename during workflow actions (#12289) --- src/documents/signals/handlers.py | 2 + src/documents/tests/test_workflows.py | 58 +++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index 591d235bd..5be8855e6 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -833,6 +833,8 @@ def run_workflows( if not use_overrides: # limit title to 128 characters document.title = document.title[:128] + # Make sure the filename and archive filename are accurate + document.refresh_from_db(fields=["filename", "archive_filename"]) # save first before setting tags document.save() document.tags.set(doc_tag_ids) diff --git a/src/documents/tests/test_workflows.py b/src/documents/tests/test_workflows.py index deb40a165..ba1e72e1f 100644 --- a/src/documents/tests/test_workflows.py +++ b/src/documents/tests/test_workflows.py @@ -25,6 +25,7 @@ from rest_framework.test import APIClient from rest_framework.test import APITestCase from documents.file_handling import create_source_path_directory +from documents.file_handling import generate_filename from documents.file_handling import generate_unique_filename from documents.signals.handlers import run_workflows from documents.workflows.webhooks import send_webhook @@ -898,6 +899,63 @@ class TestWorkflows( expected_str = f"Document matched {trigger} from {w}" self.assertIn(expected_str, cm.output[0]) + def test_workflow_assign_custom_field_keeps_storage_filename_in_sync(self) -> None: + """ + GIVEN: + - Existing document with a storage path template that depends on a custom field + - Existing workflow triggered on document update assigning that custom field + WHEN: + - Workflow runs for the document + THEN: + - The database filename remains aligned with the moved file on disk + """ + storage_path = StoragePath.objects.create( + name="workflow-custom-field-path", + path="{{ custom_fields|get_cf_value('Custom Field 1', 'none') }}/{{ title }}", + ) + doc = Document.objects.create( + title="workflow custom field sync", + mime_type="application/pdf", + checksum="workflow-custom-field-sync", + storage_path=storage_path, + original_filename="workflow-custom-field-sync.pdf", + ) + CustomFieldInstance.objects.create( + document=doc, + field=self.cf1, + value_text="initial", + ) + + generated = generate_unique_filename(doc) + destination = (settings.ORIGINALS_DIR / generated).resolve() + create_source_path_directory(destination) + shutil.copy(self.SAMPLE_DIR / "simple.pdf", destination) + Document.objects.filter(pk=doc.pk).update(filename=generated.as_posix()) + doc.refresh_from_db() + + trigger = WorkflowTrigger.objects.create( + type=WorkflowTrigger.WorkflowTriggerType.DOCUMENT_UPDATED, + ) + action = WorkflowAction.objects.create( + type=WorkflowAction.WorkflowActionType.ASSIGNMENT, + assign_custom_fields_values={self.cf1.pk: "cars"}, + ) + action.assign_custom_fields.add(self.cf1.pk) + workflow = Workflow.objects.create( + name="Workflow custom field filename sync", + order=0, + ) + workflow.triggers.add(trigger) + workflow.actions.add(action) + workflow.save() + + run_workflows(WorkflowTrigger.WorkflowTriggerType.DOCUMENT_UPDATED, doc) + + doc.refresh_from_db() + expected_filename = generate_filename(doc) + self.assertEqual(Path(doc.filename), expected_filename) + self.assertTrue(doc.source_path.is_file()) + def test_document_added_workflow(self): trigger = WorkflowTrigger.objects.create( type=WorkflowTrigger.WorkflowTriggerType.DOCUMENT_ADDED, From ba0a80a8ad04e9dc2e1ae1d83d556c2a2d2f629c Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 11 Mar 2026 07:39:32 -0700 Subject: [PATCH 002/113] Fix: prevent wrapping with larger amounts of tags on small cards, reset moreTags setting to correct count (#12302) --- .../document-card-small.component.html | 2 +- .../document-card-small.component.scss | 10 ++++++++++ .../document-card-small.component.spec.ts | 10 ++++++++++ .../document-card-small.component.ts | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html index b154324c7..b3a29aed4 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html @@ -15,7 +15,7 @@ } @if (document && displayFields?.includes(DisplayField.TAGS)) { -
+
@for (tagID of tagIDs; track tagID) { } diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.scss b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.scss index 508c5251a..dce77802e 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.scss +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.scss @@ -72,4 +72,14 @@ a { max-width: 80%; row-gap: .2rem; line-height: 1; + + &.tags-no-wrap { + ::ng-deep .badge { + display: inline-block; + max-width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } } diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts index 63cfc5a50..982b3980b 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts @@ -82,6 +82,16 @@ describe('DocumentCardSmallComponent', () => { ).toHaveLength(6) }) + it('should clear hidden tag counter when tag count falls below the limit', () => { + expect(component.moreTags).toEqual(3) + + component.document.tags = [1, 2, 3, 4, 5, 6] + fixture.detectChanges() + + expect(component.moreTags).toBeNull() + expect(fixture.nativeElement.textContent).not.toContain('+ 3') + }) + it('should try to close the preview on mouse leave', () => { component.popupPreview = { close: jest.fn(), diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts index ad428dfab..05f84d752 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts @@ -126,6 +126,7 @@ export class DocumentCardSmallComponent this.moreTags = this.document.tags.length - (limit - 1) return this.document.tags.slice(0, limit - 1) } else { + this.moreTags = null return this.document.tags } } From d919c341b12ba1fcc2a3f9bc84b4e98160582990 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 12 Mar 2026 11:57:35 -0700 Subject: [PATCH 003/113] Fix: clear descendant selections in dropdown when parent toggled (#12326) --- .../filterable-dropdown.component.spec.ts | 53 +++++++++++++++++++ .../filterable-dropdown.component.ts | 35 ++++++++++++ 2 files changed, 88 insertions(+) diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts index 2ecf95f2b..1763239b1 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts +++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts @@ -631,6 +631,59 @@ describe('FilterableDropdownComponent & FilterableDropdownSelectionModel', () => ]) }) + it('deselecting a parent clears selected descendants', () => { + const root: Tag = { id: 100, name: 'Root Tag' } + const child: Tag = { id: 101, name: 'Child Tag', parent: root.id } + const grandchild: Tag = { + id: 102, + name: 'Grandchild Tag', + parent: child.id, + } + const other: Tag = { id: 103, name: 'Other Tag' } + + selectionModel.items = [root, child, grandchild, other] + selectionModel.set(root.id, ToggleableItemState.Selected, false) + selectionModel.set(child.id, ToggleableItemState.Selected, false) + selectionModel.set(grandchild.id, ToggleableItemState.Selected, false) + selectionModel.set(other.id, ToggleableItemState.Selected, false) + + selectionModel.toggle(root.id, false) + + expect(selectionModel.getSelectedItems()).toEqual([other]) + }) + + it('un-excluding a parent clears excluded descendants', () => { + const root: Tag = { id: 110, name: 'Root Tag' } + const child: Tag = { id: 111, name: 'Child Tag', parent: root.id } + const other: Tag = { id: 112, name: 'Other Tag' } + + selectionModel.items = [root, child, other] + selectionModel.set(root.id, ToggleableItemState.Excluded, false) + selectionModel.set(child.id, ToggleableItemState.Excluded, false) + selectionModel.set(other.id, ToggleableItemState.Excluded, false) + + selectionModel.exclude(root.id, false) + + expect(selectionModel.getExcludedItems()).toEqual([other]) + }) + + it('excluding a selected parent clears selected descendants', () => { + const root: Tag = { id: 120, name: 'Root Tag' } + const child: Tag = { id: 121, name: 'Child Tag', parent: root.id } + const other: Tag = { id: 122, name: 'Other Tag' } + + selectionModel.manyToOne = true + selectionModel.items = [root, child, other] + selectionModel.set(root.id, ToggleableItemState.Selected, false) + selectionModel.set(child.id, ToggleableItemState.Selected, false) + selectionModel.set(other.id, ToggleableItemState.Selected, false) + + selectionModel.exclude(root.id, false) + + expect(selectionModel.getExcludedItems()).toEqual([root]) + expect(selectionModel.getSelectedItems()).toEqual([other]) + }) + it('resorts items immediately when document count sorting enabled', () => { const apple: Tag = { id: 55, name: 'Apple' } const zebra: Tag = { id: 56, name: 'Zebra' } diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts index ec5425630..bc15e3374 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts +++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts @@ -231,6 +231,7 @@ export class FilterableDropdownSelectionModel { state == ToggleableItemState.Excluded ) { this.temporarySelectionStates.delete(id) + this.clearDescendantSelections(id) } if (!id) { @@ -257,6 +258,7 @@ export class FilterableDropdownSelectionModel { if (this.manyToOne || this.singleSelect) { this.temporarySelectionStates.set(id, ToggleableItemState.Excluded) + this.clearDescendantSelections(id) if (this.singleSelect) { for (let key of this.temporarySelectionStates.keys()) { @@ -277,9 +279,15 @@ export class FilterableDropdownSelectionModel { newState = ToggleableItemState.NotSelected } this.temporarySelectionStates.set(id, newState) + if (newState == ToggleableItemState.Excluded) { + this.clearDescendantSelections(id) + } } } else if (!id || state == ToggleableItemState.Excluded) { this.temporarySelectionStates.delete(id) + if (id) { + this.clearDescendantSelections(id) + } } if (fireEvent) { @@ -291,6 +299,33 @@ export class FilterableDropdownSelectionModel { return this.selectionStates.get(id) || ToggleableItemState.NotSelected } + private clearDescendantSelections(id: number) { + for (const descendantID of this.getDescendantIDs(id)) { + this.temporarySelectionStates.delete(descendantID) + } + } + + private getDescendantIDs(id: number): number[] { + const descendants: number[] = [] + const queue: number[] = [id] + + while (queue.length) { + const parentID = queue.shift() + for (const item of this._items) { + if ( + typeof item?.id === 'number' && + typeof (item as any)['parent'] === 'number' && + (item as any)['parent'] === parentID + ) { + descendants.push(item.id) + queue.push(item.id) + } + } + } + + return descendants + } + get logicalOperator(): LogicalOperator { return this.temporaryLogicalOperator } From 40255cfdbb8cf12c38df01a507b01e3f4991a697 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 12 Mar 2026 14:06:16 -0700 Subject: [PATCH 004/113] Fix: correct dropdown list active color in dark mode (#12328) --- src-ui/src/theme.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src-ui/src/theme.scss b/src-ui/src/theme.scss index eacc3b4e7..e6a4ea113 100644 --- a/src-ui/src/theme.scss +++ b/src-ui/src/theme.scss @@ -149,6 +149,10 @@ $form-check-radio-checked-bg-image-dark: url("data:image/svg+xml, Date: Fri, 13 Mar 2026 22:07:31 -0700 Subject: [PATCH 006/113] Chore: bump Angular dependencies to 21.2.x (#12338) --- src-ui/package.json | 28 +-- src-ui/pnpm-lock.yaml | 456 ++++++++++++++++++++++-------------------- 2 files changed, 258 insertions(+), 226 deletions(-) diff --git a/src-ui/package.json b/src-ui/package.json index d133b7df4..a1cfaf7d3 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -11,15 +11,15 @@ }, "private": true, "dependencies": { - "@angular/cdk": "^21.2.0", - "@angular/common": "~21.2.0", - "@angular/compiler": "~21.2.0", - "@angular/core": "~21.2.0", - "@angular/forms": "~21.2.0", - "@angular/localize": "~21.2.0", - "@angular/platform-browser": "~21.2.0", - "@angular/platform-browser-dynamic": "~21.2.0", - "@angular/router": "~21.2.0", + "@angular/cdk": "^21.2.2", + "@angular/common": "~21.2.4", + "@angular/compiler": "~21.2.4", + "@angular/core": "~21.2.4", + "@angular/forms": "~21.2.4", + "@angular/localize": "~21.2.4", + "@angular/platform-browser": "~21.2.4", + "@angular/platform-browser-dynamic": "~21.2.4", + "@angular/router": "~21.2.4", "@ng-bootstrap/ng-bootstrap": "^20.0.0", "@ng-select/ng-select": "^21.4.1", "@ngneat/dirty-check-forms": "^3.0.3", @@ -42,16 +42,16 @@ "devDependencies": { "@angular-builders/custom-webpack": "^21.0.3", "@angular-builders/jest": "^21.0.3", - "@angular-devkit/core": "^21.2.0", - "@angular-devkit/schematics": "^21.2.0", + "@angular-devkit/core": "^21.2.2", + "@angular-devkit/schematics": "^21.2.2", "@angular-eslint/builder": "21.3.0", "@angular-eslint/eslint-plugin": "21.3.0", "@angular-eslint/eslint-plugin-template": "21.3.0", "@angular-eslint/schematics": "21.3.0", "@angular-eslint/template-parser": "21.3.0", - "@angular/build": "^21.2.0", - "@angular/cli": "~21.2.0", - "@angular/compiler-cli": "~21.2.0", + "@angular/build": "^21.2.2", + "@angular/cli": "~21.2.2", + "@angular/compiler-cli": "~21.2.4", "@codecov/webpack-plugin": "^1.9.1", "@playwright/test": "^1.58.2", "@types/jest": "^30.0.0", diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index c531839a5..342fbb8ba 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -9,41 +9,41 @@ importers: .: dependencies: '@angular/cdk': - specifier: ^21.2.0 - version: 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: ^21.2.2 + version: 21.2.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/common': - specifier: ~21.2.0 - version: 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: ~21.2.4 + version: 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/compiler': - specifier: ~21.2.0 - version: 21.2.0 + specifier: ~21.2.4 + version: 21.2.4 '@angular/core': - specifier: ~21.2.0 - version: 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) + specifier: ~21.2.4 + version: 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/forms': - specifier: ~21.2.0 - version: 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: ~21.2.4 + version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/localize': - specifier: ~21.2.0 - version: 21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0) + specifier: ~21.2.4 + version: 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) '@angular/platform-browser': - specifier: ~21.2.0 - version: 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: ~21.2.4 + version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) '@angular/platform-browser-dynamic': - specifier: ~21.2.0 - version: 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))) + specifier: ~21.2.4 + version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) '@angular/router': - specifier: ~21.2.0 - version: 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: ~21.2.4 + version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@ng-bootstrap/ng-bootstrap': specifier: ^20.0.0 - version: 20.0.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@popperjs/core@2.11.8)(rxjs@7.8.2) + version: 20.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@popperjs/core@2.11.8)(rxjs@7.8.2) '@ng-select/ng-select': specifier: ^21.4.1 - version: 21.4.1(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)) + version: 21.4.1(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)) '@ngneat/dirty-check-forms': specifier: ^3.0.3 - version: 3.0.3(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2) + version: 3.0.3(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -58,19 +58,19 @@ importers: version: 1.0.0 ngx-bootstrap-icons: specifier: ^1.9.3 - version: 1.9.3(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + version: 1.9.3(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-color: specifier: ^10.1.0 - version: 10.1.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + version: 10.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-cookie-service: specifier: ^21.1.0 - version: 21.1.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + version: 21.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-device-detector: specifier: ^11.0.0 - version: 11.0.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + version: 11.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-ui-tour-ng-bootstrap: specifier: ^18.0.0 - version: 18.0.0(9f28d3e6eaf246a683609aafac107126) + version: 18.0.0(f247d97663488c516a027bc34de144d4) pdfjs-dist: specifier: ^5.4.624 version: 5.4.624 @@ -92,19 +92,19 @@ importers: devDependencies: '@angular-builders/custom-webpack': specifier: ^21.0.3 - version: 21.0.3(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + version: 21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-builders/jest': specifier: ^21.0.3 - version: 21.0.3(b3fc6e706e4ec543940067da51c1bcc4) + version: 21.0.3(d3759a42701812e83e3b36381edcbc70) '@angular-devkit/core': - specifier: ^21.2.0 - version: 21.2.0(chokidar@5.0.0) + specifier: ^21.2.2 + version: 21.2.2(chokidar@5.0.0) '@angular-devkit/schematics': - specifier: ^21.2.0 - version: 21.2.0(chokidar@5.0.0) + specifier: ^21.2.2 + version: 21.2.2(chokidar@5.0.0) '@angular-eslint/builder': specifier: 21.3.0 - version: 21.3.0(@angular/cli@21.2.0(@types/node@25.3.3)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin': specifier: 21.3.0 version: 21.3.0(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) @@ -113,19 +113,19 @@ importers: version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/schematics': specifier: 21.3.0 - version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.0(@types/node@25.3.3)(chokidar@5.0.0))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/template-parser': specifier: 21.3.0 version: 21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@angular/build': - specifier: ^21.2.0 - version: 21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + specifier: ^21.2.2 + version: 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/cli': - specifier: ~21.2.0 - version: 21.2.0(@types/node@25.3.3)(chokidar@5.0.0) + specifier: ~21.2.2 + version: 21.2.2(@types/node@25.3.3)(chokidar@5.0.0) '@angular/compiler-cli': - specifier: ~21.2.0 - version: 21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3) + specifier: ~21.2.4 + version: 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@codecov/webpack-plugin': specifier: ^1.9.1 version: 1.9.1(webpack@5.105.3) @@ -161,7 +161,7 @@ importers: version: 16.0.0 jest-preset-angular: specifier: ^16.1.1 - version: 16.1.1(c76dc1c8ec36d3a138dfbfdecb5c07d6) + version: 16.1.1(d878552686fd57cfb81e628ed4a9814b) jest-websocket-mock: specifier: ^2.5.0 version: 2.5.0 @@ -285,6 +285,11 @@ packages: engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true + '@angular-devkit/architect@0.2102.2': + resolution: {integrity: sha512-CDvFtXwyBtMRkTQnm+LfBNLL0yLV8ZGskrM1T6VkcGwXGFDott1FxUdj96ViodYsYL5fbJr0MNA6TlLcanV3kQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + '@angular-devkit/build-angular@21.1.2': resolution: {integrity: sha512-i/FTbqVwj0Wk6B5RA2H9iVsDC/kIK/5koSEwkIQjXGZuDVFUoEuWiIR2PGGSSQ9u3DmkpVPZmKEXWRl+g7Qn5g==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} @@ -360,8 +365,17 @@ packages: chokidar: optional: true - '@angular-devkit/schematics@21.2.0': - resolution: {integrity: sha512-3kn3FI5v7BQ7Zct6raek+WgvyDwOJ8wElbyC903GxMQCDBRGGcevhHvTAIHhknihEsrgplzPhTlWeMbk1JfdFg==} + '@angular-devkit/core@21.2.2': + resolution: {integrity: sha512-xUeKGe4BDQpkz0E6fnAPIJXE0y0nqtap0KhJIBhvN7xi3NenIzTmoi6T9Yv5OOBUdLZbOm4SOel8MhdXiIBpAQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^5.0.0 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/schematics@21.2.2': + resolution: {integrity: sha512-CCeyQxGUq+oyGnHd7PfcYIVbj9pRnqjQq0rAojoAqs1BJdtInx9weLBCLy+AjM3NHePeZrnwm+wEVr8apED8kg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} '@angular-eslint/builder@21.3.0': @@ -454,8 +468,8 @@ packages: vitest: optional: true - '@angular/build@21.2.0': - resolution: {integrity: sha512-K0EqiHz2y7TSyD4adWD0+C/P9khKlrsSWavXWxGRvoSJC/H3I3SK5Z6BWwftBibXR1Fis7njwvl5IGAlQrDchA==} + '@angular/build@21.2.2': + resolution: {integrity: sha512-Vq2eIneNxzhHm1MwEmRqEJDwHU9ODfSRDaMWwtysGMhpoMQmLdfTqkQDmkC2qVUr8mV8Z1i5I+oe5ZJaMr/PlQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler': ^21.0.0 @@ -465,7 +479,7 @@ packages: '@angular/platform-browser': ^21.0.0 '@angular/platform-server': ^21.0.0 '@angular/service-worker': ^21.0.0 - '@angular/ssr': ^21.2.0 + '@angular/ssr': ^21.2.2 karma: ^6.4.0 less: ^4.2.0 ng-packagr: ^21.0.0 @@ -500,46 +514,46 @@ packages: vitest: optional: true - '@angular/cdk@21.2.0': - resolution: {integrity: sha512-1P0TNL1F51NC7JAaXabaAHY7Y1zBloLSZXfml1POa4a116V+y/QZfPGsxM0LwD1qSSXhSb2LNl7duTtJAP39bA==} + '@angular/cdk@21.2.2': + resolution: {integrity: sha512-9AsZkwqy07No7+0qPydcJfXB6SpA9qLDBanoesNj5KsiZJ62PJH3oIjVyNeQEEe1HQWmSwBnhwN12OPLNMUlnw==} peerDependencies: '@angular/common': ^21.0.0 || ^22.0.0 '@angular/core': ^21.0.0 || ^22.0.0 '@angular/platform-browser': ^21.0.0 || ^22.0.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/cli@21.2.0': - resolution: {integrity: sha512-yaGEpckqgOemcHkoWeH92i9eNrcbr9iE/dnxL+Du6s9spTAXJ2jjtYfszhmowuQZkCK5rjecMb8ctNtHlaGCjg==} + '@angular/cli@21.2.2': + resolution: {integrity: sha512-eZo8/qX+ZIpIWc0CN+cCX13Lbgi/031wAp8DRVhDDO6SMVtcr/ObOQ2S16+pQdOMXxiG3vby6IhzJuz9WACzMQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular/common@21.2.0': - resolution: {integrity: sha512-6zJMPi0i/XDniEgv3/t2BjuDHiOG44lgIR5PYyxqGpgJ0kqB5hku/0TuentNEi1VnBYgthnfhjek7c+lakXmhw==} + '@angular/common@21.2.4': + resolution: {integrity: sha512-NrP6qOuUpo3fqq14UJ1b2bIRtWsfvxh1qLqOyFV4gfBrHhXd0XffU1LUlUw1qp4w1uBSgPJ0/N5bSPUWrAguVg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/core': 21.2.0 + '@angular/core': 21.2.4 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@21.2.0': - resolution: {integrity: sha512-gZd58p0/JjgdxMX3v+LjCB6e3dBIfNVr/YzXoh55TfffdBCUQY94hl1+DFQkJ72K5EX+1zbaz03dIm30kw1bGw==} + '@angular/compiler-cli@21.2.4': + resolution: {integrity: sha512-vGjd7DZo/Ox50pQCm5EycmBu91JclimPtZoyNXu/2hSxz3oAkzwiHCwlHwk2g58eheSSp+lYtYRLmHAqSVZLjg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler': 21.2.0 + '@angular/compiler': 21.2.4 typescript: '>=5.9 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@21.2.0': - resolution: {integrity: sha512-0RPkma8UVNpse/VJcXT9w6SKzTMz4J/uMGj0l9enM1frg9xrx1fwi/lLmaVV9Nr9LfqPjQdxNFFlvaBB7g/2zg==} + '@angular/compiler@21.2.4': + resolution: {integrity: sha512-9+ulVK3idIo/Tu4X2ic7/V0+Uj7pqrOAbOuIirYe6Ymm3AjexuFRiGBbfcH0VJhQ5cf8TvIJ1fuh+MI4JiRIxA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@angular/core@21.2.0': - resolution: {integrity: sha512-VnTbmZq3g3Q+s3nCZ8VUDMLjMezOg/bqUxAJ/DrRWCrEcTP5JO3mrNPs3FHj+qlB0T+BQP7uQv6QTzPVKybwoA==} + '@angular/core@21.2.4': + resolution: {integrity: sha512-2+gd67ZuXHpGOqeb2o7XZPueEWEP81eJza2tSHkT5QMV8lnYllDEmaNnkPxnIjSLGP1O3PmiXxo4z8ibHkLZwg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/compiler': 21.2.0 + '@angular/compiler': 21.2.4 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -548,50 +562,50 @@ packages: zone.js: optional: true - '@angular/forms@21.2.0': - resolution: {integrity: sha512-NduUtPWLauH/FLayEDkLyaKAGqKzXbcfO7468LOWCXN3crhNVQyIWRQPOUcdpoJwDAGLpN85m3DhJhXNnA9c5w==} + '@angular/forms@21.2.4': + resolution: {integrity: sha512-1fOhctA9ADEBYjI3nPQUR5dHsK2+UWAjup37Ksldk/k0w8UpD5YsN7JVNvsDMZRFMucKYcGykPblU7pABtsqnQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.2.0 - '@angular/core': 21.2.0 - '@angular/platform-browser': 21.2.0 + '@angular/common': 21.2.4 + '@angular/core': 21.2.4 + '@angular/platform-browser': 21.2.4 rxjs: ^6.5.3 || ^7.4.0 - '@angular/localize@21.2.0': - resolution: {integrity: sha512-blVjzwHSaKbFNCQN/RZy8rSbFgajMw3kBzGrDY08atMDOPn90L2nE4dot+9d0JlKAX2gL8Qfx44YgIWBI5MfsA==} + '@angular/localize@21.2.4': + resolution: {integrity: sha512-brKKeH+jaTlY4coIOinKQtitLCguQzyniKYtfrhCvZSN0ap4W4PljAT5w3l+1a8e7/ThM1JVQpqtVCCcJHJZSg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler': 21.2.0 - '@angular/compiler-cli': 21.2.0 + '@angular/compiler': 21.2.4 + '@angular/compiler-cli': 21.2.4 - '@angular/platform-browser-dynamic@21.2.0': - resolution: {integrity: sha512-eTHNTnTEP25eCyu4MJdPAAc/7Ib5XtR/dqUlzZdNoAldREPNw95FF12QMunvnen66v3CvCYdND8rAlbz2LkK7g==} + '@angular/platform-browser-dynamic@21.2.4': + resolution: {integrity: sha512-LRJLnGh4rdgD0+S5xuDd4YRm5bV8WP2e6F1Pe5rIr6N4V9ofgpB0/uOjYy9se99FJZjoyPnpxaKsp8+XA753Zg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.2.0 - '@angular/compiler': 21.2.0 - '@angular/core': 21.2.0 - '@angular/platform-browser': 21.2.0 + '@angular/common': 21.2.4 + '@angular/compiler': 21.2.4 + '@angular/core': 21.2.4 + '@angular/platform-browser': 21.2.4 - '@angular/platform-browser@21.2.0': - resolution: {integrity: sha512-IUGukpvvT2B5Dl76qzk6rY7UIHUT9u4BhT2AwVz+5JqcX9KwQtYD17Gt7wj6bvIgCXKWG+CfN8Zd9DECOCYWjg==} + '@angular/platform-browser@21.2.4': + resolution: {integrity: sha512-1A9e/cQVu+3BkRCktLcO3RZGuw8NOTHw1frUUrpAz+iMyvIT4sDRFbL+U1g8qmOCZqRNC1Pi1HZfZ1kl6kvrcQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/animations': 21.2.0 - '@angular/common': 21.2.0 - '@angular/core': 21.2.0 + '@angular/animations': 21.2.4 + '@angular/common': 21.2.4 + '@angular/core': 21.2.4 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/router@21.2.0': - resolution: {integrity: sha512-siliJ+jJRUCRZ0cdkqc7zww9Didz56Z0Z2YPIuR2n5TZLiuJY+jAf6xotXKp/v6v8XoGJwLiRNipGgNDRIAlWA==} + '@angular/router@21.2.4': + resolution: {integrity: sha512-OjWze4XT8i2MThcBXMv7ru1k6/5L6QYZbcXuseqimFCHm2avEJ+mXPovY066fMBZJhqbXdjB82OhHAWkIHjglQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.2.0 - '@angular/core': 21.2.0 - '@angular/platform-browser': 21.2.0 + '@angular/common': 21.2.4 + '@angular/core': 21.2.4 + '@angular/platform-browser': 21.2.4 rxjs: ^6.5.3 || ^7.4.0 '@asamuzakjp/css-color@3.2.0': @@ -2847,8 +2861,8 @@ packages: cpu: [x64] os: [win32] - '@schematics/angular@21.2.0': - resolution: {integrity: sha512-GQUIeGzZwCT9/W5MAkKnkwETROPbA1eRmy3JF56jLmvr95tJnypGOG8jGYy0d+tcEVujIouh48r4J3bJQg5mrw==} + '@schematics/angular@21.2.2': + resolution: {integrity: sha512-Ywa6HDtX7TRBQZTVMMnxX3Mk7yVnG8KtSFaXWrkx779+q8tqYdBwNwAqbNd4Zatr1GccKaz9xcptHJta5+DTxw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} '@sigstore/bundle@4.0.0': @@ -6873,7 +6887,7 @@ snapshots: '@angular-builders/common@5.0.3(@types/node@25.3.3)(chokidar@5.0.0)(typescript@5.9.3)': dependencies: - '@angular-devkit/core': 21.2.0(chokidar@5.0.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) ts-node: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) tsconfig-paths: 4.2.0 transitivePeerDependencies: @@ -6883,14 +6897,14 @@ snapshots: - chokidar - typescript - '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@angular-builders/common': 5.0.3(@types/node@25.3.3)(chokidar@5.0.0)(typescript@5.9.3) '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) - '@angular-devkit/core': 21.2.0(chokidar@5.0.0) - '@angular/build': 21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) - '@angular/compiler-cli': 21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular/build': 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) lodash: 4.17.23 webpack-merge: 6.0.1 transitivePeerDependencies: @@ -6936,17 +6950,17 @@ snapshots: - webpack-cli - yaml - '@angular-builders/jest@21.0.3(b3fc6e706e4ec543940067da51c1bcc4)': + '@angular-builders/jest@21.0.3(d3759a42701812e83e3b36381edcbc70)': dependencies: '@angular-builders/common': 5.0.3(@types/node@25.3.3)(chokidar@5.0.0)(typescript@5.9.3) '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) - '@angular-devkit/core': 21.2.0(chokidar@5.0.0) - '@angular/compiler-cli': 21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser-dynamic': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser-dynamic': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) jest: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) - jest-preset-angular: 16.1.1(c76dc1c8ec36d3a138dfbfdecb5c07d6) + jest-preset-angular: 16.1.1(d878552686fd57cfb81e628ed4a9814b) lodash: 4.17.23 transitivePeerDependencies: - '@angular/platform-browser' @@ -6976,14 +6990,21 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular-devkit/architect@0.2102.2(chokidar@5.0.0)': + dependencies: + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.3))(webpack@5.104.1(esbuild@0.27.2)) '@angular-devkit/core': 21.1.2(chokidar@5.0.0) - '@angular/build': 21.1.2(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) - '@angular/compiler-cli': 21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3) + '@angular/build': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@babel/core': 7.28.5 '@babel/generator': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 @@ -6994,7 +7015,7 @@ snapshots: '@babel/preset-env': 7.28.5(@babel/core@7.28.5) '@babel/runtime': 7.28.4 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 21.1.2(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2)) + '@ngtools/webpack': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2)) ansi-colors: 4.1.3 autoprefixer: 10.4.23(postcss@8.5.6) babel-loader: 10.0.0(@babel/core@7.28.5)(webpack@5.104.1(esbuild@0.27.2)) @@ -7035,9 +7056,9 @@ snapshots: webpack-merge: 6.0.1 webpack-subresource-integrity: 5.1.0(webpack@5.104.1(esbuild@0.27.2)) optionalDependencies: - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/localize': 21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0) - '@angular/platform-browser': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) esbuild: 0.27.2 jest: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) jest-environment-jsdom: 30.2.0(canvas@3.0.0) @@ -7095,9 +7116,20 @@ snapshots: optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/schematics@21.2.0(chokidar@5.0.0)': + '@angular-devkit/core@21.2.2(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.0(chokidar@5.0.0) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + jsonc-parser: 3.3.1 + picomatch: 4.0.3 + rxjs: 7.8.2 + source-map: 0.7.6 + optionalDependencies: + chokidar: 5.0.0 + + '@angular-devkit/schematics@21.2.2(chokidar@5.0.0)': + dependencies: + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) jsonc-parser: 3.3.1 magic-string: 0.30.21 ora: 9.3.0 @@ -7105,11 +7137,11 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-eslint/builder@21.3.0(@angular/cli@21.2.0(@types/node@25.3.3)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-devkit/architect': 0.2102.0(chokidar@5.0.0) - '@angular-devkit/core': 21.2.0(chokidar@5.0.0) - '@angular/cli': 21.2.0(@types/node@25.3.3)(chokidar@5.0.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular/cli': 21.2.2(@types/node@25.3.3)(chokidar@5.0.0) eslint: 10.0.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -7138,13 +7170,13 @@ snapshots: ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.0(@types/node@25.3.3)(chokidar@5.0.0))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-devkit/core': 21.2.0(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.0(chokidar@5.0.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) '@angular-eslint/eslint-plugin': 21.3.0(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin-template': 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@angular/cli': 21.2.0(@types/node@25.3.3)(chokidar@5.0.0) + '@angular/cli': 21.2.2(@types/node@25.3.3)(chokidar@5.0.0) ignore: 7.0.5 semver: 7.7.4 strip-json-comments: 3.1.1 @@ -7170,12 +7202,12 @@ snapshots: eslint: 10.0.2(jiti@2.6.1) typescript: 5.9.3 - '@angular/build@21.1.2(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular/build@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular/compiler': 21.2.0 - '@angular/compiler-cli': 21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3) + '@angular/compiler': 21.2.4 + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 @@ -7204,9 +7236,9 @@ snapshots: vite: 7.3.0(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) watchpack: 2.5.0 optionalDependencies: - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/localize': 21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0) - '@angular/platform-browser': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) less: 4.4.2 lmdb: 3.4.4 postcss: 8.5.6 @@ -7223,12 +7255,12 @@ snapshots: - tsx - yaml - '@angular/build@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular/build@21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.0(chokidar@5.0.0) - '@angular/compiler': 21.2.0 - '@angular/compiler-cli': 21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3) + '@angular-devkit/architect': 0.2102.2(chokidar@5.0.0) + '@angular/compiler': 21.2.4 + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 @@ -7257,9 +7289,9 @@ snapshots: vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) watchpack: 2.5.1 optionalDependencies: - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/localize': 21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0) - '@angular/platform-browser': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) less: 4.4.2 lmdb: 3.5.1 postcss: 8.5.6 @@ -7276,24 +7308,24 @@ snapshots: - tsx - yaml - '@angular/cdk@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/cdk@21.2.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) parse5: 8.0.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/cli@21.2.0(@types/node@25.3.3)(chokidar@5.0.0)': + '@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0)': dependencies: - '@angular-devkit/architect': 0.2102.0(chokidar@5.0.0) - '@angular-devkit/core': 21.2.0(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.0(chokidar@5.0.0) + '@angular-devkit/architect': 0.2102.2(chokidar@5.0.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) '@inquirer/prompts': 7.10.1(@types/node@25.3.3) '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@25.3.3))(@types/node@25.3.3)(listr2@9.0.5) '@modelcontextprotocol/sdk': 1.26.0(zod@4.3.6) - '@schematics/angular': 21.2.0(chokidar@5.0.0) + '@schematics/angular': 21.2.2(chokidar@5.0.0) '@yarnpkg/lockfile': 1.1.0 algoliasearch: 5.48.1 ini: 6.0.0 @@ -7311,15 +7343,15 @@ snapshots: - chokidar - supports-color - '@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': + '@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3)': + '@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3)': dependencies: - '@angular/compiler': 21.2.0 + '@angular/compiler': 21.2.4 '@babel/core': 7.29.0 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 5.0.0 @@ -7333,31 +7365,31 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/compiler@21.2.0': + '@angular/compiler@21.2.4': dependencies: tslib: 2.8.1 - '@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)': + '@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 21.2.0 + '@angular/compiler': 21.2.4 zone.js: 0.16.1 - '@angular/forms@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0)': + '@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)': dependencies: - '@angular/compiler': 21.2.0 - '@angular/compiler-cli': 21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3) + '@angular/compiler': 21.2.4 + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 tinyglobby: 0.2.15 @@ -7365,25 +7397,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/platform-browser-dynamic@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))': + '@angular/platform-browser-dynamic@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))': dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/compiler': 21.2.0 - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/compiler': 21.2.4 + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) tslib: 2.8.1 - '@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))': + '@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))': dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - '@angular/router@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) rxjs: 7.8.2 tslib: 2.8.1 @@ -9202,35 +9234,35 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@ng-bootstrap/ng-bootstrap@20.0.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@popperjs/core@2.11.8)(rxjs@7.8.2)': + '@ng-bootstrap/ng-bootstrap@20.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@popperjs/core@2.11.8)(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/forms': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/localize': 21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) '@popperjs/core': 2.11.8 rxjs: 7.8.2 tslib: 2.8.1 - '@ng-select/ng-select@21.4.1(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))': + '@ng-select/ng-select@21.4.1(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))': dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/forms': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) tslib: 2.8.1 - ? '@ngneat/dirty-check-forms@3.0.3(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2)' + ? '@ngneat/dirty-check-forms@3.0.3(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2)' : dependencies: - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/forms': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/router': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/router': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) lodash-es: 4.17.21 rxjs: 7.8.2 tslib: 2.8.1 - '@ngtools/webpack@21.1.2(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2))': + '@ngtools/webpack@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2))': dependencies: - '@angular/compiler-cli': 21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3) + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) typescript: 5.9.3 webpack: 5.104.1(esbuild@0.27.2) @@ -9587,10 +9619,10 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true - '@schematics/angular@21.2.0(chokidar@5.0.0)': + '@schematics/angular@21.2.2(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.0(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.0(chokidar@5.0.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) jsonc-parser: 3.3.1 transitivePeerDependencies: - chokidar @@ -10626,7 +10658,7 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: webpack: 5.104.1(esbuild@0.27.2) @@ -11756,12 +11788,12 @@ snapshots: optionalDependencies: jest-resolve: 30.2.0 - jest-preset-angular@16.1.1(c76dc1c8ec36d3a138dfbfdecb5c07d6): + jest-preset-angular@16.1.1(d878552686fd57cfb81e628ed4a9814b): dependencies: - '@angular/compiler-cli': 21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)) - '@angular/platform-browser-dynamic': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.0)(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))) + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/platform-browser-dynamic': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) '@jest/environment-jsdom-abstract': 30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) bs-logger: 0.2.6 esbuild-wasm: 0.27.3 @@ -12373,46 +12405,46 @@ snapshots: neo-async@2.6.2: {} - ngx-bootstrap-icons@1.9.3(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)): + ngx-bootstrap-icons@1.9.3(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - ngx-color@10.1.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)): + ngx-color@10.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) '@ctrl/tinycolor': 4.2.0 material-colors: 1.2.6 tslib: 2.8.1 - ngx-cookie-service@21.1.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)): + ngx-cookie-service@21.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - ngx-device-detector@11.0.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)): + ngx-device-detector@11.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - ngx-ui-tour-core@16.0.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/router@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(rxjs@7.8.2): + ngx-ui-tour-core@16.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(rxjs@7.8.2): dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/router': 21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/router': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) rxjs: 7.8.2 tslib: 2.8.1 - ngx-ui-tour-ng-bootstrap@18.0.0(9f28d3e6eaf246a683609aafac107126): + ngx-ui-tour-ng-bootstrap@18.0.0(f247d97663488c516a027bc34de144d4): dependencies: - '@angular/common': 21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1) - '@ng-bootstrap/ng-bootstrap': 20.0.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.0(@angular/compiler-cli@21.2.0(@angular/compiler@21.2.0)(typescript@5.9.3))(@angular/compiler@21.2.0))(@popperjs/core@2.11.8)(rxjs@7.8.2) - ngx-ui-tour-core: 16.0.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/router@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0(@angular/common@21.2.0(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0(@angular/compiler@21.2.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@ng-bootstrap/ng-bootstrap': 20.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@popperjs/core@2.11.8)(rxjs@7.8.2) + ngx-ui-tour-core: 16.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(rxjs@7.8.2) tslib: 2.8.1 transitivePeerDependencies: - '@angular/router' @@ -12737,7 +12769,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 2.6.1 postcss: 8.5.6 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: webpack: 5.104.1(esbuild@0.27.2) transitivePeerDependencies: @@ -13745,7 +13777,7 @@ snapshots: vite@7.3.0(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0): dependencies: - esbuild: 0.27.2 + esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 From 01abacab52092d0deca1e38c45990e4fef6214df Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 14 Mar 2026 05:09:13 +0000 Subject: [PATCH 007/113] Auto translate strings --- src-ui/messages.xlf | 70 ++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index e7088e90d..919ee388d 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -5,14 +5,14 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/alert/alert.ts 50 Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -20,114 +20,114 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/carousel/carousel.ts 159,162 Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/carousel/carousel.ts 202,203 Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/datepicker/datepicker-navigation-select.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts 91 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/datepicker/datepicker-navigation-select.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts 91 Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/datepicker/datepicker-navigation-select.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts 91 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/datepicker/datepicker-navigation-select.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts 91 Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts 112 Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts 112 «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts 20 « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts 20 » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts 20 »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts 20 First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts 20 Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts 20 Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts 20 Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts 20 @@ -135,105 +135,105 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/progressbar/progressbar.ts 41,42 HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts 21 Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.0_@angular+core@21.2.0_@angular+_fdecb2f5429dfeda6301fd300107de5b/node_modules/src/toast/toast-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/toast/toast-config.ts 54 From 9d69705e268ee49d37abe4658ea741ed0bea016d Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Sat, 14 Mar 2026 12:53:52 -0700 Subject: [PATCH 008/113] Feature: Add progress information to the classifier training for a better ux (#12331) --- src/documents/classifier.py | 18 ++++++++- .../commands/document_create_classifier.py | 27 +++++++++++-- src/documents/tasks.py | 8 +++- src/documents/tests/test_management.py | 38 +++++++++++++++---- 4 files changed, 77 insertions(+), 14 deletions(-) diff --git a/src/documents/classifier.py b/src/documents/classifier.py index 1e9da7ce6..87934ab52 100644 --- a/src/documents/classifier.py +++ b/src/documents/classifier.py @@ -9,6 +9,7 @@ from pathlib import Path from typing import TYPE_CHECKING if TYPE_CHECKING: + from collections.abc import Callable from collections.abc import Iterator from datetime import datetime @@ -191,7 +192,12 @@ class DocumentClassifier: target_file_temp.rename(target_file) - def train(self) -> bool: + def train( + self, + status_callback: Callable[[str], None] | None = None, + ) -> bool: + notify = status_callback if status_callback is not None else lambda _: None + # Get non-inbox documents docs_queryset = ( Document.objects.exclude( @@ -213,6 +219,7 @@ class DocumentClassifier: # Step 1: Extract and preprocess training data from the database. logger.debug("Gathering data from database...") + notify(f"Gathering data from {docs_queryset.count()} document(s)...") hasher = sha256() for doc in docs_queryset: y = -1 @@ -290,6 +297,7 @@ class DocumentClassifier: # Step 2: vectorize data logger.debug("Vectorizing data...") + notify("Vectorizing document content...") def content_generator() -> Iterator[str]: """ @@ -316,6 +324,7 @@ class DocumentClassifier: # Step 3: train the classifiers if num_tags > 0: logger.debug("Training tags classifier...") + notify(f"Training tags classifier ({num_tags} tag(s))...") if num_tags == 1: # Special case where only one tag has auto: @@ -339,6 +348,9 @@ class DocumentClassifier: if num_correspondents > 0: logger.debug("Training correspondent classifier...") + notify( + f"Training correspondent classifier ({num_correspondents} correspondent(s))...", + ) self.correspondent_classifier = MLPClassifier(tol=0.01) self.correspondent_classifier.fit(data_vectorized, labels_correspondent) else: @@ -349,6 +361,9 @@ class DocumentClassifier: if num_document_types > 0: logger.debug("Training document type classifier...") + notify( + f"Training document type classifier ({num_document_types} type(s))...", + ) self.document_type_classifier = MLPClassifier(tol=0.01) self.document_type_classifier.fit(data_vectorized, labels_document_type) else: @@ -361,6 +376,7 @@ class DocumentClassifier: logger.debug( "Training storage paths classifier...", ) + notify(f"Training storage path classifier ({num_storage_paths} path(s))...") self.storage_path_classifier = MLPClassifier(tol=0.01) self.storage_path_classifier.fit( data_vectorized, diff --git a/src/documents/management/commands/document_create_classifier.py b/src/documents/management/commands/document_create_classifier.py index f7903aac7..b662195a7 100644 --- a/src/documents/management/commands/document_create_classifier.py +++ b/src/documents/management/commands/document_create_classifier.py @@ -1,13 +1,32 @@ -from django.core.management.base import BaseCommand +from __future__ import annotations +import time + +from documents.management.commands.base import PaperlessCommand from documents.tasks import train_classifier -class Command(BaseCommand): +class Command(PaperlessCommand): help = ( "Trains the classifier on your data and saves the resulting models to a " "file. The document consumer will then automatically use this new model." ) + supports_progress_bar = False + supports_multiprocessing = False - def handle(self, *args, **options): - train_classifier(scheduled=False) + def handle(self, *args, **options) -> None: + start = time.monotonic() + + with ( + self.buffered_logging("paperless.tasks"), + self.buffered_logging("paperless.classifier"), + ): + train_classifier( + scheduled=False, + status_callback=lambda msg: self.console.print(f" {msg}"), + ) + + elapsed = time.monotonic() - start + self.console.print( + f"[green]✓[/green] Classifier training complete ({elapsed:.1f}s)", + ) diff --git a/src/documents/tasks.py b/src/documents/tasks.py index 86b6b2716..378695731 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -100,7 +100,11 @@ def index_reindex(*, iter_wrapper: IterWrapper[Document] = _identity) -> None: @shared_task -def train_classifier(*, scheduled=True) -> None: +def train_classifier( + *, + scheduled=True, + status_callback: Callable[[str], None] | None = None, +) -> None: task = PaperlessTask.objects.create( type=PaperlessTask.TaskType.SCHEDULED_TASK if scheduled @@ -136,7 +140,7 @@ def train_classifier(*, scheduled=True) -> None: classifier = DocumentClassifier() try: - if classifier.train(): + if classifier.train(status_callback=status_callback): logger.info( f"Saving updated classifier model to {settings.MODEL_FILE}...", ) diff --git a/src/documents/tests/test_management.py b/src/documents/tests/test_management.py index 03959a85b..2a62173b1 100644 --- a/src/documents/tests/test_management.py +++ b/src/documents/tests/test_management.py @@ -1,7 +1,10 @@ +from __future__ import annotations + import filecmp import shutil from io import StringIO from pathlib import Path +from typing import TYPE_CHECKING from unittest import mock import pytest @@ -11,6 +14,9 @@ from django.core.management import call_command from django.test import TestCase from django.test import override_settings +if TYPE_CHECKING: + from pytest_mock import MockerFixture + from documents.file_handling import generate_filename from documents.models import Document from documents.tasks import update_document_content_maybe_archive_file @@ -135,14 +141,32 @@ class TestRenamer(DirectoriesMixin, FileSystemAssertsMixin, TestCase): @pytest.mark.management -class TestCreateClassifier(TestCase): - @mock.patch( - "documents.management.commands.document_create_classifier.train_classifier", - ) - def test_create_classifier(self, m) -> None: - call_command("document_create_classifier") +class TestCreateClassifier: + def test_create_classifier(self, mocker: MockerFixture) -> None: + m = mocker.patch( + "documents.management.commands.document_create_classifier.train_classifier", + ) - m.assert_called_once() + call_command("document_create_classifier", "--skip-checks") + + m.assert_called_once_with(scheduled=False, status_callback=mocker.ANY) + assert callable(m.call_args.kwargs["status_callback"]) + + def test_create_classifier_callback_output(self, mocker: MockerFixture) -> None: + """Callback passed to train_classifier writes each phase message to the console.""" + m = mocker.patch( + "documents.management.commands.document_create_classifier.train_classifier", + ) + + def invoke_callback(**kwargs): + kwargs["status_callback"]("Vectorizing document content...") + + m.side_effect = invoke_callback + + stdout = StringIO() + call_command("document_create_classifier", "--skip-checks", stdout=stdout) + + assert "Vectorizing document content..." in stdout.getvalue() @pytest.mark.management From 06b2d5102c187718fbd0bfc480c766d2bec0bb45 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 15 Mar 2026 17:13:08 -0700 Subject: [PATCH 009/113] Fix GHSA-59xh-5vwx-4c4q --- src/documents/tests/test_api_permissions.py | 72 +++++++++++++++++++++ src/paperless/views.py | 53 +++++++++++++-- 2 files changed, 119 insertions(+), 6 deletions(-) diff --git a/src/documents/tests/test_api_permissions.py b/src/documents/tests/test_api_permissions.py index 31b860745..00a613cff 100644 --- a/src/documents/tests/test_api_permissions.py +++ b/src/documents/tests/test_api_permissions.py @@ -888,6 +888,19 @@ class TestApiUser(DirectoriesMixin, APITestCase): self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + response = self.client.post( + f"{self.ENDPOINT}", + json.dumps( + { + "username": "user4", + "is_superuser": "true", + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.client.force_authenticate(user2) response = self.client.patch( @@ -920,6 +933,65 @@ class TestApiUser(DirectoriesMixin, APITestCase): returned_user1 = User.objects.get(pk=user1.pk) self.assertEqual(returned_user1.is_superuser, False) + def test_only_superusers_can_create_or_alter_staff_status(self): + """ + GIVEN: + - Existing user account + WHEN: + - API request is made to add a user account with staff status + - API request is made to change staff status + THEN: + - Only superusers can change staff status + """ + + user1 = User.objects.create_user(username="user1") + user1.user_permissions.add(*Permission.objects.all()) + user2 = User.objects.create_superuser(username="user2") + + self.client.force_authenticate(user1) + + response = self.client.patch( + f"{self.ENDPOINT}{user1.pk}/", + json.dumps( + { + "is_staff": "true", + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + response = self.client.post( + f"{self.ENDPOINT}", + json.dumps( + { + "username": "user3", + "is_staff": 1, + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + self.client.force_authenticate(user2) + + response = self.client.patch( + f"{self.ENDPOINT}{user1.pk}/", + json.dumps( + { + "is_staff": True, + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + returned_user1 = User.objects.get(pk=user1.pk) + self.assertEqual(returned_user1.is_staff, True) + class TestApiGroup(DirectoriesMixin, APITestCase): ENDPOINT = "/api/groups/" diff --git a/src/paperless/views.py b/src/paperless/views.py index e79c0e668..2a2ee9518 100644 --- a/src/paperless/views.py +++ b/src/paperless/views.py @@ -25,6 +25,8 @@ from drf_spectacular.utils import extend_schema_view from rest_framework.authtoken.models import Token from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.decorators import action +from rest_framework.exceptions import ValidationError +from rest_framework.fields import BooleanField from rest_framework.filters import OrderingFilter from rest_framework.generics import GenericAPIView from rest_framework.pagination import PageNumberPagination @@ -103,6 +105,7 @@ class FaviconView(View): class UserViewSet(ModelViewSet): + _BOOL_NOT_PROVIDED = object() model = User queryset = User.objects.exclude( @@ -116,27 +119,65 @@ class UserViewSet(ModelViewSet): filterset_class = UserFilterSet ordering_fields = ("username",) + @staticmethod + def _parse_requested_bool(data, key: str): + if key not in data: + return UserViewSet._BOOL_NOT_PROVIDED + try: + return BooleanField().to_internal_value(data.get(key)) + except ValidationError: + # Let serializer validation report invalid values as 400 responses + return UserViewSet._BOOL_NOT_PROVIDED + def create(self, request, *args, **kwargs): - if not request.user.is_superuser and request.data.get("is_superuser") is True: - return HttpResponseForbidden( - "Superuser status can only be granted by a superuser", - ) + requested_is_superuser = self._parse_requested_bool( + request.data, + "is_superuser", + ) + requested_is_staff = self._parse_requested_bool(request.data, "is_staff") + + if not request.user.is_superuser: + if requested_is_superuser is True: + return HttpResponseForbidden( + "Superuser status can only be granted by a superuser", + ) + if requested_is_staff is True: + return HttpResponseForbidden( + "Staff status can only be granted by a superuser", + ) + return super().create(request, *args, **kwargs) def update(self, request, *args, **kwargs): user_to_update: User = self.get_object() + if not request.user.is_superuser and user_to_update.is_superuser: return HttpResponseForbidden( "Superusers can only be modified by other superusers", ) + + requested_is_superuser = self._parse_requested_bool( + request.data, + "is_superuser", + ) + requested_is_staff = self._parse_requested_bool(request.data, "is_staff") + if ( not request.user.is_superuser - and request.data.get("is_superuser") is not None - and request.data.get("is_superuser") != user_to_update.is_superuser + and requested_is_superuser is not self._BOOL_NOT_PROVIDED + and requested_is_superuser != user_to_update.is_superuser ): return HttpResponseForbidden( "Superuser status can only be changed by a superuser", ) + if ( + not request.user.is_superuser + and requested_is_staff is not self._BOOL_NOT_PROVIDED + and requested_is_staff != user_to_update.is_staff + ): + return HttpResponseForbidden( + "Staff status can only be changed by a superuser", + ) return super().update(request, *args, **kwargs) @extend_schema( From 5f26c01c6f3bfeb8b94936fc9c2b7e05ed85f4d6 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 15 Mar 2026 17:16:11 -0700 Subject: [PATCH 010/113] Bump version to 2.20.11 --- pyproject.toml | 2 +- src-ui/package.json | 2 +- src-ui/src/environments/environment.prod.ts | 2 +- src/paperless/version.py | 2 +- uv.lock | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6225913be..ae95894c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "paperless-ngx" -version = "2.20.10" +version = "2.20.11" description = "A community-supported supercharged document management system: scan, index and archive all your physical documents" readme = "README.md" requires-python = ">=3.10" diff --git a/src-ui/package.json b/src-ui/package.json index 69eaae1b7..33feeabb9 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -1,6 +1,6 @@ { "name": "paperless-ngx-ui", - "version": "2.20.10", + "version": "2.20.11", "scripts": { "preinstall": "npx only-allow pnpm", "ng": "ng", diff --git a/src-ui/src/environments/environment.prod.ts b/src-ui/src/environments/environment.prod.ts index 28a27911f..bafd0dfab 100644 --- a/src-ui/src/environments/environment.prod.ts +++ b/src-ui/src/environments/environment.prod.ts @@ -6,7 +6,7 @@ export const environment = { apiVersion: '9', // match src/paperless/settings.py appTitle: 'Paperless-ngx', tag: 'prod', - version: '2.20.10', + version: '2.20.11', webSocketHost: window.location.host, webSocketProtocol: window.location.protocol == 'https:' ? 'wss:' : 'ws:', webSocketBaseUrl: base_url.pathname + 'ws/', diff --git a/src/paperless/version.py b/src/paperless/version.py index 3f35bde70..9f9841618 100644 --- a/src/paperless/version.py +++ b/src/paperless/version.py @@ -1,6 +1,6 @@ from typing import Final -__version__: Final[tuple[int, int, int]] = (2, 20, 10) +__version__: Final[tuple[int, int, int]] = (2, 20, 11) # Version string like X.Y.Z __full_version_str__: Final[str] = ".".join(map(str, __version__)) # Version string like X.Y diff --git a/uv.lock b/uv.lock index f468b7f27..3e2b7d5cb 100644 --- a/uv.lock +++ b/uv.lock @@ -1991,7 +1991,7 @@ wheels = [ [[package]] name = "paperless-ngx" -version = "2.20.10" +version = "2.20.11" source = { virtual = "." } dependencies = [ { name = "babel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, From 1e00ad5f30d7012b97ba4952bbb2069e6c3eaf85 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 15 Mar 2026 18:47:18 -0700 Subject: [PATCH 011/113] Documentation: Add v2.20.11 changelog (#12356) * Changelog v2.20.11 - GHA * Update changelog for version 2.20.11 Added security advisory and fixed dropdown list issues. --------- Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com> --- docs/changelog.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 404e6d355..ec2342060 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,29 @@ # Changelog +## paperless-ngx 2.20.11 + +### Security + +- Resolve [GHSA-59xh-5vwx-4c4q](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-59xh-5vwx-4c4q) + +### Bug Fixes + +- Fix: correct dropdown list active color in dark mode [@shamoon](https://github.com/shamoon) ([#12328](https://github.com/paperless-ngx/paperless-ngx/pull/12328)) +- Fixhancement: clear descendant selections in dropdown when parent toggled [@shamoon](https://github.com/shamoon) ([#12326](https://github.com/paperless-ngx/paperless-ngx/pull/12326)) +- Fix: prevent wrapping with larger amounts of tags on small cards, reset moreTags setting to correct count [@shamoon](https://github.com/shamoon) ([#12302](https://github.com/paperless-ngx/paperless-ngx/pull/12302)) +- Fix: prevent stale db filename during workflow actions [@shamoon](https://github.com/shamoon) ([#12289](https://github.com/paperless-ngx/paperless-ngx/pull/12289)) + +### All App Changes + +
+4 changes + +- Fix: correct dropdown list active color in dark mode [@shamoon](https://github.com/shamoon) ([#12328](https://github.com/paperless-ngx/paperless-ngx/pull/12328)) +- Fixhancement: clear descendant selections in dropdown when parent toggled [@shamoon](https://github.com/shamoon) ([#12326](https://github.com/paperless-ngx/paperless-ngx/pull/12326)) +- Fix: prevent wrapping with larger amounts of tags on small cards, reset moreTags setting to correct count [@shamoon](https://github.com/shamoon) ([#12302](https://github.com/paperless-ngx/paperless-ngx/pull/12302)) +- Fix: prevent stale db filename during workflow actions [@shamoon](https://github.com/shamoon) ([#12289](https://github.com/paperless-ngx/paperless-ngx/pull/12289)) +
+ ## paperless-ngx 2.20.10 ### Bug Fixes From 6034f17c871ea5c1ac39ed78d0b1e237931db85a Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 15 Mar 2026 18:51:06 -0700 Subject: [PATCH 012/113] Format changelog --- docs/changelog.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index e791ddf17..569e30e29 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,24 +4,24 @@ ### Security -- Resolve [GHSA-59xh-5vwx-4c4q](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-59xh-5vwx-4c4q) +- Resolve [GHSA-59xh-5vwx-4c4q](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-59xh-5vwx-4c4q) ### Bug Fixes -- Fix: correct dropdown list active color in dark mode [@shamoon](https://github.com/shamoon) ([#12328](https://github.com/paperless-ngx/paperless-ngx/pull/12328)) -- Fixhancement: clear descendant selections in dropdown when parent toggled [@shamoon](https://github.com/shamoon) ([#12326](https://github.com/paperless-ngx/paperless-ngx/pull/12326)) -- Fix: prevent wrapping with larger amounts of tags on small cards, reset moreTags setting to correct count [@shamoon](https://github.com/shamoon) ([#12302](https://github.com/paperless-ngx/paperless-ngx/pull/12302)) -- Fix: prevent stale db filename during workflow actions [@shamoon](https://github.com/shamoon) ([#12289](https://github.com/paperless-ngx/paperless-ngx/pull/12289)) +- Fix: correct dropdown list active color in dark mode [@shamoon](https://github.com/shamoon) ([#12328](https://github.com/paperless-ngx/paperless-ngx/pull/12328)) +- Fixhancement: clear descendant selections in dropdown when parent toggled [@shamoon](https://github.com/shamoon) ([#12326](https://github.com/paperless-ngx/paperless-ngx/pull/12326)) +- Fix: prevent wrapping with larger amounts of tags on small cards, reset moreTags setting to correct count [@shamoon](https://github.com/shamoon) ([#12302](https://github.com/paperless-ngx/paperless-ngx/pull/12302)) +- Fix: prevent stale db filename during workflow actions [@shamoon](https://github.com/shamoon) ([#12289](https://github.com/paperless-ngx/paperless-ngx/pull/12289)) ### All App Changes
4 changes -- Fix: correct dropdown list active color in dark mode [@shamoon](https://github.com/shamoon) ([#12328](https://github.com/paperless-ngx/paperless-ngx/pull/12328)) -- Fixhancement: clear descendant selections in dropdown when parent toggled [@shamoon](https://github.com/shamoon) ([#12326](https://github.com/paperless-ngx/paperless-ngx/pull/12326)) -- Fix: prevent wrapping with larger amounts of tags on small cards, reset moreTags setting to correct count [@shamoon](https://github.com/shamoon) ([#12302](https://github.com/paperless-ngx/paperless-ngx/pull/12302)) -- Fix: prevent stale db filename during workflow actions [@shamoon](https://github.com/shamoon) ([#12289](https://github.com/paperless-ngx/paperless-ngx/pull/12289)) +- Fix: correct dropdown list active color in dark mode [@shamoon](https://github.com/shamoon) ([#12328](https://github.com/paperless-ngx/paperless-ngx/pull/12328)) +- Fixhancement: clear descendant selections in dropdown when parent toggled [@shamoon](https://github.com/shamoon) ([#12326](https://github.com/paperless-ngx/paperless-ngx/pull/12326)) +- Fix: prevent wrapping with larger amounts of tags on small cards, reset moreTags setting to correct count [@shamoon](https://github.com/shamoon) ([#12302](https://github.com/paperless-ngx/paperless-ngx/pull/12302)) +- Fix: prevent stale db filename during workflow actions [@shamoon](https://github.com/shamoon) ([#12289](https://github.com/paperless-ngx/paperless-ngx/pull/12289))
## paperless-ngx 2.20.10 From 6b8ff9763d823f3afb0aa538bd44f23faddef60e Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 01:52:49 +0000 Subject: [PATCH 013/113] Auto translate strings --- src-ui/messages.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 919ee388d..9f2993a4c 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -5736,7 +5736,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 788 + 823 From 2bb4af2be673b746e648817e804661b9a2248173 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 15 Mar 2026 22:52:02 -0700 Subject: [PATCH 014/113] Change: sort custom fields alphabetically by default (#12358) --- src/documents/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/documents/views.py b/src/documents/views.py index a69293ee9..6f9caa987 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -3923,7 +3923,7 @@ class CustomFieldViewSet(PermissionsAwareDocumentCountMixin, ModelViewSet): document_count_through = CustomFieldInstance document_count_source_field = "field_id" - queryset = CustomField.objects.all().order_by("-created") + queryset = CustomField.objects.all().order_by("name") @extend_schema_view( From 866c9fd858f1171c50ba82123896f9f9ef1cdb61 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 15 Mar 2026 23:50:54 -0700 Subject: [PATCH 015/113] Fix: correct merge bulk edit indentation --- src/documents/bulk_edit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/documents/bulk_edit.py b/src/documents/bulk_edit.py index 490dfa629..8dbcdb8a4 100644 --- a/src/documents/bulk_edit.py +++ b/src/documents/bulk_edit.py @@ -576,8 +576,8 @@ def merge( except Exception: restore_archive_serial_numbers(backup) raise - else: - consume_task.delay() + else: + consume_task.delay() return "OK" From 1caa3eb8aac2981ec64ef2dffa0073c531fd6436 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Mon, 16 Mar 2026 08:10:35 -0700 Subject: [PATCH 016/113] Chore: Disables the system checks for management commands in tests and when unnecessary (#12332) --- .../management/commands/document_importer.py | 2 +- .../test_management_sanity_checker.py | 21 ++++- src/documents/tests/test_api_schema.py | 7 +- src/documents/tests/test_management.py | 16 ++-- .../tests/test_management_exporter.py | 72 ++++++++++++++---- src/documents/tests/test_management_fuzzy.py | 1 + .../tests/test_management_importer.py | 20 ++++- .../tests/test_management_retagger.py | 76 +++++++++++++++---- .../tests/test_management_superuser.py | 1 + .../tests/test_management_thumbnails.py | 11 ++- src/paperless_mail/tests/test_mail.py | 2 +- 11 files changed, 179 insertions(+), 50 deletions(-) diff --git a/src/documents/management/commands/document_importer.py b/src/documents/management/commands/document_importer.py index 20d50e41b..c0056c062 100644 --- a/src/documents/management/commands/document_importer.py +++ b/src/documents/management/commands/document_importer.py @@ -205,7 +205,7 @@ class Command(CryptMixin, PaperlessCommand): ContentType.objects.all().delete() Permission.objects.all().delete() for manifest_path in self.manifest_paths: - call_command("loaddata", manifest_path) + call_command("loaddata", manifest_path, skip_checks=True) except (FieldDoesNotExist, DeserializationError, IntegrityError) as e: self.stdout.write(self.style.ERROR("Database import failed")) if ( diff --git a/src/documents/tests/management/test_management_sanity_checker.py b/src/documents/tests/management/test_management_sanity_checker.py index 64f21e966..f0752ef10 100644 --- a/src/documents/tests/management/test_management_sanity_checker.py +++ b/src/documents/tests/management/test_management_sanity_checker.py @@ -163,13 +163,23 @@ class TestRenderResultsSummary: class TestDocumentSanityCheckerCommand: def test_no_issues(self, sample_doc: Document) -> None: out = StringIO() - call_command("document_sanity_checker", "--no-progress-bar", stdout=out) + call_command( + "document_sanity_checker", + "--no-progress-bar", + stdout=out, + skip_checks=True, + ) assert "No issues detected" in out.getvalue() def test_missing_original(self, sample_doc: Document) -> None: Path(sample_doc.source_path).unlink() out = StringIO() - call_command("document_sanity_checker", "--no-progress-bar", stdout=out) + call_command( + "document_sanity_checker", + "--no-progress-bar", + stdout=out, + skip_checks=True, + ) output = out.getvalue() assert "ERROR" in output assert "Original of document does not exist" in output @@ -187,7 +197,12 @@ class TestDocumentSanityCheckerCommand: Path(doc.thumbnail_path).touch() out = StringIO() - call_command("document_sanity_checker", "--no-progress-bar", stdout=out) + call_command( + "document_sanity_checker", + "--no-progress-bar", + stdout=out, + skip_checks=True, + ) output = out.getvalue() assert "ERROR" in output assert "Checksum mismatch. Stored: abc, actual:" in output diff --git a/src/documents/tests/test_api_schema.py b/src/documents/tests/test_api_schema.py index e14762f68..d8b023e6a 100644 --- a/src/documents/tests/test_api_schema.py +++ b/src/documents/tests/test_api_schema.py @@ -12,7 +12,12 @@ class TestApiSchema(APITestCase): Test that the schema is valid """ try: - call_command("spectacular", "--validate", "--fail-on-warn") + call_command( + "spectacular", + "--validate", + "--fail-on-warn", + skip_checks=True, + ) except CommandError as e: self.fail(f"Schema validation failed: {e}") diff --git a/src/documents/tests/test_management.py b/src/documents/tests/test_management.py index 2a62173b1..7719d21dd 100644 --- a/src/documents/tests/test_management.py +++ b/src/documents/tests/test_management.py @@ -41,7 +41,7 @@ class TestArchiver(DirectoriesMixin, FileSystemAssertsMixin, TestCase): doc = self.make_models() shutil.copy(sample_file, Path(self.dirs.originals_dir) / f"{doc.id:07}.pdf") - call_command("document_archiver", "--processes", "1") + call_command("document_archiver", "--processes", "1", skip_checks=True) def test_handle_document(self) -> None: doc = self.make_models() @@ -106,12 +106,12 @@ class TestArchiver(DirectoriesMixin, FileSystemAssertsMixin, TestCase): class TestMakeIndex(TestCase): @mock.patch("documents.management.commands.document_index.index_reindex") def test_reindex(self, m) -> None: - call_command("document_index", "reindex") + call_command("document_index", "reindex", skip_checks=True) m.assert_called_once() @mock.patch("documents.management.commands.document_index.index_optimize") def test_optimize(self, m) -> None: - call_command("document_index", "optimize") + call_command("document_index", "optimize", skip_checks=True) m.assert_called_once() @@ -128,7 +128,7 @@ class TestRenamer(DirectoriesMixin, FileSystemAssertsMixin, TestCase): Path(doc.archive_path).touch() with override_settings(FILENAME_FORMAT="{correspondent}/{title}"): - call_command("document_renamer") + call_command("document_renamer", skip_checks=True) doc2 = Document.objects.get(id=doc.id) @@ -147,7 +147,7 @@ class TestCreateClassifier: "documents.management.commands.document_create_classifier.train_classifier", ) - call_command("document_create_classifier", "--skip-checks") + call_command("document_create_classifier", skip_checks=True) m.assert_called_once_with(scheduled=False, status_callback=mocker.ANY) assert callable(m.call_args.kwargs["status_callback"]) @@ -164,7 +164,7 @@ class TestCreateClassifier: m.side_effect = invoke_callback stdout = StringIO() - call_command("document_create_classifier", "--skip-checks", stdout=stdout) + call_command("document_create_classifier", skip_checks=True, stdout=stdout) assert "Vectorizing document content..." in stdout.getvalue() @@ -176,7 +176,7 @@ class TestConvertMariaDBUUID(TestCase): m.alter_field.return_value = None stdout = StringIO() - call_command("convert_mariadb_uuid", stdout=stdout) + call_command("convert_mariadb_uuid", stdout=stdout, skip_checks=True) m.assert_called_once() @@ -191,6 +191,6 @@ class TestPruneAuditLogs(TestCase): object_id=1, action=LogEntry.Action.CREATE, ) - call_command("prune_audit_logs") + call_command("prune_audit_logs", skip_checks=True) self.assertEqual(LogEntry.objects.count(), 0) diff --git a/src/documents/tests/test_management_exporter.py b/src/documents/tests/test_management_exporter.py index 6cd8cd729..9307bab45 100644 --- a/src/documents/tests/test_management_exporter.py +++ b/src/documents/tests/test_management_exporter.py @@ -180,7 +180,7 @@ class TestExportImport( if data_only: args += ["--data-only"] - call_command(*args) + call_command(*args, skip_checks=True) with (self.target / "manifest.json").open() as f: manifest = json.load(f) @@ -272,7 +272,12 @@ class TestExportImport( GroupObjectPermission.objects.all().delete() self.assertEqual(Document.objects.count(), 0) - call_command("document_importer", "--no-progress-bar", self.target) + call_command( + "document_importer", + "--no-progress-bar", + self.target, + skip_checks=True, + ) self.assertEqual(Document.objects.count(), 4) self.assertEqual(Tag.objects.count(), 1) self.assertEqual(Correspondent.objects.count(), 1) @@ -438,7 +443,8 @@ class TestExportImport( filename="0000010.pdf", mime_type="application/pdf", ) - self.assertRaises(FileNotFoundError, call_command, "document_exporter", target) + with self.assertRaises(FileNotFoundError): + call_command("document_exporter", target, skip_checks=True) def test_export_zipped(self) -> None: """ @@ -458,7 +464,7 @@ class TestExportImport( args = ["document_exporter", self.target, "--zip"] - call_command(*args) + call_command(*args, skip_checks=True) expected_file = str( self.target / f"export-{timezone.localdate().isoformat()}.zip", @@ -493,7 +499,7 @@ class TestExportImport( with override_settings( FILENAME_FORMAT="{created_year}/{correspondent}/{title}", ): - call_command(*args) + call_command(*args, skip_checks=True) expected_file = str( self.target / f"export-{timezone.localdate().isoformat()}.zip", @@ -538,7 +544,7 @@ class TestExportImport( args = ["document_exporter", self.target, "--zip", "--delete"] - call_command(*args) + call_command(*args, skip_checks=True) expected_file = str( self.target / f"export-{timezone.localdate().isoformat()}.zip", @@ -565,7 +571,7 @@ class TestExportImport( args = ["document_exporter", "/tmp/foo/bar"] with self.assertRaises(CommandError) as e: - call_command(*args) + call_command(*args, skip_checks=True) self.assertEqual("That path doesn't exist", str(e.exception)) @@ -583,7 +589,7 @@ class TestExportImport( args = ["document_exporter", tmp_file.name] with self.assertRaises(CommandError) as e: - call_command(*args) + call_command(*args, skip_checks=True) self.assertEqual("That path isn't a directory", str(e.exception)) @@ -602,7 +608,7 @@ class TestExportImport( args = ["document_exporter", tmp_dir] with self.assertRaises(CommandError) as e: - call_command(*args) + call_command(*args, skip_checks=True) self.assertEqual( "That path doesn't appear to be writable", @@ -647,7 +653,12 @@ class TestExportImport( self.assertEqual(Document.objects.count(), 4) Document.objects.all().delete() self.assertEqual(Document.objects.count(), 0) - call_command("document_importer", "--no-progress-bar", self.target) + call_command( + "document_importer", + "--no-progress-bar", + self.target, + skip_checks=True, + ) self.assertEqual(Document.objects.count(), 4) def test_no_thumbnail(self) -> None: @@ -690,7 +701,12 @@ class TestExportImport( self.assertEqual(Document.objects.count(), 4) Document.objects.all().delete() self.assertEqual(Document.objects.count(), 0) - call_command("document_importer", "--no-progress-bar", self.target) + call_command( + "document_importer", + "--no-progress-bar", + self.target, + skip_checks=True, + ) self.assertEqual(Document.objects.count(), 4) def test_split_manifest(self) -> None: @@ -721,7 +737,12 @@ class TestExportImport( Document.objects.all().delete() CustomFieldInstance.objects.all().delete() self.assertEqual(Document.objects.count(), 0) - call_command("document_importer", "--no-progress-bar", self.target) + call_command( + "document_importer", + "--no-progress-bar", + self.target, + skip_checks=True, + ) self.assertEqual(Document.objects.count(), 4) self.assertEqual(CustomFieldInstance.objects.count(), 1) @@ -746,7 +767,12 @@ class TestExportImport( self.assertEqual(Document.objects.count(), 4) Document.objects.all().delete() self.assertEqual(Document.objects.count(), 0) - call_command("document_importer", "--no-progress-bar", self.target) + call_command( + "document_importer", + "--no-progress-bar", + self.target, + skip_checks=True, + ) self.assertEqual(Document.objects.count(), 4) def test_folder_prefix_with_split(self) -> None: @@ -771,7 +797,12 @@ class TestExportImport( self.assertEqual(Document.objects.count(), 4) Document.objects.all().delete() self.assertEqual(Document.objects.count(), 0) - call_command("document_importer", "--no-progress-bar", self.target) + call_command( + "document_importer", + "--no-progress-bar", + self.target, + skip_checks=True, + ) self.assertEqual(Document.objects.count(), 4) def test_import_db_transaction_failed(self) -> None: @@ -813,7 +844,12 @@ class TestExportImport( self.user = User.objects.create(username="temp_admin") with self.assertRaises(IntegrityError): - call_command("document_importer", "--no-progress-bar", self.target) + call_command( + "document_importer", + "--no-progress-bar", + self.target, + skip_checks=True, + ) self.assertEqual(ContentType.objects.count(), num_content_type_objects) self.assertEqual(Permission.objects.count(), num_permission_objects + 1) @@ -864,6 +900,7 @@ class TestExportImport( "--no-progress-bar", "--data-only", self.target, + skip_checks=True, ) self.assertEqual(Document.objects.all().count(), 4) @@ -923,6 +960,7 @@ class TestCryptExportImport( "--passphrase", "securepassword", self.target, + skip_checks=True, ) self.assertIsFile(self.target / "metadata.json") @@ -948,6 +986,7 @@ class TestCryptExportImport( "--passphrase", "securepassword", self.target, + skip_checks=True, ) account = MailAccount.objects.first() @@ -976,6 +1015,7 @@ class TestCryptExportImport( "--passphrase", "securepassword", self.target, + skip_checks=True, ) with self.assertRaises(CommandError) as err: @@ -983,6 +1023,7 @@ class TestCryptExportImport( "document_importer", "--no-progress-bar", self.target, + skip_checks=True, ) self.assertEqual( err.msg, @@ -1014,6 +1055,7 @@ class TestCryptExportImport( "--no-progress-bar", str(self.target), stdout=stdout, + skip_checks=True, ) stdout.seek(0) self.assertIn( diff --git a/src/documents/tests/test_management_fuzzy.py b/src/documents/tests/test_management_fuzzy.py index 195a3450d..7c4acabec 100644 --- a/src/documents/tests/test_management_fuzzy.py +++ b/src/documents/tests/test_management_fuzzy.py @@ -21,6 +21,7 @@ class TestFuzzyMatchCommand(TestCase): *args, stdout=stdout, stderr=stderr, + skip_checks=True, **kwargs, ) return stdout.getvalue(), stderr.getvalue() diff --git a/src/documents/tests/test_management_importer.py b/src/documents/tests/test_management_importer.py index 137b4004b..ef20cf895 100644 --- a/src/documents/tests/test_management_importer.py +++ b/src/documents/tests/test_management_importer.py @@ -41,6 +41,7 @@ class TestCommandImport( "document_importer", "--no-progress-bar", str(self.dirs.scratch_dir), + skip_checks=True, ) self.assertIn( "That directory doesn't appear to contain a manifest.json file.", @@ -67,6 +68,7 @@ class TestCommandImport( "document_importer", "--no-progress-bar", str(self.dirs.scratch_dir), + skip_checks=True, ) self.assertIn( "The manifest file contains a record which does not refer to an actual document file.", @@ -96,6 +98,7 @@ class TestCommandImport( "document_importer", "--no-progress-bar", str(self.dirs.scratch_dir), + skip_checks=True, ) self.assertIn('The manifest file refers to "noexist.pdf"', str(e.exception)) @@ -157,7 +160,7 @@ class TestCommandImport( - CommandError is raised indicating the issue """ with self.assertRaises(CommandError) as cm: - call_command("document_importer", Path("/tmp/notapath")) + call_command("document_importer", Path("/tmp/notapath"), skip_checks=True) self.assertIn("That path doesn't exist", str(cm.exception)) def test_import_source_not_readable(self) -> None: @@ -173,7 +176,7 @@ class TestCommandImport( path = Path(temp_dir) path.chmod(0o222) with self.assertRaises(CommandError) as cm: - call_command("document_importer", path) + call_command("document_importer", path, skip_checks=True) self.assertIn( "That path doesn't appear to be readable", str(cm.exception), @@ -193,7 +196,12 @@ class TestCommandImport( self.assertIsNotFile(path) with self.assertRaises(CommandError) as e: - call_command("document_importer", "--no-progress-bar", str(path)) + call_command( + "document_importer", + "--no-progress-bar", + str(path), + skip_checks=True, + ) self.assertIn("That path doesn't exist", str(e.exception)) def test_import_files_exist(self) -> None: @@ -218,6 +226,7 @@ class TestCommandImport( "--no-progress-bar", str(self.dirs.scratch_dir), stdout=stdout, + skip_checks=True, ) stdout.seek(0) self.assertIn( @@ -246,6 +255,7 @@ class TestCommandImport( "--no-progress-bar", str(self.dirs.scratch_dir), stdout=stdout, + skip_checks=True, ) stdout.seek(0) self.assertIn( @@ -282,6 +292,7 @@ class TestCommandImport( "--no-progress-bar", str(self.dirs.scratch_dir), stdout=stdout, + skip_checks=True, ) stdout.seek(0) self.assertIn( @@ -309,6 +320,7 @@ class TestCommandImport( "--no-progress-bar", str(self.dirs.scratch_dir), stdout=stdout, + skip_checks=True, ) stdout.seek(0) stdout_str = str(stdout.read()) @@ -338,6 +350,7 @@ class TestCommandImport( "--no-progress-bar", str(self.dirs.scratch_dir), stdout=stdout, + skip_checks=True, ) stdout.seek(0) stdout_str = str(stdout.read()) @@ -377,6 +390,7 @@ class TestCommandImport( "--no-progress-bar", str(zip_path), stdout=stdout, + skip_checks=True, ) stdout.seek(0) stdout_str = str(stdout.read()) diff --git a/src/documents/tests/test_management_retagger.py b/src/documents/tests/test_management_retagger.py index 3f669c00e..605068038 100644 --- a/src/documents/tests/test_management_retagger.py +++ b/src/documents/tests/test_management_retagger.py @@ -139,7 +139,7 @@ class TestRetaggerTags(DirectoriesMixin): @pytest.mark.usefixtures("documents") def test_add_tags(self, tags: TagTuple) -> None: tag_first, tag_second, *_ = tags - call_command("document_retagger", "--tags") + call_command("document_retagger", "--tags", skip_checks=True) d_first, d_second, d_unrelated, d_auto = _get_docs() assert d_first.tags.count() == 1 @@ -158,7 +158,7 @@ class TestRetaggerTags(DirectoriesMixin): tag_first, tag_second, tag_inbox, tag_no_match, _ = tags d1.tags.add(tag_second) - call_command("document_retagger", "--tags", "--overwrite") + call_command("document_retagger", "--tags", "--overwrite", skip_checks=True) d_first, d_second, d_unrelated, d_auto = _get_docs() @@ -180,7 +180,13 @@ class TestRetaggerTags(DirectoriesMixin): ], ) def test_suggest_does_not_apply_tags(self, extra_args: list[str]) -> None: - call_command("document_retagger", "--tags", "--suggest", *extra_args) + call_command( + "document_retagger", + "--tags", + "--suggest", + *extra_args, + skip_checks=True, + ) d_first, d_second, _, d_auto = _get_docs() assert d_first.tags.count() == 0 @@ -199,7 +205,7 @@ class TestRetaggerDocumentType(DirectoriesMixin): @pytest.mark.usefixtures("documents") def test_add_type(self, document_types: DocumentTypeTuple) -> None: dt_first, dt_second = document_types - call_command("document_retagger", "--document_type") + call_command("document_retagger", "--document_type", skip_checks=True) d_first, d_second, _, _ = _get_docs() assert d_first.document_type == dt_first @@ -214,7 +220,13 @@ class TestRetaggerDocumentType(DirectoriesMixin): ], ) def test_suggest_does_not_apply_document_type(self, extra_args: list[str]) -> None: - call_command("document_retagger", "--document_type", "--suggest", *extra_args) + call_command( + "document_retagger", + "--document_type", + "--suggest", + *extra_args, + skip_checks=True, + ) d_first, d_second, _, _ = _get_docs() assert d_first.document_type is None @@ -243,7 +255,12 @@ class TestRetaggerDocumentType(DirectoriesMixin): ) doc = DocumentFactory(content="ambiguous content") - call_command("document_retagger", "--document_type", *use_first_flag) + call_command( + "document_retagger", + "--document_type", + *use_first_flag, + skip_checks=True, + ) doc.refresh_from_db() assert (doc.document_type is not None) is expects_assignment @@ -260,7 +277,7 @@ class TestRetaggerCorrespondent(DirectoriesMixin): @pytest.mark.usefixtures("documents") def test_add_correspondent(self, correspondents: CorrespondentTuple) -> None: c_first, c_second = correspondents - call_command("document_retagger", "--correspondent") + call_command("document_retagger", "--correspondent", skip_checks=True) d_first, d_second, _, _ = _get_docs() assert d_first.correspondent == c_first @@ -275,7 +292,13 @@ class TestRetaggerCorrespondent(DirectoriesMixin): ], ) def test_suggest_does_not_apply_correspondent(self, extra_args: list[str]) -> None: - call_command("document_retagger", "--correspondent", "--suggest", *extra_args) + call_command( + "document_retagger", + "--correspondent", + "--suggest", + *extra_args, + skip_checks=True, + ) d_first, d_second, _, _ = _get_docs() assert d_first.correspondent is None @@ -304,7 +327,12 @@ class TestRetaggerCorrespondent(DirectoriesMixin): ) doc = DocumentFactory(content="ambiguous content") - call_command("document_retagger", "--correspondent", *use_first_flag) + call_command( + "document_retagger", + "--correspondent", + *use_first_flag, + skip_checks=True, + ) doc.refresh_from_db() assert (doc.correspondent is not None) is expects_assignment @@ -326,7 +354,7 @@ class TestRetaggerStoragePath(DirectoriesMixin): THEN matching documents get the correct path; existing path is unchanged """ sp1, sp2, sp3 = storage_paths - call_command("document_retagger", "--storage_path") + call_command("document_retagger", "--storage_path", skip_checks=True) d_first, d_second, d_unrelated, d_auto = _get_docs() assert d_first.storage_path == sp2 @@ -342,7 +370,12 @@ class TestRetaggerStoragePath(DirectoriesMixin): THEN the existing path is replaced by the newly matched path """ sp1, sp2, _ = storage_paths - call_command("document_retagger", "--storage_path", "--overwrite") + call_command( + "document_retagger", + "--storage_path", + "--overwrite", + skip_checks=True, + ) d_first, d_second, d_unrelated, d_auto = _get_docs() assert d_first.storage_path == sp2 @@ -373,7 +406,12 @@ class TestRetaggerStoragePath(DirectoriesMixin): ) doc = DocumentFactory(content="ambiguous content") - call_command("document_retagger", "--storage_path", *use_first_flag) + call_command( + "document_retagger", + "--storage_path", + *use_first_flag, + skip_checks=True, + ) doc.refresh_from_db() assert (doc.storage_path is not None) is expects_assignment @@ -402,7 +440,13 @@ class TestRetaggerIdRange(DirectoriesMixin): expected_count: int, ) -> None: DocumentFactory(content="NOT the first document") - call_command("document_retagger", "--tags", "--id-range", *id_range_args) + call_command( + "document_retagger", + "--tags", + "--id-range", + *id_range_args, + skip_checks=True, + ) tag_first, *_ = tags assert Document.objects.filter(tags__id=tag_first.id).count() == expected_count @@ -416,7 +460,7 @@ class TestRetaggerIdRange(DirectoriesMixin): ) def test_id_range_invalid_arguments_raise(self, args: list[str]) -> None: with pytest.raises((CommandError, SystemExit)): - call_command("document_retagger", *args) + call_command("document_retagger", *args, skip_checks=True) # --------------------------------------------------------------------------- @@ -430,12 +474,12 @@ class TestRetaggerEdgeCases(DirectoriesMixin): @pytest.mark.usefixtures("documents") def test_no_targets_exits_cleanly(self) -> None: """Calling the retagger with no classifier targets should not raise.""" - call_command("document_retagger") + call_command("document_retagger", skip_checks=True) @pytest.mark.usefixtures("documents") def test_inbox_only_skips_non_inbox_documents(self) -> None: """--inbox-only must restrict processing to documents with an inbox tag.""" - call_command("document_retagger", "--tags", "--inbox-only") + call_command("document_retagger", "--tags", "--inbox-only", skip_checks=True) d_first, _, d_unrelated, _ = _get_docs() assert d_first.tags.count() == 0 diff --git a/src/documents/tests/test_management_superuser.py b/src/documents/tests/test_management_superuser.py index 0a6bcb8cd..f2741ba53 100644 --- a/src/documents/tests/test_management_superuser.py +++ b/src/documents/tests/test_management_superuser.py @@ -20,6 +20,7 @@ class TestManageSuperUser(DirectoriesMixin, TestCase): "--no-color", stdout=out, stderr=StringIO(), + skip_checks=True, ) return out.getvalue() diff --git a/src/documents/tests/test_management_thumbnails.py b/src/documents/tests/test_management_thumbnails.py index 160cb4419..0b016f0cd 100644 --- a/src/documents/tests/test_management_thumbnails.py +++ b/src/documents/tests/test_management_thumbnails.py @@ -85,13 +85,20 @@ class TestMakeThumbnails(DirectoriesMixin, FileSystemAssertsMixin, TestCase): def test_command(self) -> None: self.assertIsNotFile(self.d1.thumbnail_path) self.assertIsNotFile(self.d2.thumbnail_path) - call_command("document_thumbnails", "--processes", "1") + call_command("document_thumbnails", "--processes", "1", skip_checks=True) self.assertIsFile(self.d1.thumbnail_path) self.assertIsFile(self.d2.thumbnail_path) def test_command_documentid(self) -> None: self.assertIsNotFile(self.d1.thumbnail_path) self.assertIsNotFile(self.d2.thumbnail_path) - call_command("document_thumbnails", "--processes", "1", "-d", f"{self.d1.id}") + call_command( + "document_thumbnails", + "--processes", + "1", + "-d", + f"{self.d1.id}", + skip_checks=True, + ) self.assertIsFile(self.d1.thumbnail_path) self.assertIsNotFile(self.d2.thumbnail_path) diff --git a/src/paperless_mail/tests/test_mail.py b/src/paperless_mail/tests/test_mail.py index 162a764f2..72ee5331a 100644 --- a/src/paperless_mail/tests/test_mail.py +++ b/src/paperless_mail/tests/test_mail.py @@ -1665,7 +1665,7 @@ class TestManagementCommand(TestCase): "paperless_mail.management.commands.mail_fetcher.tasks.process_mail_accounts", ) def test_mail_fetcher(self, m) -> None: - call_command("mail_fetcher") + call_command("mail_fetcher", skip_checks=True) m.assert_called_once() From 58ebcc21be64102e18fbb56862526192896e88f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 09:57:23 -0700 Subject: [PATCH 017/113] Chore(deps): Bump pyjwt from 2.10.1 to 2.12.0 (#12335) Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.10.1 to 2.12.0. - [Release notes](https://github.com/jpadilla/pyjwt/releases) - [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst) - [Commits](https://github.com/jpadilla/pyjwt/compare/2.10.1...2.12.0) --- updated-dependencies: - dependency-name: pyjwt dependency-version: 2.12.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 9d66db770..ef15b0e23 100644 --- a/uv.lock +++ b/uv.lock @@ -3683,11 +3683,11 @@ wheels = [ [[package]] name = "pyjwt" -version = "2.10.1" +version = "2.12.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/10/e8192be5f38f3e8e7e046716de4cae33d56fd5ae08927a823bb916be36c1/pyjwt-2.12.0.tar.gz", hash = "sha256:2f62390b667cd8257de560b850bb5a883102a388829274147f1d724453f8fb02", size = 102511, upload-time = "2026-03-12T17:15:30.831Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/15/70/70f895f404d363d291dcf62c12c85fdd47619ad9674ac0f53364d035925a/pyjwt-2.12.0-py3-none-any.whl", hash = "sha256:9bb459d1bdd0387967d287f5656bf7ec2b9a26645d1961628cda1764e087fd6e", size = 29700, upload-time = "2026-03-12T17:15:29.257Z" }, ] [package.optional-dependencies] From 54679a093ad0fafcb73b84dd18b31482efd29a20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 10:36:00 -0700 Subject: [PATCH 018/113] Chore(deps): Bump pyopenssl from 25.3.0 to 26.0.0 (#12363) Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 25.3.0 to 26.0.0. - [Changelog](https://github.com/pyca/pyopenssl/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/pyopenssl/compare/25.3.0...26.0.0) --- updated-dependencies: - dependency-name: pyopenssl dependency-version: 26.0.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index ef15b0e23..d7a56fe5a 100644 --- a/uv.lock +++ b/uv.lock @@ -3710,15 +3710,15 @@ wheels = [ [[package]] name = "pyopenssl" -version = "25.3.0" +version = "26.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/80/be/97b83a464498a79103036bc74d1038df4a7ef0e402cfaf4d5e113fb14759/pyopenssl-25.3.0.tar.gz", hash = "sha256:c981cb0a3fd84e8602d7afc209522773b94c1c2446a3c710a75b06fe1beae329", size = 184073, upload-time = "2025-09-17T00:32:21.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/11/a62e1d33b373da2b2c2cd9eb508147871c80f12b1cacde3c5d314922afdd/pyopenssl-26.0.0.tar.gz", hash = "sha256:f293934e52936f2e3413b89c6ce36df66a0b34ae1ea3a053b8c5020ff2f513fc", size = 185534, upload-time = "2026-03-15T14:28:26.353Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/81/ef2b1dfd1862567d573a4fdbc9f969067621764fbb74338496840a1d2977/pyopenssl-25.3.0-py3-none-any.whl", hash = "sha256:1fda6fc034d5e3d179d39e59c1895c9faeaf40a79de5fc4cbbfbe0d36f4a77b6", size = 57268, upload-time = "2025-09-17T00:32:19.474Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7d/d4f7d908fa8415571771b30669251d57c3cf313b36a856e6d7548ae01619/pyopenssl-26.0.0-py3-none-any.whl", hash = "sha256:df94d28498848b98cc1c0ffb8ef1e71e40210d3b0a8064c9d29571ed2904bf81", size = 57969, upload-time = "2026-03-15T14:28:24.864Z" }, ] [[package]] From 470018c0118183962aaa8fd01f923a6bfab68a8a Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Mon, 16 Mar 2026 13:12:17 -0700 Subject: [PATCH 019/113] Chore: Mocks the celery and Redis pings so we don't wait for their timeout each time (#12354) --- src/documents/tests/test_api_status.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/documents/tests/test_api_status.py b/src/documents/tests/test_api_status.py index d2a092726..409f4bd7f 100644 --- a/src/documents/tests/test_api_status.py +++ b/src/documents/tests/test_api_status.py @@ -26,6 +26,23 @@ class TestSystemStatus(APITestCase): self.override = override_settings(MEDIA_ROOT=self.tmp_dir) self.override.enable() + # Mock slow network calls so tests don't block on real Redis/Celery timeouts. + # Individual tests that care about specific behaviour override these with + # their own @mock.patch decorators (which take precedence). + redis_patcher = mock.patch( + "redis.Redis.execute_command", + side_effect=Exception("Redis not available"), + ) + self.mock_redis = redis_patcher.start() + self.addCleanup(redis_patcher.stop) + + celery_patcher = mock.patch( + "celery.app.control.Inspect.ping", + side_effect=Exception("Celery not available"), + ) + self.mock_celery_ping = celery_patcher.start() + self.addCleanup(celery_patcher.stop) + def tearDown(self) -> None: super().tearDown() From 7942edfdf4fd4cf5e0f3df96725cdf795e389a31 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:07:12 -0700 Subject: [PATCH 020/113] Fixhancement: only offer basic auth for appropriate requests (#12362) --- .../auth-expiry.interceptor.spec.ts | 154 ++++++++++++++++++ .../interceptors/auth-expiry.interceptor.ts | 38 +++++ src-ui/src/main.ts | 6 + src/documents/tests/test_api_status.py | 7 + src/paperless/auth.py | 8 + 5 files changed, 213 insertions(+) create mode 100644 src-ui/src/app/interceptors/auth-expiry.interceptor.spec.ts create mode 100644 src-ui/src/app/interceptors/auth-expiry.interceptor.ts diff --git a/src-ui/src/app/interceptors/auth-expiry.interceptor.spec.ts b/src-ui/src/app/interceptors/auth-expiry.interceptor.spec.ts new file mode 100644 index 000000000..9bc22ca15 --- /dev/null +++ b/src-ui/src/app/interceptors/auth-expiry.interceptor.spec.ts @@ -0,0 +1,154 @@ +import { HttpErrorResponse, HttpRequest } from '@angular/common/http' +import { TestBed } from '@angular/core/testing' +import { throwError } from 'rxjs' +import * as navUtils from '../utils/navigation' +import { AuthExpiryInterceptor } from './auth-expiry.interceptor' + +describe('AuthExpiryInterceptor', () => { + let interceptor: AuthExpiryInterceptor + let dateNowSpy: jest.SpiedFunction + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [AuthExpiryInterceptor], + }) + + interceptor = TestBed.inject(AuthExpiryInterceptor) + dateNowSpy = jest.spyOn(Date, 'now').mockReturnValue(1000) + }) + + afterEach(() => { + jest.restoreAllMocks() + }) + + it('reloads when an API request returns 401', () => { + const reloadSpy = jest + .spyOn(navUtils, 'locationReload') + .mockImplementation(() => {}) + + interceptor + .intercept(new HttpRequest('GET', '/api/documents/'), { + handle: (_request) => + throwError( + () => + new HttpErrorResponse({ + status: 401, + url: '/api/documents/', + }) + ), + }) + .subscribe({ + error: () => undefined, + }) + + expect(reloadSpy).toHaveBeenCalledTimes(1) + }) + + it('does not reload for non-401 errors', () => { + const reloadSpy = jest + .spyOn(navUtils, 'locationReload') + .mockImplementation(() => {}) + + interceptor + .intercept(new HttpRequest('GET', '/api/documents/'), { + handle: (_request) => + throwError( + () => + new HttpErrorResponse({ + status: 500, + url: '/api/documents/', + }) + ), + }) + .subscribe({ + error: () => undefined, + }) + + expect(reloadSpy).not.toHaveBeenCalled() + }) + + it('does not reload for non-api 401 responses', () => { + const reloadSpy = jest + .spyOn(navUtils, 'locationReload') + .mockImplementation(() => {}) + + interceptor + .intercept(new HttpRequest('GET', '/accounts/profile/'), { + handle: (_request) => + throwError( + () => + new HttpErrorResponse({ + status: 401, + url: '/accounts/profile/', + }) + ), + }) + .subscribe({ + error: () => undefined, + }) + + expect(reloadSpy).not.toHaveBeenCalled() + }) + + it('reloads only once even with multiple API 401 responses', () => { + const reloadSpy = jest + .spyOn(navUtils, 'locationReload') + .mockImplementation(() => {}) + + const request = new HttpRequest('GET', '/api/documents/') + const handler = { + handle: (_request) => + throwError( + () => + new HttpErrorResponse({ + status: 401, + url: '/api/documents/', + }) + ), + } + + interceptor.intercept(request, handler).subscribe({ + error: () => undefined, + }) + interceptor.intercept(request, handler).subscribe({ + error: () => undefined, + }) + + expect(reloadSpy).toHaveBeenCalledTimes(1) + }) + + it('retries reload after cooldown for repeated API 401 responses', () => { + const reloadSpy = jest + .spyOn(navUtils, 'locationReload') + .mockImplementation(() => {}) + + dateNowSpy + .mockReturnValueOnce(1000) + .mockReturnValueOnce(2500) + .mockReturnValueOnce(3501) + + const request = new HttpRequest('GET', '/api/documents/') + const handler = { + handle: (_request) => + throwError( + () => + new HttpErrorResponse({ + status: 401, + url: '/api/documents/', + }) + ), + } + + interceptor.intercept(request, handler).subscribe({ + error: () => undefined, + }) + interceptor.intercept(request, handler).subscribe({ + error: () => undefined, + }) + interceptor.intercept(request, handler).subscribe({ + error: () => undefined, + }) + + expect(reloadSpy).toHaveBeenCalledTimes(2) + }) +}) diff --git a/src-ui/src/app/interceptors/auth-expiry.interceptor.ts b/src-ui/src/app/interceptors/auth-expiry.interceptor.ts new file mode 100644 index 000000000..3be9cc6e0 --- /dev/null +++ b/src-ui/src/app/interceptors/auth-expiry.interceptor.ts @@ -0,0 +1,38 @@ +import { + HttpErrorResponse, + HttpEvent, + HttpHandler, + HttpInterceptor, + HttpRequest, +} from '@angular/common/http' +import { Injectable } from '@angular/core' +import { catchError, Observable, throwError } from 'rxjs' +import { locationReload } from '../utils/navigation' + +@Injectable() +export class AuthExpiryInterceptor implements HttpInterceptor { + private lastReloadAttempt = Number.NEGATIVE_INFINITY + + intercept( + request: HttpRequest, + next: HttpHandler + ): Observable> { + return next.handle(request).pipe( + catchError((error: unknown) => { + if ( + error instanceof HttpErrorResponse && + error.status === 401 && + request.url.includes('/api/') + ) { + const now = Date.now() + if (now - this.lastReloadAttempt >= 2000) { + this.lastReloadAttempt = now + locationReload() + } + } + + return throwError(() => error) + }) + ) + } +} diff --git a/src-ui/src/main.ts b/src-ui/src/main.ts index 7e57edcea..12fc46428 100644 --- a/src-ui/src/main.ts +++ b/src-ui/src/main.ts @@ -147,6 +147,7 @@ import { DirtyDocGuard } from './app/guards/dirty-doc.guard' import { DirtySavedViewGuard } from './app/guards/dirty-saved-view.guard' import { PermissionsGuard } from './app/guards/permissions.guard' import { ApiVersionInterceptor } from './app/interceptors/api-version.interceptor' +import { AuthExpiryInterceptor } from './app/interceptors/auth-expiry.interceptor' import { CsrfInterceptor } from './app/interceptors/csrf.interceptor' import { DocumentTitlePipe } from './app/pipes/document-title.pipe' import { FilterPipe } from './app/pipes/filter.pipe' @@ -390,6 +391,11 @@ bootstrapApplication(AppComponent, { useClass: ApiVersionInterceptor, multi: true, }, + { + provide: HTTP_INTERCEPTORS, + useClass: AuthExpiryInterceptor, + multi: true, + }, FilterPipe, DocumentTitlePipe, { provide: NgbDateAdapter, useClass: ISODateAdapter }, diff --git a/src/documents/tests/test_api_status.py b/src/documents/tests/test_api_status.py index 9b7bf37ad..ec3f9e611 100644 --- a/src/documents/tests/test_api_status.py +++ b/src/documents/tests/test_api_status.py @@ -57,11 +57,18 @@ class TestSystemStatus(APITestCase): """ response = self.client.get(self.ENDPOINT) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + self.assertEqual(response["WWW-Authenticate"], "Token") normal_user = User.objects.create_user(username="normal_user") self.client.force_login(normal_user) response = self.client.get(self.ENDPOINT) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + def test_system_status_with_bad_basic_auth_challenges(self) -> None: + self.client.credentials(HTTP_AUTHORIZATION="Basic invalid") + response = self.client.get(self.ENDPOINT) + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + self.assertEqual(response["WWW-Authenticate"], 'Basic realm="api"') + def test_system_status_container_detection(self): """ GIVEN: diff --git a/src/paperless/auth.py b/src/paperless/auth.py index c68d63cf0..6857e1087 100644 --- a/src/paperless/auth.py +++ b/src/paperless/auth.py @@ -83,3 +83,11 @@ class PaperlessBasicAuthentication(authentication.BasicAuthentication): raise exceptions.AuthenticationFailed("MFA required") return user_tuple + + def authenticate_header(self, request): + auth_header = request.META.get("HTTP_AUTHORIZATION", "") + if auth_header.lower().startswith("basic "): + return super().authenticate_header(request) + + # Still 401 for anonymous API access + return authentication.TokenAuthentication.keyword From 85fecac401130a3fa6b4537cdeeaa741be2bbe37 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:15:03 -0700 Subject: [PATCH 021/113] Fix: don't try to usermod/groupmod when non-root + update docs (#12365) --- .../s6-overlay/s6-rc.d/init-modify-user/run | 11 +++++++++ docs/setup.md | 23 +++++++------------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run index aa617355d..f8430aee2 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run @@ -2,6 +2,17 @@ # shellcheck shell=bash declare -r log_prefix="[init-user]" +# When the container is started as a non-root user (e.g. via `user: 999:999` +# in Docker Compose), usermod/groupmod require root and are meaningless. +# USERMAP_* variables only apply to the root-started path. +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + if [[ -n "${USERMAP_UID}" || -n "${USERMAP_GID}" ]]; then + echo "${log_prefix} WARNING: USERMAP_UID/USERMAP_GID are set but have no effect when the container is started as a non-root user" + fi + echo "${log_prefix} Running as non-root user ($(id --user):$(id --group)), skipping UID/GID remapping" + exit 0 +fi + declare -r usermap_original_uid=$(id -u paperless) declare -r usermap_original_gid=$(id -g paperless) declare -r usermap_new_uid=${USERMAP_UID:-$usermap_original_uid} diff --git a/docs/setup.md b/docs/setup.md index 5795968ef..3b84fd729 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -140,24 +140,17 @@ a [superuser](usage.md#superusers) account. !!! warning - It is currently not possible to run the container rootless if additional languages are specified via `PAPERLESS_OCR_LANGUAGES`. + It is not possible to run the container rootless if additional languages are specified via `PAPERLESS_OCR_LANGUAGES`. -If you want to run Paperless as a rootless container, make this -change in `docker-compose.yml`: +If you want to run Paperless as a rootless container, set `user:` in `docker-compose.yml` to the UID and GID of your host user (use `id -u` and `id -g` to find these values). The container process starts directly as that user with no internal privilege remapping: -- Set the `user` running the container to map to the `paperless` - user in the container. This value (`user_id` below) should be - the same ID that `USERMAP_UID` and `USERMAP_GID` are set to in - `docker-compose.env`. See `USERMAP_UID` and `USERMAP_GID` - [here](configuration.md#docker). +```yaml +webserver: + image: ghcr.io/paperless-ngx/paperless-ngx:latest + user: '1000:1000' +``` -Your entry for Paperless should contain something like: - -> ``` -> webserver: -> image: ghcr.io/paperless-ngx/paperless-ngx:latest -> user: -> ``` +Do not combine this with `USERMAP_UID` or `USERMAP_GID`, which are intended for the non-rootless case described in step 3. **File systems without inotify support (e.g. NFS)** From 4d4f30b5f83fadef3d6ae609780330e4669d765c Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:57:36 -0700 Subject: [PATCH 022/113] Security: validate outbound llm URLs and block internal endpoints --- docs/configuration.md | 6 ++ src/documents/tests/test_api_app_config.py | 15 ++++ src/documents/workflows/webhooks.py | 83 +++++++--------------- src/paperless/config.py | 2 + src/paperless/network.py | 76 ++++++++++++++++++++ src/paperless/serialisers.py | 16 +++++ src/paperless/settings/__init__.py | 4 ++ src/paperless_ai/client.py | 16 ++++- src/paperless_ai/embedding.py | 9 ++- src/paperless_ai/tests/test_client.py | 12 ++++ src/paperless_ai/tests/test_embedding.py | 14 ++++ 11 files changed, 192 insertions(+), 61 deletions(-) create mode 100644 src/paperless/network.py diff --git a/docs/configuration.md b/docs/configuration.md index ac148c68b..59bc56907 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1947,6 +1947,12 @@ current backend. If not supplied, defaults to "gpt-3.5-turbo" for OpenAI and "ll Defaults to None. +#### [`PAPERLESS_AI_LLM_ALLOW_INTERNAL_ENDPOINTS=`](#PAPERLESS_AI_LLM_ALLOW_INTERNAL_ENDPOINTS) {#PAPERLESS_AI_LLM_ALLOW_INTERNAL_ENDPOINTS} + +: If set to false, Paperless blocks AI endpoint URLs that resolve to non-public addresses (e.g., localhost, etc). + + Defaults to true, which allows internal endpoints. + #### [`PAPERLESS_AI_LLM_INDEX_TASK_CRON=`](#PAPERLESS_AI_LLM_INDEX_TASK_CRON) {#PAPERLESS_AI_LLM_INDEX_TASK_CRON} : Configures the schedule to update the AI embeddings of text content and metadata for all documents. Only performed if diff --git a/src/documents/tests/test_api_app_config.py b/src/documents/tests/test_api_app_config.py index 7717c3488..b946bc1bf 100644 --- a/src/documents/tests/test_api_app_config.py +++ b/src/documents/tests/test_api_app_config.py @@ -5,6 +5,7 @@ from unittest.mock import patch from django.contrib.auth.models import User from django.core.files.uploadedfile import SimpleUploadedFile +from django.test import override_settings from rest_framework import status from rest_framework.test import APITestCase @@ -693,3 +694,17 @@ class TestApiAppConfig(DirectoriesMixin, APITestCase): content_type="application/json", ) mock_update.assert_called_once() + + @override_settings(LLM_ALLOW_INTERNAL_ENDPOINTS=False) + def test_update_llm_endpoint_blocks_internal_endpoint_when_disallowed(self) -> None: + response = self.client.patch( + f"{self.ENDPOINT}1/", + json.dumps( + { + "llm_endpoint": "http://127.0.0.1:11434", + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn("non-public address", str(response.data).lower()) diff --git a/src/documents/workflows/webhooks.py b/src/documents/workflows/webhooks.py index a0256873a..0c510a35d 100644 --- a/src/documents/workflows/webhooks.py +++ b/src/documents/workflows/webhooks.py @@ -1,12 +1,14 @@ -import ipaddress import logging -import socket -from urllib.parse import urlparse import httpx from celery import shared_task from django.conf import settings +from paperless.network import format_host_for_url +from paperless.network import is_public_ip +from paperless.network import resolve_hostname_ips +from paperless.network import validate_outbound_http_url + logger = logging.getLogger("paperless.workflows.webhooks") @@ -34,23 +36,19 @@ class WebhookTransport(httpx.HTTPTransport): raise httpx.ConnectError("No hostname in request URL") try: - addr_info = socket.getaddrinfo(hostname, None) - except socket.gaierror as e: - raise httpx.ConnectError(f"Could not resolve hostname: {hostname}") from e - - ips = [info[4][0] for info in addr_info if info and info[4]] - if not ips: - raise httpx.ConnectError(f"Could not resolve hostname: {hostname}") + ips = resolve_hostname_ips(hostname) + except ValueError as e: + raise httpx.ConnectError(str(e)) from e if not self.allow_internal: for ip_str in ips: - if not WebhookTransport.is_public_ip(ip_str): + if not is_public_ip(ip_str): raise httpx.ConnectError( f"Connection blocked: {hostname} resolves to a non-public address", ) ip_str = ips[0] - formatted_ip = self._format_ip_for_url(ip_str) + formatted_ip = format_host_for_url(ip_str) new_headers = httpx.Headers(request.headers) if "host" in new_headers: @@ -69,40 +67,6 @@ class WebhookTransport(httpx.HTTPTransport): return super().handle_request(request) - def _format_ip_for_url(self, ip: str) -> str: - """ - Format IP address for use in URL (wrap IPv6 in brackets) - """ - try: - ip_obj = ipaddress.ip_address(ip) - if ip_obj.version == 6: - return f"[{ip}]" - return ip - except ValueError: - return ip - - @staticmethod - def is_public_ip(ip: str | int) -> bool: - try: - obj = ipaddress.ip_address(ip) - return not ( - obj.is_private - or obj.is_loopback - or obj.is_link_local - or obj.is_multicast - or obj.is_unspecified - ) - except ValueError: # pragma: no cover - return False - - @staticmethod - def resolve_first_ip(host: str) -> str | None: - try: - info = socket.getaddrinfo(host, None) - return info[0][4][0] if info else None - except Exception: # pragma: no cover - return None - @shared_task( retry_backoff=True, @@ -118,21 +82,24 @@ def send_webhook( *, as_json: bool = False, ): - p = urlparse(url) - if p.scheme.lower() not in settings.WEBHOOKS_ALLOWED_SCHEMES or not p.hostname: - logger.warning("Webhook blocked: invalid scheme/hostname") + try: + parsed = validate_outbound_http_url( + url, + allowed_schemes=settings.WEBHOOKS_ALLOWED_SCHEMES, + allowed_ports=settings.WEBHOOKS_ALLOWED_PORTS, + # Internal-address checks happen in transport to preserve ConnectError behavior. + allow_internal=True, + ) + except ValueError as e: + logger.warning("Webhook blocked: %s", e) + raise + + hostname = parsed.hostname + if hostname is None: # pragma: no cover raise ValueError("Invalid URL scheme or hostname.") - port = p.port or (443 if p.scheme == "https" else 80) - if ( - len(settings.WEBHOOKS_ALLOWED_PORTS) > 0 - and port not in settings.WEBHOOKS_ALLOWED_PORTS - ): - logger.warning("Webhook blocked: port not permitted") - raise ValueError("Destination port not permitted.") - transport = WebhookTransport( - hostname=p.hostname, + hostname=hostname, allow_internal=settings.WEBHOOKS_ALLOW_INTERNAL_REQUESTS, ) diff --git a/src/paperless/config.py b/src/paperless/config.py index 65d790ff4..fd2c1620d 100644 --- a/src/paperless/config.py +++ b/src/paperless/config.py @@ -188,6 +188,7 @@ class AIConfig(BaseConfig): llm_model: str = dataclasses.field(init=False) llm_api_key: str = dataclasses.field(init=False) llm_endpoint: str = dataclasses.field(init=False) + llm_allow_internal_endpoints: bool = dataclasses.field(init=False) def __post_init__(self) -> None: app_config = self._get_config_instance() @@ -203,6 +204,7 @@ class AIConfig(BaseConfig): self.llm_model = app_config.llm_model or settings.LLM_MODEL self.llm_api_key = app_config.llm_api_key or settings.LLM_API_KEY self.llm_endpoint = app_config.llm_endpoint or settings.LLM_ENDPOINT + self.llm_allow_internal_endpoints = settings.LLM_ALLOW_INTERNAL_ENDPOINTS @property def llm_index_enabled(self) -> bool: diff --git a/src/paperless/network.py b/src/paperless/network.py new file mode 100644 index 000000000..4af00052f --- /dev/null +++ b/src/paperless/network.py @@ -0,0 +1,76 @@ +import ipaddress +import socket +from collections.abc import Collection +from urllib.parse import ParseResult +from urllib.parse import urlparse + + +def is_public_ip(ip: str | int) -> bool: + try: + obj = ipaddress.ip_address(ip) + return not ( + obj.is_private + or obj.is_loopback + or obj.is_link_local + or obj.is_multicast + or obj.is_unspecified + ) + except ValueError: # pragma: no cover + return False + + +def resolve_hostname_ips(hostname: str) -> list[str]: + try: + addr_info = socket.getaddrinfo(hostname, None) + except socket.gaierror as e: + raise ValueError(f"Could not resolve hostname: {hostname}") from e + + ips = [info[4][0] for info in addr_info if info and info[4]] + if not ips: + raise ValueError(f"Could not resolve hostname: {hostname}") + return ips + + +def format_host_for_url(host: str) -> str: + """ + Format IP address for URL use (wrap IPv6 in brackets). + """ + try: + ip_obj = ipaddress.ip_address(host) + if ip_obj.version == 6: + return f"[{host}]" + return host + except ValueError: + return host + + +def validate_outbound_http_url( + url: str, + *, + allowed_schemes: Collection[str] = ("http", "https"), + allowed_ports: Collection[int] | None = None, + allow_internal: bool = False, +) -> ParseResult: + parsed = urlparse(url) + scheme = parsed.scheme.lower() + + if scheme not in allowed_schemes or not parsed.hostname: + raise ValueError("Invalid URL scheme or hostname.") + + default_port = 443 if scheme == "https" else 80 + try: + port = parsed.port or default_port + except ValueError as e: + raise ValueError("Invalid URL scheme or hostname.") from e + + if allowed_ports and port not in allowed_ports: + raise ValueError("Destination port not permitted.") + + if not allow_internal: + for ip_str in resolve_hostname_ips(parsed.hostname): + if not is_public_ip(ip_str): + raise ValueError( + f"Connection blocked: {parsed.hostname} resolves to a non-public address", + ) + + return parsed diff --git a/src/paperless/serialisers.py b/src/paperless/serialisers.py index 97a2bee7e..495ae018a 100644 --- a/src/paperless/serialisers.py +++ b/src/paperless/serialisers.py @@ -6,6 +6,7 @@ from allauth.mfa.models import Authenticator from allauth.mfa.totp.internal.auth import TOTP from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.models import SocialApp +from django.conf import settings from django.contrib.auth.models import Group from django.contrib.auth.models import Permission from django.contrib.auth.models import User @@ -15,6 +16,7 @@ from rest_framework import serializers from rest_framework.authtoken.serializers import AuthTokenSerializer from paperless.models import ApplicationConfiguration +from paperless.network import validate_outbound_http_url from paperless.validators import reject_dangerous_svg from paperless_mail.serialisers import ObfuscatedPasswordField @@ -236,6 +238,20 @@ class ApplicationConfigurationSerializer(serializers.ModelSerializer): reject_dangerous_svg(file) return file + def validate_llm_endpoint(self, value: str | None) -> str | None: + if not value: + return value + + try: + validate_outbound_http_url( + value, + allow_internal=settings.LLM_ALLOW_INTERNAL_ENDPOINTS, + ) + except ValueError as e: + raise serializers.ValidationError(str(e)) from e + + return value + class Meta: model = ApplicationConfiguration fields = "__all__" diff --git a/src/paperless/settings/__init__.py b/src/paperless/settings/__init__.py index 34d163dd7..011f776b5 100644 --- a/src/paperless/settings/__init__.py +++ b/src/paperless/settings/__init__.py @@ -1112,3 +1112,7 @@ LLM_BACKEND = os.getenv("PAPERLESS_AI_LLM_BACKEND") # "ollama" or "openai" LLM_MODEL = os.getenv("PAPERLESS_AI_LLM_MODEL") LLM_API_KEY = os.getenv("PAPERLESS_AI_LLM_API_KEY") LLM_ENDPOINT = os.getenv("PAPERLESS_AI_LLM_ENDPOINT") +LLM_ALLOW_INTERNAL_ENDPOINTS = get_bool_from_env( + "PAPERLESS_AI_LLM_ALLOW_INTERNAL_ENDPOINTS", + "true", +) diff --git a/src/paperless_ai/client.py b/src/paperless_ai/client.py index d70fe57b5..95b61b508 100644 --- a/src/paperless_ai/client.py +++ b/src/paperless_ai/client.py @@ -7,6 +7,7 @@ if TYPE_CHECKING: from llama_index.llms.openai import OpenAI from paperless.config import AIConfig +from paperless.network import validate_outbound_http_url from paperless_ai.base_model import DocumentClassifierSchema logger = logging.getLogger("paperless_ai.client") @@ -25,17 +26,28 @@ class AIClient: if self.settings.llm_backend == "ollama": from llama_index.llms.ollama import Ollama + endpoint = self.settings.llm_endpoint or "http://localhost:11434" + validate_outbound_http_url( + endpoint, + allow_internal=self.settings.llm_allow_internal_endpoints, + ) return Ollama( model=self.settings.llm_model or "llama3.1", - base_url=self.settings.llm_endpoint or "http://localhost:11434", + base_url=endpoint, request_timeout=120, ) elif self.settings.llm_backend == "openai": from llama_index.llms.openai import OpenAI + endpoint = self.settings.llm_endpoint or None + if endpoint: + validate_outbound_http_url( + endpoint, + allow_internal=self.settings.llm_allow_internal_endpoints, + ) return OpenAI( model=self.settings.llm_model or "gpt-3.5-turbo", - api_base=self.settings.llm_endpoint or None, + api_base=endpoint, api_key=self.settings.llm_api_key, ) else: diff --git a/src/paperless_ai/embedding.py b/src/paperless_ai/embedding.py index f7193a8db..72ad8e14a 100644 --- a/src/paperless_ai/embedding.py +++ b/src/paperless_ai/embedding.py @@ -12,6 +12,7 @@ from documents.models import Document from documents.models import Note from paperless.config import AIConfig from paperless.models import LLMEmbeddingBackend +from paperless.network import validate_outbound_http_url def get_embedding_model() -> "BaseEmbedding": @@ -21,10 +22,16 @@ def get_embedding_model() -> "BaseEmbedding": case LLMEmbeddingBackend.OPENAI: from llama_index.embeddings.openai import OpenAIEmbedding + endpoint = config.llm_endpoint or None + if endpoint: + validate_outbound_http_url( + endpoint, + allow_internal=config.llm_allow_internal_endpoints, + ) return OpenAIEmbedding( model=config.llm_embedding_model or "text-embedding-3-small", api_key=config.llm_api_key, - api_base=config.llm_endpoint or None, + api_base=endpoint, ) case LLMEmbeddingBackend.HUGGINGFACE: from llama_index.embeddings.huggingface import HuggingFaceEmbedding diff --git a/src/paperless_ai/tests/test_client.py b/src/paperless_ai/tests/test_client.py index 08582cc71..e1325b107 100644 --- a/src/paperless_ai/tests/test_client.py +++ b/src/paperless_ai/tests/test_client.py @@ -12,6 +12,7 @@ from paperless_ai.client import AIClient def mock_ai_config(): with patch("paperless_ai.client.AIConfig") as MockAIConfig: mock_config = MagicMock() + mock_config.llm_allow_internal_endpoints = True MockAIConfig.return_value = mock_config yield mock_config @@ -59,6 +60,17 @@ def test_get_llm_openai(mock_ai_config, mock_openai_llm): assert client.llm == mock_openai_llm.return_value +def test_get_llm_openai_blocks_internal_endpoint_when_disallowed(mock_ai_config): + mock_ai_config.llm_backend = "openai" + mock_ai_config.llm_model = "test_model" + mock_ai_config.llm_api_key = "test_api_key" + mock_ai_config.llm_endpoint = "http://127.0.0.1:1234" + mock_ai_config.llm_allow_internal_endpoints = False + + with pytest.raises(ValueError, match="non-public address"): + AIClient() + + def test_get_llm_unsupported_backend(mock_ai_config): mock_ai_config.llm_backend = "unsupported" diff --git a/src/paperless_ai/tests/test_embedding.py b/src/paperless_ai/tests/test_embedding.py index 98da6e410..f9dbfd85d 100644 --- a/src/paperless_ai/tests/test_embedding.py +++ b/src/paperless_ai/tests/test_embedding.py @@ -15,6 +15,7 @@ from paperless_ai.embedding import get_embedding_model @pytest.fixture def mock_ai_config(): with patch("paperless_ai.embedding.AIConfig") as MockAIConfig: + MockAIConfig.return_value.llm_allow_internal_endpoints = True yield MockAIConfig @@ -77,6 +78,19 @@ def test_get_embedding_model_openai(mock_ai_config): assert model == MockOpenAIEmbedding.return_value +def test_get_embedding_model_openai_blocks_internal_endpoint_when_disallowed( + mock_ai_config, +): + mock_ai_config.return_value.llm_embedding_backend = LLMEmbeddingBackend.OPENAI + mock_ai_config.return_value.llm_embedding_model = "text-embedding-3-small" + mock_ai_config.return_value.llm_api_key = "test_api_key" + mock_ai_config.return_value.llm_endpoint = "http://127.0.0.1:11434" + mock_ai_config.return_value.llm_allow_internal_endpoints = False + + with pytest.raises(ValueError, match="non-public address"): + get_embedding_model() + + def test_get_embedding_model_huggingface(mock_ai_config): mock_ai_config.return_value.llm_embedding_backend = LLMEmbeddingBackend.HUGGINGFACE mock_ai_config.return_value.llm_embedding_model = ( From ca5879a54ed7d7357b9bab202166f007e6d99977 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 16 Mar 2026 23:03:31 -0700 Subject: [PATCH 023/113] Fix one test with explicit override --- src/documents/tests/test_consumer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 2acfb3c7d..a59c7d676 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -642,6 +642,7 @@ class TestConsumer( self._assert_first_last_send_progress() @mock.patch("documents.consumer.generate_unique_filename") + @override_settings(FILENAME_FORMAT="{pk}") def testFilenameHandlingFallsBackWhenGeneratedPathExceedsDbLimit(self, m): m.side_effect = lambda doc, archive_filename=False: Path( ("a" * 1100 + ".pdf") if not archive_filename else ("b" * 1100 + ".pdf"), From 736b08ad09d4f7205cdcb9b4e973e242e91020dc Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:23:08 -0700 Subject: [PATCH 024/113] Tweak: use cancel instead of discard for app config button --- src-ui/src/app/components/admin/config/config.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-ui/src/app/components/admin/config/config.component.html b/src-ui/src/app/components/admin/config/config.component.html index fcb50183a..38ddbf3a7 100644 --- a/src-ui/src/app/components/admin/config/config.component.html +++ b/src-ui/src/app/components/admin/config/config.component.html @@ -59,7 +59,7 @@
- +
From d53dcad4f690744fbc6d4a4f00f6307f0a95d73d Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:24:49 +0000 Subject: [PATCH 025/113] Auto translate strings --- src-ui/messages.xlf | 150 ++++++++++++++++++++++---------------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 9f2993a4c..d2e12880f 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -532,15 +532,79 @@ 125 - - Discard + + Cancel src/app/components/admin/config/config.component.html 62 - src/app/components/document-detail/document-detail.component.html - 452 + src/app/components/admin/settings/settings.component.html + 399 + + + src/app/components/common/confirm-dialog/confirm-dialog.component.ts + 47 + + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 25 + + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 51 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 27 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 19 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 39 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 80 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 76 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 30 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 56 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 115 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 31 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 182 + + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 81 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 21 + + + src/app/components/manage/saved-views/saved-views.component.html + 82 @@ -1514,77 +1578,6 @@ 389 - - Cancel - - src/app/components/admin/settings/settings.component.html - 399 - - - src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 47 - - - src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html - 25 - - - src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html - 51 - - - src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html - 27 - - - src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html - 19 - - - src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html - 39 - - - src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 80 - - - src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html - 76 - - - src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html - 30 - - - src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html - 56 - - - src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 115 - - - src/app/components/common/permissions-dialog/permissions-dialog.component.html - 31 - - - src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 - - - src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html - 81 - - - src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html - 21 - - - src/app/components/manage/saved-views/saved-views.component.html - 82 - - Use system language @@ -7684,6 +7677,13 @@ 450 + + Discard + + src/app/components/document-detail/document-detail.component.html + 452 + + Document loading... From a86c9d32feaf05a0ccca05bc067fb9accbb77538 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:26:41 -0700 Subject: [PATCH 026/113] Fix: fix file button hover color in dark mode (#12367) --- src-ui/src/theme.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src-ui/src/theme.scss b/src-ui/src/theme.scss index e6a4ea113..61e5fe4c3 100644 --- a/src-ui/src/theme.scss +++ b/src-ui/src/theme.scss @@ -153,6 +153,11 @@ $form-check-radio-checked-bg-image-dark: url("data:image/svg+xml, Generator[TextDocumentParser, None, None]: """ with TextDocumentParser() as parser: yield parser + + +# ------------------------------------------------------------------ +# Tika parser sample files +# ------------------------------------------------------------------ + + +@pytest.fixture(scope="session") +def tika_samples_dir(samples_dir: Path) -> Path: + """Absolute path to the Tika parser sample files directory. + + Returns + ------- + Path + ``/tika/`` + """ + return samples_dir / "tika" + + +@pytest.fixture(scope="session") +def sample_odt_file(tika_samples_dir: Path) -> Path: + """Path to a sample ODT file. + + Returns + ------- + Path + Absolute path to ``tika/sample.odt``. + """ + return tika_samples_dir / "sample.odt" + + +@pytest.fixture(scope="session") +def sample_docx_file(tika_samples_dir: Path) -> Path: + """Path to a sample DOCX file. + + Returns + ------- + Path + Absolute path to ``tika/sample.docx``. + """ + return tika_samples_dir / "sample.docx" + + +@pytest.fixture(scope="session") +def sample_doc_file(tika_samples_dir: Path) -> Path: + """Path to a sample DOC file. + + Returns + ------- + Path + Absolute path to ``tika/sample.doc``. + """ + return tika_samples_dir / "sample.doc" + + +@pytest.fixture(scope="session") +def sample_broken_odt(tika_samples_dir: Path) -> Path: + """Path to a broken ODT file that triggers the multi-part fallback. + + Returns + ------- + Path + Absolute path to ``tika/multi-part-broken.odt``. + """ + return tika_samples_dir / "multi-part-broken.odt" + + +# ------------------------------------------------------------------ +# Tika parser instance +# ------------------------------------------------------------------ + + +@pytest.fixture() +def tika_parser() -> Generator[TikaDocumentParser, None, None]: + """Yield a TikaDocumentParser and clean up its temporary directory afterwards. + + Yields + ------ + TikaDocumentParser + A ready-to-use parser instance. + """ + with TikaDocumentParser() as parser: + yield parser diff --git a/src/paperless_tika/tests/test_live_tika.py b/src/paperless/tests/parsers/test_tika_liva.py similarity index 77% rename from src/paperless_tika/tests/test_live_tika.py rename to src/paperless/tests/parsers/test_tika_liva.py index 8275708b4..87cdd88a5 100644 --- a/src/paperless_tika/tests/test_live_tika.py +++ b/src/paperless/tests/parsers/test_tika_liva.py @@ -4,7 +4,7 @@ from pathlib import Path import pytest from documents.tests.utils import util_call_with_backoff -from paperless_tika.parsers import TikaDocumentParser +from paperless.parsers.tika import TikaDocumentParser @pytest.mark.skipif( @@ -42,14 +42,15 @@ class TestTikaParserAgainstServer: ) assert ( - tika_parser.text + tika_parser.get_text() == "This is an ODT test document, created September 14, 2022" ) - assert tika_parser.archive_path is not None - assert b"PDF-" in tika_parser.archive_path.read_bytes()[:10] + archive = tika_parser.get_archive_path() + assert archive is not None + assert b"PDF-" in archive.read_bytes()[:10] # TODO: Unsure what can set the Creation-Date field in a document, enable when possible - # self.assertEqual(tika_parser.date, datetime.datetime(2022, 9, 14)) + # self.assertEqual(tika_parser.get_date(), datetime.datetime(2022, 9, 14)) def test_basic_parse_docx( self, @@ -74,14 +75,15 @@ class TestTikaParserAgainstServer: ) assert ( - tika_parser.text + tika_parser.get_text() == "This is an DOCX test document, also made September 14, 2022" ) - assert tika_parser.archive_path is not None - with Path(tika_parser.archive_path).open("rb") as f: + archive = tika_parser.get_archive_path() + assert archive is not None + with archive.open("rb") as f: assert b"PDF-" in f.read()[:10] - # self.assertEqual(tika_parser.date, datetime.datetime(2022, 9, 14)) + # self.assertEqual(tika_parser.get_date(), datetime.datetime(2022, 9, 14)) def test_basic_parse_doc( self, @@ -102,13 +104,12 @@ class TestTikaParserAgainstServer: [sample_doc_file, "application/msword"], ) - assert tika_parser.text is not None - assert ( - "This is a test document, saved in the older .doc format" - in tika_parser.text - ) - assert tika_parser.archive_path is not None - with Path(tika_parser.archive_path).open("rb") as f: + text = tika_parser.get_text() + assert text is not None + assert "This is a test document, saved in the older .doc format" in text + archive = tika_parser.get_archive_path() + assert archive is not None + with archive.open("rb") as f: assert b"PDF-" in f.read()[:10] def test_tika_fails_multi_part( @@ -133,6 +134,7 @@ class TestTikaParserAgainstServer: [sample_broken_odt, "application/vnd.oasis.opendocument.text"], ) - assert tika_parser.archive_path is not None - with Path(tika_parser.archive_path).open("rb") as f: + archive = tika_parser.get_archive_path() + assert archive is not None + with archive.open("rb") as f: assert b"PDF-" in f.read()[:10] diff --git a/src/paperless_tika/tests/test_tika_parser.py b/src/paperless/tests/parsers/test_tika_parser.py similarity index 63% rename from src/paperless_tika/tests/test_tika_parser.py rename to src/paperless/tests/parsers/test_tika_parser.py index e1c71c131..d18d178e6 100644 --- a/src/paperless_tika/tests/test_tika_parser.py +++ b/src/paperless/tests/parsers/test_tika_parser.py @@ -9,7 +9,56 @@ from pytest_django.fixtures import SettingsWrapper from pytest_httpx import HTTPXMock from documents.parsers import ParseError -from paperless_tika.parsers import TikaDocumentParser +from paperless.parsers import ParserProtocol +from paperless.parsers.tika import TikaDocumentParser + + +class TestTikaParserRegistryInterface: + """Verify that TikaDocumentParser satisfies the ParserProtocol contract.""" + + def test_satisfies_parser_protocol(self) -> None: + assert isinstance(TikaDocumentParser(), ParserProtocol) + + def test_supported_mime_types_is_classmethod(self) -> None: + mime_types = TikaDocumentParser.supported_mime_types() + assert isinstance(mime_types, dict) + assert len(mime_types) > 0 + + def test_score_returns_none_when_tika_disabled( + self, + settings: SettingsWrapper, + ) -> None: + settings.TIKA_ENABLED = False + result = TikaDocumentParser.score( + "application/vnd.oasis.opendocument.text", + "sample.odt", + ) + assert result is None + + def test_score_returns_int_when_tika_enabled( + self, + settings: SettingsWrapper, + ) -> None: + settings.TIKA_ENABLED = True + result = TikaDocumentParser.score( + "application/vnd.oasis.opendocument.text", + "sample.odt", + ) + assert isinstance(result, int) + + def test_score_returns_none_for_unsupported_mime( + self, + settings: SettingsWrapper, + ) -> None: + settings.TIKA_ENABLED = True + result = TikaDocumentParser.score("application/pdf", "doc.pdf") + assert result is None + + def test_can_produce_archive_is_false(self) -> None: + assert TikaDocumentParser().can_produce_archive is False + + def test_requires_pdf_rendition_is_true(self) -> None: + assert TikaDocumentParser().requires_pdf_rendition is True @pytest.mark.django_db() @@ -36,12 +85,12 @@ class TestTikaParser: tika_parser.parse(sample_odt_file, "application/vnd.oasis.opendocument.text") - assert tika_parser.text == "the content" - assert tika_parser.archive_path is not None - with Path(tika_parser.archive_path).open("rb") as f: + assert tika_parser.get_text() == "the content" + assert tika_parser.get_archive_path() is not None + with Path(tika_parser.get_archive_path()).open("rb") as f: assert f.read() == b"PDF document" - assert tika_parser.date == datetime.datetime( + assert tika_parser.get_date() == datetime.datetime( 2020, 11, 21, @@ -89,7 +138,7 @@ class TestTikaParser: httpx_mock.add_response(status_code=HTTPStatus.INTERNAL_SERVER_ERROR) with pytest.raises(ParseError): - tika_parser.convert_to_pdf(sample_odt_file, None) + tika_parser._convert_to_pdf(sample_odt_file) @pytest.mark.parametrize( ("setting_value", "expected_form_value"), @@ -106,7 +155,6 @@ class TestTikaParser: expected_form_value: str, httpx_mock: HTTPXMock, settings: SettingsWrapper, - tika_parser: TikaDocumentParser, sample_odt_file: Path, ) -> None: """ @@ -117,6 +165,8 @@ class TestTikaParser: THEN: - Request to Gotenberg contains the expected PDF/A format string """ + # Parser must be created after the setting is changed so that + # OutputTypeConfig reads the correct value at __init__ time. settings.OCR_OUTPUT_TYPE = setting_value httpx_mock.add_response( status_code=codes.OK, @@ -124,7 +174,8 @@ class TestTikaParser: method="POST", ) - tika_parser.convert_to_pdf(sample_odt_file, None) + with TikaDocumentParser() as parser: + parser._convert_to_pdf(sample_odt_file) request = httpx_mock.get_request() diff --git a/src/paperless_tika/tests/samples/multi-part-broken.odt b/src/paperless/tests/samples/tika/multi-part-broken.odt similarity index 100% rename from src/paperless_tika/tests/samples/multi-part-broken.odt rename to src/paperless/tests/samples/tika/multi-part-broken.odt diff --git a/src/paperless_tika/tests/samples/sample.doc b/src/paperless/tests/samples/tika/sample.doc similarity index 100% rename from src/paperless_tika/tests/samples/sample.doc rename to src/paperless/tests/samples/tika/sample.doc diff --git a/src/paperless_tika/tests/samples/sample.docx b/src/paperless/tests/samples/tika/sample.docx similarity index 100% rename from src/paperless_tika/tests/samples/sample.docx rename to src/paperless/tests/samples/tika/sample.docx diff --git a/src/paperless_tika/tests/samples/sample.odt b/src/paperless/tests/samples/tika/sample.odt similarity index 100% rename from src/paperless_tika/tests/samples/sample.odt rename to src/paperless/tests/samples/tika/sample.odt diff --git a/src/paperless_text/signals.py b/src/paperless_text/signals.py index cf74d1c0e..bfdabc601 100644 --- a/src/paperless_text/signals.py +++ b/src/paperless_text/signals.py @@ -1,10 +1,12 @@ def get_parser(*args, **kwargs): from paperless.parsers.text import TextDocumentParser - # The new TextDocumentParser does not accept the legacy logging_group / - # progress_callback kwargs injected by the old signal-based consumer. - # These are dropped here; Phase 4 will replace this signal path with the - # new ParserRegistry so the shim can be removed at that point. + # TextDocumentParser accepts logging_group for constructor compatibility but + # does not store or use it (no legacy DocumentParser base class). + # progress_callback is also not used. Both may arrive as a positional arg + # (consumer) or a keyword arg (views); *args absorbs the positional form, + # kwargs.pop handles the keyword form. Phase 4 will replace this signal + # path with the new ParserRegistry so the shim can be removed at that point. kwargs.pop("logging_group", None) kwargs.pop("progress_callback", None) return TextDocumentParser() diff --git a/src/paperless_tika/parsers.py b/src/paperless_tika/parsers.py deleted file mode 100644 index 22a5bc1c6..000000000 --- a/src/paperless_tika/parsers.py +++ /dev/null @@ -1,136 +0,0 @@ -from pathlib import Path - -import httpx -from django.conf import settings -from django.utils import timezone -from gotenberg_client import GotenbergClient -from gotenberg_client.options import PdfAFormat -from tika_client import TikaClient - -from documents.parsers import DocumentParser -from documents.parsers import ParseError -from documents.parsers import make_thumbnail_from_pdf -from paperless.config import OutputTypeConfig -from paperless.models import OutputTypeChoices - - -class TikaDocumentParser(DocumentParser): - """ - This parser sends documents to a local tika server - """ - - logging_name = "paperless.parsing.tika" - - def get_thumbnail(self, document_path, mime_type, file_name=None): - if not self.archive_path: - self.archive_path = self.convert_to_pdf(document_path, file_name) - - return make_thumbnail_from_pdf( - self.archive_path, - self.tempdir, - self.logging_group, - ) - - def extract_metadata(self, document_path, mime_type): - try: - with TikaClient( - tika_url=settings.TIKA_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client: - parsed = client.metadata.from_file(document_path, mime_type) - return [ - { - "namespace": "", - "prefix": "", - "key": key, - "value": parsed.data[key], - } - for key in parsed.data - ] - except Exception as e: - self.log.warning( - f"Error while fetching document metadata for {document_path}: {e}", - ) - return [] - - def parse(self, document_path: Path, mime_type: str, file_name=None) -> None: - self.log.info(f"Sending {document_path} to Tika server") - - try: - with TikaClient( - tika_url=settings.TIKA_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client: - try: - parsed = client.tika.as_text.from_file(document_path, mime_type) - except httpx.HTTPStatusError as err: - # Workaround https://issues.apache.org/jira/browse/TIKA-4110 - # Tika fails with some files as multi-part form data - if err.response.status_code == httpx.codes.INTERNAL_SERVER_ERROR: - parsed = client.tika.as_text.from_buffer( - document_path.read_bytes(), - mime_type, - ) - else: # pragma: no cover - raise - except Exception as err: - raise ParseError( - f"Could not parse {document_path} with tika server at " - f"{settings.TIKA_ENDPOINT}: {err}", - ) from err - - self.text = parsed.content - if self.text is not None: - self.text = self.text.strip() - - self.date = parsed.created - if self.date is not None and timezone.is_naive(self.date): - self.date = timezone.make_aware(self.date) - - self.archive_path = self.convert_to_pdf(document_path, file_name) - - def convert_to_pdf(self, document_path: Path, file_name): - pdf_path = Path(self.tempdir) / "convert.pdf" - - self.log.info(f"Converting {document_path} to PDF as {pdf_path}") - - with ( - GotenbergClient( - host=settings.TIKA_GOTENBERG_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client, - client.libre_office.to_pdf() as route, - ): - # Set the output format of the resulting PDF - if settings.OCR_OUTPUT_TYPE in { - OutputTypeChoices.PDF_A, - OutputTypeChoices.PDF_A2, - }: - route.pdf_format(PdfAFormat.A2b) - elif settings.OCR_OUTPUT_TYPE == OutputTypeChoices.PDF_A1: - self.log.warning( - "Gotenberg does not support PDF/A-1a, choosing PDF/A-2b instead", - ) - route.pdf_format(PdfAFormat.A2b) - elif settings.OCR_OUTPUT_TYPE == OutputTypeChoices.PDF_A3: - route.pdf_format(PdfAFormat.A3b) - - route.convert(document_path) - - try: - response = route.run() - - pdf_path.write_bytes(response.content) - - return pdf_path - - except Exception as err: - raise ParseError( - f"Error while converting document to PDF: {err}", - ) from err - - def get_settings(self) -> OutputTypeConfig: - """ - This parser only uses the PDF output type configuration currently - """ - return OutputTypeConfig() diff --git a/src/paperless_tika/signals.py b/src/paperless_tika/signals.py index 2b7495e35..f1fd17ef6 100644 --- a/src/paperless_tika/signals.py +++ b/src/paperless_tika/signals.py @@ -1,7 +1,15 @@ def get_parser(*args, **kwargs): - from paperless_tika.parsers import TikaDocumentParser + from paperless.parsers.tika import TikaDocumentParser - return TikaDocumentParser(*args, **kwargs) + # TikaDocumentParser accepts logging_group for constructor compatibility but + # does not store or use it (no legacy DocumentParser base class). + # progress_callback is also not used. Both may arrive as a positional arg + # (consumer) or a keyword arg (views); *args absorbs the positional form, + # kwargs.pop handles the keyword form. Phase 4 will replace this signal + # path with the new ParserRegistry so the shim can be removed at that point. + kwargs.pop("logging_group", None) + kwargs.pop("progress_callback", None) + return TikaDocumentParser() def tika_consumer_declaration(sender, **kwargs): diff --git a/src/paperless_tika/tests/__init__.py b/src/paperless_tika/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/paperless_tika/tests/conftest.py b/src/paperless_tika/tests/conftest.py deleted file mode 100644 index 5a54dae95..000000000 --- a/src/paperless_tika/tests/conftest.py +++ /dev/null @@ -1,41 +0,0 @@ -from collections.abc import Generator -from pathlib import Path - -import pytest - -from paperless_tika.parsers import TikaDocumentParser - - -@pytest.fixture() -def tika_parser() -> Generator[TikaDocumentParser, None, None]: - try: - parser = TikaDocumentParser(logging_group=None) - yield parser - finally: - # TODO(stumpylog): Cleanup once all parsers are handled - parser.cleanup() - - -@pytest.fixture(scope="session") -def sample_dir() -> Path: - return (Path(__file__).parent / Path("samples")).resolve() - - -@pytest.fixture(scope="session") -def sample_odt_file(sample_dir: Path) -> Path: - return sample_dir / "sample.odt" - - -@pytest.fixture(scope="session") -def sample_docx_file(sample_dir: Path) -> Path: - return sample_dir / "sample.docx" - - -@pytest.fixture(scope="session") -def sample_doc_file(sample_dir: Path) -> Path: - return sample_dir / "sample.doc" - - -@pytest.fixture(scope="session") -def sample_broken_odt(sample_dir: Path) -> Path: - return sample_dir / "multi-part-broken.odt" From 8d23d17ae87ee8661cf1ded71767a8257941e7c7 Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 22:44:54 +0000 Subject: [PATCH 028/113] Auto translate strings --- src/locale/en_US/LC_MESSAGES/django.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index 053dd786a..f2f8a3ef7 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-12 15:43+0000\n" +"POT-Creation-Date: 2026-03-17 22:44+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -1339,7 +1339,7 @@ msgstr "" msgid "Duplicate document identifiers are not allowed." msgstr "" -#: documents/serialisers.py:2556 documents/views.py:3565 +#: documents/serialisers.py:2556 documents/views.py:3569 #, python-format msgid "Documents not found: %(ids)s" msgstr "" @@ -1603,20 +1603,20 @@ msgstr "" msgid "Unable to parse URI {value}" msgstr "" -#: documents/views.py:3577 +#: documents/views.py:3581 #, python-format msgid "Insufficient permissions to share document %(id)s." msgstr "" -#: documents/views.py:3620 +#: documents/views.py:3624 msgid "Bundle is already being processed." msgstr "" -#: documents/views.py:3677 +#: documents/views.py:3681 msgid "The share link bundle is still being prepared. Please try again later." msgstr "" -#: documents/views.py:3687 +#: documents/views.py:3691 msgid "The share link bundle is unavailable." msgstr "" From 2d46ed9692a736f707f50e9ac7e77841e2dd32de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 00:41:24 +0000 Subject: [PATCH 029/113] Chore(deps-dev): Bump the frontend-eslint-dependencies group (#12375) Bumps the frontend-eslint-dependencies group in /src-ui with 4 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser), [@typescript-eslint/utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/utils) and [eslint](https://github.com/eslint/eslint). Updates `@typescript-eslint/eslint-plugin` from 8.54.0 to 8.57.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.57.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 8.54.0 to 8.57.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.57.0/packages/parser) Updates `@typescript-eslint/utils` from 8.54.0 to 8.57.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/utils/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.57.0/packages/utils) Updates `eslint` from 10.0.2 to 10.0.3 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/compare/v10.0.2...v10.0.3) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-version: 8.57.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-eslint-dependencies - dependency-name: "@typescript-eslint/parser" dependency-version: 8.57.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-eslint-dependencies - dependency-name: "@typescript-eslint/utils" dependency-version: 8.57.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-eslint-dependencies - dependency-name: eslint dependency-version: 10.0.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-eslint-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src-ui/package.json | 8 +- src-ui/pnpm-lock.yaml | 305 +++++++++++++++++++++--------------------- 2 files changed, 159 insertions(+), 154 deletions(-) diff --git a/src-ui/package.json b/src-ui/package.json index 72784e86f..025a9ce71 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -56,10 +56,10 @@ "@playwright/test": "^1.58.2", "@types/jest": "^30.0.0", "@types/node": "^25.3.3", - "@typescript-eslint/eslint-plugin": "^8.54.0", - "@typescript-eslint/parser": "^8.54.0", - "@typescript-eslint/utils": "^8.54.0", - "eslint": "^10.0.2", + "@typescript-eslint/eslint-plugin": "^8.57.0", + "@typescript-eslint/parser": "^8.57.0", + "@typescript-eslint/utils": "^8.57.0", + "eslint": "^10.0.3", "jest": "30.2.0", "jest-environment-jsdom": "^30.2.0", "jest-junit": "^16.0.0", diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index 342fbb8ba..7b8ba9a2f 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -104,19 +104,19 @@ importers: version: 21.2.2(chokidar@5.0.0) '@angular-eslint/builder': specifier: 21.3.0 - version: 21.3.0(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin': specifier: 21.3.0 - version: 21.3.0(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin-template': specifier: 21.3.0 - version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/schematics': specifier: 21.3.0 - version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/template-parser': specifier: 21.3.0 - version: 21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular/build': specifier: ^21.2.2 version: 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) @@ -139,17 +139,17 @@ importers: specifier: ^25.3.3 version: 25.3.3 '@typescript-eslint/eslint-plugin': - specifier: ^8.54.0 - version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.57.0 + version: 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.54.0 - version: 8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.57.0 + version: 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': - specifier: ^8.54.0 - version: 8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.57.0 + version: 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) eslint: - specifier: ^10.0.2 - version: 10.0.2(jiti@2.6.1) + specifier: ^10.0.3 + version: 10.0.3(jiti@2.6.1) jest: specifier: 30.2.0 version: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) @@ -1593,24 +1593,24 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.23.2': - resolution: {integrity: sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A==} + '@eslint/config-array@0.23.3': + resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.5.2': - resolution: {integrity: sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==} + '@eslint/config-helpers@0.5.3': + resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@1.1.0': - resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==} + '@eslint/core@1.1.1': + resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/object-schema@3.0.2': - resolution: {integrity: sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw==} + '@eslint/object-schema@3.0.3': + resolution: {integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.6.0': - resolution: {integrity: sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==} + '@eslint/plugin-kit@0.6.1': + resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@fastify/busboy@2.1.1': @@ -3041,63 +3041,63 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.54.0': - resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==} + '@typescript-eslint/eslint-plugin@8.57.0': + resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.54.0 - eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/parser': ^8.57.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.54.0': - resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} + '@typescript-eslint/parser@8.57.0': + resolution: {integrity: sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.54.0': - resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} + '@typescript-eslint/project-service@8.57.0': + resolution: {integrity: sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.54.0': - resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} + '@typescript-eslint/scope-manager@8.57.0': + resolution: {integrity: sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.54.0': - resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} + '@typescript-eslint/tsconfig-utils@8.57.0': + resolution: {integrity: sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.54.0': - resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} + '@typescript-eslint/type-utils@8.57.0': + resolution: {integrity: sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.54.0': - resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} + '@typescript-eslint/types@8.57.0': + resolution: {integrity: sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.54.0': - resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} + '@typescript-eslint/typescript-estree@8.57.0': + resolution: {integrity: sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.54.0': - resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} + '@typescript-eslint/utils@8.57.0': + resolution: {integrity: sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.54.0': - resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} + '@typescript-eslint/visitor-keys@8.57.0': + resolution: {integrity: sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -4034,20 +4034,20 @@ packages: resolution: {integrity: sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.0.2: - resolution: {integrity: sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw==} + eslint@10.0.3: + resolution: {integrity: sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -4056,8 +4056,8 @@ packages: jiti: optional: true - espree@11.1.1: - resolution: {integrity: sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} esprima@4.0.1: @@ -4207,8 +4207,8 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} @@ -5112,8 +5112,8 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -5264,8 +5264,8 @@ packages: '@angular/core': ^21.1.0 '@ng-bootstrap/ng-bootstrap': ^20.0.0 - node-abi@3.87.0: - resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} + node-abi@3.89.0: + resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} engines: {node: '>=10'} node-addon-api@6.1.0: @@ -7137,45 +7137,45 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-devkit/architect': 0.2102.0(chokidar@5.0.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular/cli': 21.2.2(@types/node@25.3.3)(chokidar@5.0.0) - eslint: 10.0.2(jiti@2.6.1) + eslint: 10.0.3(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - chokidar '@angular-eslint/bundled-angular-compiler@21.3.0': {} - '@angular-eslint/eslint-plugin-template@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin-template@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.0 - '@angular-eslint/template-parser': 21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/utils': 8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/template-parser': 21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) aria-query: 5.3.2 axobject-query: 4.1.0 - eslint: 10.0.2(jiti@2.6.1) + eslint: 10.0.3(jiti@2.6.1) typescript: 5.9.3 - '@angular-eslint/eslint-plugin@21.3.0(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin@21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.0 - '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.2(jiti@2.6.1) + '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.3(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) - '@angular-eslint/eslint-plugin': 21.3.0(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@angular-eslint/eslint-plugin-template': 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.54.0)(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/eslint-plugin': 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/eslint-plugin-template': 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular/cli': 21.2.2(@types/node@25.3.3)(chokidar@5.0.0) ignore: 7.0.5 semver: 7.7.4 @@ -7188,18 +7188,18 @@ snapshots: - eslint - typescript - '@angular-eslint/template-parser@21.3.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.0 - eslint: 10.0.2(jiti@2.6.1) + eslint: 10.0.3(jiti@2.6.1) eslint-scope: 9.1.1 typescript: 5.9.3 - '@angular-eslint/utils@21.3.0(@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/utils@21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.0 - '@typescript-eslint/utils': 8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.2(jiti@2.6.1) + '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.3(jiti@2.6.1) typescript: 5.9.3 '@angular/build@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': @@ -8436,34 +8436,34 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.0.2(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.0.3(jiti@2.6.1))': dependencies: - eslint: 10.0.2(jiti@2.6.1) + eslint: 10.0.3(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.2': + '@eslint/config-array@0.23.3': dependencies: - '@eslint/object-schema': 3.0.2 + '@eslint/object-schema': 3.0.3 debug: 4.4.3 minimatch: 10.2.4 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.2': + '@eslint/config-helpers@0.5.3': dependencies: - '@eslint/core': 1.1.0 + '@eslint/core': 1.1.1 - '@eslint/core@1.1.0': + '@eslint/core@1.1.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/object-schema@3.0.2': {} + '@eslint/object-schema@3.0.3': {} - '@eslint/plugin-kit@0.6.0': + '@eslint/plugin-kit@0.6.1': dependencies: - '@eslint/core': 1.1.0 + '@eslint/core': 1.1.1 levn: 0.4.1 '@fastify/busboy@2.1.1': {} @@ -9842,15 +9842,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/type-utils': 8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.54.0 - eslint: 10.0.2(jiti@2.6.1) + '@typescript-eslint/parser': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/type-utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.0 + eslint: 10.0.3(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -9858,58 +9858,58 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3 - eslint: 10.0.2(jiti@2.6.1) + eslint: 10.0.3(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.54.0': + '@typescript-eslint/scope-manager@8.57.0': dependencies: - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/visitor-keys': 8.57.0 - '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 10.0.2(jiti@2.6.1) + eslint: 10.0.3(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.54.0': {} + '@typescript-eslint/types@8.57.0': {} - '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/project-service': 8.57.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3 - minimatch: 9.0.5 + minimatch: 10.2.4 semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -9917,21 +9917,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.54.0(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - eslint: 10.0.2(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + eslint: 10.0.3(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.54.0': + '@typescript-eslint/visitor-keys@8.57.0': dependencies: - '@typescript-eslint/types': 8.54.0 - eslint-visitor-keys: 4.2.1 + '@typescript-eslint/types': 8.57.0 + eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.0': {} @@ -10910,20 +10910,25 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-visitor-keys@3.4.3: {} + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 + esrecurse: 4.3.0 + estraverse: 5.3.0 - eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@5.0.1: {} - eslint@10.0.2(jiti@2.6.1): + eslint@10.0.3(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.2 - '@eslint/config-helpers': 0.5.2 - '@eslint/core': 1.1.0 - '@eslint/plugin-kit': 0.6.0 + '@eslint/config-array': 0.23.3 + '@eslint/config-helpers': 0.5.3 + '@eslint/core': 1.1.1 + '@eslint/plugin-kit': 0.6.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -10932,9 +10937,9 @@ snapshots: cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 9.1.1 + eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 - espree: 11.1.1 + espree: 11.2.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -10953,7 +10958,7 @@ snapshots: transitivePeerDependencies: - supports-color - espree@11.1.1: + espree@11.2.0: dependencies: acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) @@ -11165,12 +11170,12 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 flat@5.0.2: {} - flatted@3.3.3: {} + flatted@3.4.2: {} follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: @@ -11255,7 +11260,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 - minimatch: 9.0.5 + minimatch: 9.0.9 minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 @@ -12305,7 +12310,7 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minimatch@9.0.5: + minimatch@9.0.9: dependencies: brace-expansion: 2.0.2 @@ -12450,7 +12455,7 @@ snapshots: - '@angular/router' - rxjs - node-abi@3.87.0: + node-abi@3.89.0: dependencies: semver: 7.7.4 optional: true @@ -12825,7 +12830,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.87.0 + node-abi: 3.89.0 pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 From 03e2c352c2eb2dace1d5ed390afaeaba05269ab1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 00:56:32 +0000 Subject: [PATCH 030/113] Chore(deps-dev): Bump @types/node from 25.3.3 to 25.4.0 in /src-ui (#12376) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.3.3 to 25.4.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 25.4.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src-ui/package.json | 2 +- src-ui/pnpm-lock.yaml | 334 +++++++++++++++++++++--------------------- 2 files changed, 168 insertions(+), 168 deletions(-) diff --git a/src-ui/package.json b/src-ui/package.json index 025a9ce71..06268eb7e 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -55,7 +55,7 @@ "@codecov/webpack-plugin": "^1.9.1", "@playwright/test": "^1.58.2", "@types/jest": "^30.0.0", - "@types/node": "^25.3.3", + "@types/node": "^25.4.0", "@typescript-eslint/eslint-plugin": "^8.57.0", "@typescript-eslint/parser": "^8.57.0", "@typescript-eslint/utils": "^8.57.0", diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index 7b8ba9a2f..c24d4ee0b 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -92,10 +92,10 @@ importers: devDependencies: '@angular-builders/custom-webpack': specifier: ^21.0.3 - version: 21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + version: 21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-builders/jest': specifier: ^21.0.3 - version: 21.0.3(d3759a42701812e83e3b36381edcbc70) + version: 21.0.3(5a81d46f899dc9147bafdd7de7f725f5) '@angular-devkit/core': specifier: ^21.2.2 version: 21.2.2(chokidar@5.0.0) @@ -104,7 +104,7 @@ importers: version: 21.2.2(chokidar@5.0.0) '@angular-eslint/builder': specifier: 21.3.0 - version: 21.3.0(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin': specifier: 21.3.0 version: 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) @@ -113,16 +113,16 @@ importers: version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/schematics': specifier: 21.3.0 - version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/template-parser': specifier: 21.3.0 version: 21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular/build': specifier: ^21.2.2 - version: 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + version: 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/cli': specifier: ~21.2.2 - version: 21.2.2(@types/node@25.3.3)(chokidar@5.0.0) + version: 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) '@angular/compiler-cli': specifier: ~21.2.4 version: 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) @@ -136,8 +136,8 @@ importers: specifier: ^30.0.0 version: 30.0.0 '@types/node': - specifier: ^25.3.3 - version: 25.3.3 + specifier: ^25.4.0 + version: 25.4.0 '@typescript-eslint/eslint-plugin': specifier: ^8.57.0 version: 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) @@ -152,7 +152,7 @@ importers: version: 10.0.3(jiti@2.6.1) jest: specifier: 30.2.0 - version: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) + version: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) jest-environment-jsdom: specifier: ^30.2.0 version: 30.2.0(canvas@3.0.0) @@ -161,7 +161,7 @@ importers: version: 16.0.0 jest-preset-angular: specifier: ^16.1.1 - version: 16.1.1(d878552686fd57cfb81e628ed4a9814b) + version: 16.1.1(cad993f8bb8f711cb7652a0c571fd9cf) jest-websocket-mock: specifier: ^2.5.0 version: 2.5.0 @@ -170,7 +170,7 @@ importers: version: 4.3.0(prettier@3.4.2)(typescript@5.9.3) ts-node: specifier: ~10.9.1 - version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + version: 10.9.2(@types/node@25.4.0)(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -2999,8 +2999,8 @@ packages: '@types/node-forge@1.3.14': resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - '@types/node@25.3.3': - resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} + '@types/node@25.4.0': + resolution: {integrity: sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==} '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} @@ -6885,10 +6885,10 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@angular-builders/common@5.0.3(@types/node@25.3.3)(chokidar@5.0.0)(typescript@5.9.3)': + '@angular-builders/common@5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3)': dependencies: '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - ts-node: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + ts-node: 10.9.2(@types/node@25.4.0)(typescript@5.9.3) tsconfig-paths: 4.2.0 transitivePeerDependencies: - '@swc/core' @@ -6897,13 +6897,13 @@ snapshots: - chokidar - typescript - '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: - '@angular-builders/common': 5.0.3(@types/node@25.3.3)(chokidar@5.0.0)(typescript@5.9.3) + '@angular-builders/common': 5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3) '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - '@angular/build': 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular/build': 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) lodash: 4.17.23 webpack-merge: 6.0.1 @@ -6950,17 +6950,17 @@ snapshots: - webpack-cli - yaml - '@angular-builders/jest@21.0.3(d3759a42701812e83e3b36381edcbc70)': + '@angular-builders/jest@21.0.3(5a81d46f899dc9147bafdd7de7f725f5)': dependencies: - '@angular-builders/common': 5.0.3(@types/node@25.3.3)(chokidar@5.0.0)(typescript@5.9.3) + '@angular-builders/common': 5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3) '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/platform-browser-dynamic': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) - jest: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) - jest-preset-angular: 16.1.1(d878552686fd57cfb81e628ed4a9814b) + jest: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-preset-angular: 16.1.1(cad993f8bb8f711cb7652a0c571fd9cf) lodash: 4.17.23 transitivePeerDependencies: - '@angular/platform-browser' @@ -6997,13 +6997,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.3))(webpack@5.104.1(esbuild@0.27.2)) '@angular-devkit/core': 21.1.2(chokidar@5.0.0) - '@angular/build': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular/build': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@babel/core': 7.28.5 '@babel/generator': 7.28.5 @@ -7060,7 +7060,7 @@ snapshots: '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) esbuild: 0.27.2 - jest: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) + jest: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) jest-environment-jsdom: 30.2.0(canvas@3.0.0) transitivePeerDependencies: - '@angular/compiler' @@ -7137,11 +7137,11 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-devkit/architect': 0.2102.0(chokidar@5.0.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - '@angular/cli': 21.2.2(@types/node@25.3.3)(chokidar@5.0.0) + '@angular/cli': 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) eslint: 10.0.3(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -7170,13 +7170,13 @@ snapshots: ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) '@angular-eslint/eslint-plugin': 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin-template': 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@angular/cli': 21.2.2(@types/node@25.3.3)(chokidar@5.0.0) + '@angular/cli': 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) ignore: 7.0.5 semver: 7.7.4 strip-json-comments: 3.1.1 @@ -7202,7 +7202,7 @@ snapshots: eslint: 10.0.3(jiti@2.6.1) typescript: 5.9.3 - '@angular/build@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular/build@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) @@ -7211,8 +7211,8 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@25.3.3) - '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.3.0(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0)) + '@inquirer/confirm': 5.1.21(@types/node@25.4.0) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0)) beasties: 0.3.5 browserslist: 4.28.1 esbuild: 0.27.2 @@ -7233,7 +7233,7 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.18.2 - vite: 7.3.0(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) + vite: 7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) watchpack: 2.5.0 optionalDependencies: '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) @@ -7255,7 +7255,7 @@ snapshots: - tsx - yaml - '@angular/build@21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.3.3)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular/build@21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.2(chokidar@5.0.0) @@ -7264,8 +7264,8 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@25.3.3) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0)) + '@inquirer/confirm': 5.1.21(@types/node@25.4.0) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0)) beasties: 0.4.1 browserslist: 4.28.1 esbuild: 0.27.3 @@ -7286,7 +7286,7 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.22.0 - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) + vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) @@ -7317,13 +7317,13 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/cli@21.2.2(@types/node@25.3.3)(chokidar@5.0.0)': + '@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0)': dependencies: '@angular-devkit/architect': 0.2102.2(chokidar@5.0.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) - '@inquirer/prompts': 7.10.1(@types/node@25.3.3) - '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@25.3.3))(@types/node@25.3.3)(listr2@9.0.5) + '@inquirer/prompts': 7.10.1(@types/node@25.4.0) + '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@25.4.0))(@types/node@25.4.0)(listr2@9.0.5) '@modelcontextprotocol/sdk': 1.26.0(zod@4.3.6) '@schematics/angular': 21.2.2(chokidar@5.0.0) '@yarnpkg/lockfile': 1.1.0 @@ -8492,128 +8492,128 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@25.3.3)': + '@inquirer/checkbox@4.3.2(@types/node@25.4.0)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.4.0) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.4.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/confirm@5.1.21(@types/node@25.3.3)': + '@inquirer/confirm@5.1.21(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.3) - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/core@10.3.2(@types/node@25.3.3)': + '@inquirer/core@10.3.2(@types/node@25.4.0)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.4.0) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/editor@4.2.23(@types/node@25.3.3)': + '@inquirer/editor@4.2.23(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.3) - '@inquirer/external-editor': 1.0.3(@types/node@25.3.3) - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/external-editor': 1.0.3(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/expand@4.0.23(@types/node@25.3.3)': + '@inquirer/expand@4.0.23(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.3) - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/external-editor@1.0.3(@types/node@25.3.3)': + '@inquirer/external-editor@1.0.3(@types/node@25.4.0)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.3.1(@types/node@25.3.3)': + '@inquirer/input@4.3.1(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.3) - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/number@3.0.23(@types/node@25.3.3)': + '@inquirer/number@3.0.23(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.3) - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/password@4.0.23(@types/node@25.3.3)': + '@inquirer/password@4.0.23(@types/node@25.4.0)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.3.3) - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/prompts@7.10.1(@types/node@25.3.3)': + '@inquirer/prompts@7.10.1(@types/node@25.4.0)': dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@25.3.3) - '@inquirer/confirm': 5.1.21(@types/node@25.3.3) - '@inquirer/editor': 4.2.23(@types/node@25.3.3) - '@inquirer/expand': 4.0.23(@types/node@25.3.3) - '@inquirer/input': 4.3.1(@types/node@25.3.3) - '@inquirer/number': 3.0.23(@types/node@25.3.3) - '@inquirer/password': 4.0.23(@types/node@25.3.3) - '@inquirer/rawlist': 4.1.11(@types/node@25.3.3) - '@inquirer/search': 3.2.2(@types/node@25.3.3) - '@inquirer/select': 4.4.2(@types/node@25.3.3) + '@inquirer/checkbox': 4.3.2(@types/node@25.4.0) + '@inquirer/confirm': 5.1.21(@types/node@25.4.0) + '@inquirer/editor': 4.2.23(@types/node@25.4.0) + '@inquirer/expand': 4.0.23(@types/node@25.4.0) + '@inquirer/input': 4.3.1(@types/node@25.4.0) + '@inquirer/number': 3.0.23(@types/node@25.4.0) + '@inquirer/password': 4.0.23(@types/node@25.4.0) + '@inquirer/rawlist': 4.1.11(@types/node@25.4.0) + '@inquirer/search': 3.2.2(@types/node@25.4.0) + '@inquirer/select': 4.4.2(@types/node@25.4.0) optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/rawlist@4.1.11(@types/node@25.3.3)': + '@inquirer/rawlist@4.1.11(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.3) - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/search@3.2.2(@types/node@25.3.3)': + '@inquirer/search@3.2.2(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.4.0) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.4.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/select@4.4.2(@types/node@25.3.3)': + '@inquirer/select@4.4.2(@types/node@25.4.0)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.3.3) + '@inquirer/core': 10.3.2(@types/node@25.4.0) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/type': 3.0.10(@types/node@25.4.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@inquirer/type@3.0.10(@types/node@25.3.3)': + '@inquirer/type@3.0.10(@types/node@25.4.0)': optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@isaacs/cliui@8.0.2': dependencies: @@ -8641,13 +8641,13 @@ snapshots: '@jest/console@30.2.0': dependencies: '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 chalk: 4.1.2 jest-message-util: 30.2.0 jest-util: 30.2.0 slash: 3.0.0 - '@jest/core@30.2.0(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3))': + '@jest/core@30.2.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3))': dependencies: '@jest/console': 30.2.0 '@jest/pattern': 30.0.1 @@ -8655,14 +8655,14 @@ snapshots: '@jest/test-result': 30.2.0 '@jest/transform': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.3.0 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.2.0 - jest-config: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) + jest-config: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) jest-haste-map: 30.2.0 jest-message-util: 30.2.0 jest-regex-util: 30.0.1 @@ -8691,7 +8691,7 @@ snapshots: '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 '@types/jsdom': 21.1.7 - '@types/node': 25.3.3 + '@types/node': 25.4.0 jest-mock: 30.2.0 jest-util: 30.2.0 jsdom: 26.1.0(canvas@3.0.0) @@ -8702,7 +8702,7 @@ snapshots: dependencies: '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 jest-mock: 30.2.0 '@jest/expect-utils@30.0.5': @@ -8724,7 +8724,7 @@ snapshots: dependencies: '@jest/types': 30.2.0 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 25.3.3 + '@types/node': 25.4.0 jest-message-util: 30.2.0 jest-mock: 30.2.0 jest-util: 30.2.0 @@ -8744,7 +8744,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 jest-regex-util: 30.0.1 '@jest/reporters@30.2.0': @@ -8755,7 +8755,7 @@ snapshots: '@jest/transform': 30.2.0 '@jest/types': 30.2.0 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 25.3.3 + '@types/node': 25.4.0 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit-x: 0.2.2 @@ -8836,7 +8836,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -8846,7 +8846,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -9010,10 +9010,10 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} - '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@25.3.3))(@types/node@25.3.3)(listr2@9.0.5)': + '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@25.4.0))(@types/node@25.4.0)(listr2@9.0.5)': dependencies: - '@inquirer/prompts': 7.10.1(@types/node@25.3.3) - '@inquirer/type': 3.0.10(@types/node@25.3.3) + '@inquirer/prompts': 7.10.1(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) listr2: 9.0.5 transitivePeerDependencies: - '@types/node' @@ -9717,20 +9717,20 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/bonjour@3.5.13': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.8 - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/connect@3.4.38': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/eslint-scope@3.7.7': dependencies: @@ -9748,7 +9748,7 @@ snapshots: '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -9764,7 +9764,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/istanbul-lib-coverage@2.0.6': {} @@ -9783,7 +9783,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -9793,9 +9793,9 @@ snapshots: '@types/node-forge@1.3.14': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 - '@types/node@25.3.3': + '@types/node@25.4.0': dependencies: undici-types: 7.18.2 @@ -9808,11 +9808,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/send@1.2.1': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/serve-index@1.9.4': dependencies: @@ -9821,12 +9821,12 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/stack-utils@2.0.3': {} @@ -9834,7 +9834,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@types/yargs-parser@21.0.3': {} @@ -9994,13 +9994,13 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.0(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0))': + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0))': dependencies: - vite: 7.3.0(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) + vite: 7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0))': + '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0))': dependencies: - vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) + vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) '@webassemblyjs/ast@1.14.1': dependencies: @@ -11581,7 +11581,7 @@ snapshots: '@jest/expect': 30.2.0 '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0 @@ -11601,15 +11601,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)): + jest-cli@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): dependencies: - '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) + '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) + jest-config: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) jest-util: 30.2.0 jest-validate: 30.2.0 yargs: 17.7.2 @@ -11620,7 +11620,7 @@ snapshots: - supports-color - ts-node - jest-config@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)): + jest-config@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): dependencies: '@babel/core': 7.29.0 '@jest/get-type': 30.1.0 @@ -11647,8 +11647,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 25.3.3 - ts-node: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + '@types/node': 25.4.0 + ts-node: 10.9.2(@types/node@25.4.0)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -11691,7 +11691,7 @@ snapshots: '@jest/environment': 30.2.0 '@jest/environment-jsdom-abstract': 30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) '@types/jsdom': 21.1.7 - '@types/node': 25.3.3 + '@types/node': 25.4.0 jsdom: 26.1.0(canvas@3.0.0) optionalDependencies: canvas: 3.0.0 @@ -11705,7 +11705,7 @@ snapshots: '@jest/environment': 30.2.0 '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 jest-mock: 30.2.0 jest-util: 30.2.0 jest-validate: 30.2.0 @@ -11715,7 +11715,7 @@ snapshots: jest-haste-map@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -11780,20 +11780,20 @@ snapshots: jest-mock@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 25.3.3 + '@types/node': 25.4.0 jest-util: 30.0.5 jest-mock@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 jest-util: 30.2.0 jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): optionalDependencies: jest-resolve: 30.2.0 - jest-preset-angular@16.1.1(d878552686fd57cfb81e628ed4a9814b): + jest-preset-angular@16.1.1(cad993f8bb8f711cb7652a0c571fd9cf): dependencies: '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) @@ -11802,11 +11802,11 @@ snapshots: '@jest/environment-jsdom-abstract': 30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) bs-logger: 0.2.6 esbuild-wasm: 0.27.3 - jest: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) + jest: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) jest-util: 30.2.0 jsdom: 26.1.0(canvas@3.0.0) pretty-format: 30.2.0 - ts-jest: 29.4.6(@babel/core@7.29.0)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(typescript@5.9.3) + ts-jest: 29.4.6(@babel/core@7.29.0)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3) typescript: 5.9.3 optionalDependencies: esbuild: 0.27.3 @@ -11844,7 +11844,7 @@ snapshots: '@jest/test-result': 30.2.0 '@jest/transform': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -11873,7 +11873,7 @@ snapshots: '@jest/test-result': 30.2.0 '@jest/transform': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 chalk: 4.1.2 cjs-module-lexer: 2.1.0 collect-v8-coverage: 1.0.2 @@ -11920,7 +11920,7 @@ snapshots: jest-util@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 25.3.3 + '@types/node': 25.4.0 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -11929,7 +11929,7 @@ snapshots: jest-util@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -11948,7 +11948,7 @@ snapshots: dependencies: '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 25.3.3 + '@types/node': 25.4.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -11962,24 +11962,24 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.2.0: dependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 '@ungap/structured-clone': 1.3.0 jest-util: 30.2.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)): + jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): dependencies: - '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) + '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) '@jest/types': 30.2.0 import-local: 3.2.0 - jest-cli: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) + jest-cli: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13594,12 +13594,12 @@ snapshots: dependencies: typescript: 5.9.3 - ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 30.2.0(@types/node@25.3.3)(ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3)) + jest: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -13615,14 +13615,14 @@ snapshots: esbuild: 0.27.3 jest-util: 30.2.0 - ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3): + ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 25.3.3 + '@types/node': 25.4.0 acorn: 8.14.0 acorn-walk: 8.3.1 arg: 4.1.3 @@ -13780,7 +13780,7 @@ snapshots: vary@1.1.2: {} - vite@7.3.0(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0): + vite@7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -13789,7 +13789,7 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 fsevents: 2.3.3 jiti: 2.6.1 less: 4.4.2 @@ -13797,7 +13797,7 @@ snapshots: terser: 5.44.1 yaml: 2.7.0 - vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0): + vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -13806,7 +13806,7 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.4.0 fsevents: 2.3.3 jiti: 2.6.1 less: 4.4.2 From ab4656692d83c1434e73367ec8467e16e2632e41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 01:07:48 +0000 Subject: [PATCH 031/113] Chore(deps): Bump @ng-select/ng-select (#12373) Bumps the frontend-angular-dependencies group in /src-ui with 1 update: [@ng-select/ng-select](https://github.com/ng-select/ng-select). Updates `@ng-select/ng-select` from 21.4.1 to 21.5.2 - [Release notes](https://github.com/ng-select/ng-select/releases) - [Changelog](https://github.com/ng-select/ng-select/blob/master/CHANGELOG.md) - [Commits](https://github.com/ng-select/ng-select/compare/v21.4.1...v21.5.2) --- updated-dependencies: - dependency-name: "@ng-select/ng-select" dependency-version: 21.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: frontend-angular-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src-ui/package.json | 2 +- src-ui/pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src-ui/package.json b/src-ui/package.json index 06268eb7e..c26b53bc5 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -21,7 +21,7 @@ "@angular/platform-browser-dynamic": "~21.2.4", "@angular/router": "~21.2.4", "@ng-bootstrap/ng-bootstrap": "^20.0.0", - "@ng-select/ng-select": "^21.4.1", + "@ng-select/ng-select": "^21.5.2", "@ngneat/dirty-check-forms": "^3.0.3", "@popperjs/core": "^2.11.8", "bootstrap": "^5.3.8", diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index c24d4ee0b..7b10e3065 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: ^20.0.0 version: 20.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@popperjs/core@2.11.8)(rxjs@7.8.2) '@ng-select/ng-select': - specifier: ^21.4.1 - version: 21.4.1(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)) + specifier: ^21.5.2 + version: 21.5.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)) '@ngneat/dirty-check-forms': specifier: ^3.0.3 version: 3.0.3(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2) @@ -2362,8 +2362,8 @@ packages: '@popperjs/core': ^2.11.8 rxjs: ^6.5.3 || ^7.4.0 - '@ng-select/ng-select@21.4.1': - resolution: {integrity: sha512-CwAnzyY12WnjzkPe5p+Av7jU79ghHlK+dPSzeIjuI5eIA7XuOMBRL8KfV+bQ0IuoQfc3XDhsGwwm18vWvf83IA==} + '@ng-select/ng-select@21.5.2': + resolution: {integrity: sha512-QFfZ00Z/UfZikK3BCyl4rWpZGd7W5YE2ScTbRcC2jH6QN8E1pNgxH1bBS05p2YEYZIA6RZ5/HcJguj3ipPy5Jw==} engines: {node: ^20.19.0 || ^22.12.0 || ^24.0.0} peerDependencies: '@angular/common': ^21.0.0 @@ -9244,7 +9244,7 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@ng-select/ng-select@21.4.1(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))': + '@ng-select/ng-select@21.5.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))': dependencies: '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) From 0e2c191524118f4daaa77a35eacc26a50c0cc152 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 01:15:52 +0000 Subject: [PATCH 032/113] Chore(deps-dev): Bump the frontend-jest-dependencies group (#12374) Bumps the frontend-jest-dependencies group in /src-ui with 2 updates: [jest](https://github.com/jestjs/jest/tree/HEAD/packages/jest) and [jest-environment-jsdom](https://github.com/jestjs/jest/tree/HEAD/packages/jest-environment-jsdom). Updates `jest` from 30.2.0 to 30.3.0 - [Release notes](https://github.com/jestjs/jest/releases) - [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jestjs/jest/commits/v30.3.0/packages/jest) Updates `jest-environment-jsdom` from 30.2.0 to 30.3.0 - [Release notes](https://github.com/jestjs/jest/releases) - [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jestjs/jest/commits/v30.3.0/packages/jest-environment-jsdom) --- updated-dependencies: - dependency-name: jest dependency-version: 30.3.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-jest-dependencies - dependency-name: jest-environment-jsdom dependency-version: 30.3.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-jest-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src-ui/package.json | 4 +- src-ui/pnpm-lock.yaml | 835 ++++++++++++++++++++++++------------------ 2 files changed, 484 insertions(+), 355 deletions(-) diff --git a/src-ui/package.json b/src-ui/package.json index c26b53bc5..95602b934 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -60,8 +60,8 @@ "@typescript-eslint/parser": "^8.57.0", "@typescript-eslint/utils": "^8.57.0", "eslint": "^10.0.3", - "jest": "30.2.0", - "jest-environment-jsdom": "^30.2.0", + "jest": "30.3.0", + "jest-environment-jsdom": "^30.3.0", "jest-junit": "^16.0.0", "jest-preset-angular": "^16.1.1", "jest-websocket-mock": "^2.5.0", diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index 7b10e3065..4cf6e9b36 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -92,10 +92,10 @@ importers: devDependencies: '@angular-builders/custom-webpack': specifier: ^21.0.3 - version: 21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + version: 21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-builders/jest': specifier: ^21.0.3 - version: 21.0.3(5a81d46f899dc9147bafdd7de7f725f5) + version: 21.0.3(e6176eac41f0cffc5e05b8a4d945a538) '@angular-devkit/core': specifier: ^21.2.2 version: 21.2.2(chokidar@5.0.0) @@ -151,17 +151,17 @@ importers: specifier: ^10.0.3 version: 10.0.3(jiti@2.6.1) jest: - specifier: 30.2.0 - version: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + specifier: 30.3.0 + version: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) jest-environment-jsdom: - specifier: ^30.2.0 - version: 30.2.0(canvas@3.0.0) + specifier: ^30.3.0 + version: 30.3.0(canvas@3.0.0) jest-junit: specifier: ^16.0.0 version: 16.0.0 jest-preset-angular: specifier: ^16.1.1 - version: 16.1.1(cad993f8bb8f711cb7652a0c571fd9cf) + version: 16.1.1(135ea37d5312db3eeddee262c6eb1d13) jest-websocket-mock: specifier: ^2.5.0 version: 2.5.0 @@ -810,8 +810,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -858,8 +858,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1265,12 +1265,21 @@ packages: '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + '@emnapi/core@1.9.0': + resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} + '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/runtime@1.9.0': + resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} + '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@esbuild/aix-ppc64@0.27.2': resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} @@ -1796,12 +1805,12 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@30.2.0': - resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} + '@jest/console@30.3.0': + resolution: {integrity: sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@30.2.0': - resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} + '@jest/core@30.3.0': + resolution: {integrity: sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1813,6 +1822,10 @@ packages: resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.3.0': + resolution: {integrity: sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment-jsdom-abstract@30.2.0': resolution: {integrity: sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1823,26 +1836,44 @@ packages: canvas: optional: true + '@jest/environment-jsdom-abstract@30.3.0': + resolution: {integrity: sha512-0hNFs5N6We3DMCwobzI0ydhkY10sT1tZSC0AAiy+0g2Dt/qEWgrcV5BrMxPczhe41cxW4qm6X+jqZaUdpZIajA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + jsdom: '*' + peerDependenciesMeta: + canvas: + optional: true + '@jest/environment@30.2.0': resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment@30.3.0': + resolution: {integrity: sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.0.5': resolution: {integrity: sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.2.0': - resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + '@jest/expect-utils@30.3.0': + resolution: {integrity: sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect@30.2.0': - resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} + '@jest/expect@30.3.0': + resolution: {integrity: sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/fake-timers@30.2.0': resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@30.3.0': + resolution: {integrity: sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.0.1': resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1851,16 +1882,16 @@ packages: resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/globals@30.2.0': - resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} + '@jest/globals@30.3.0': + resolution: {integrity: sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/pattern@30.0.1': resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/reporters@30.2.0': - resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} + '@jest/reporters@30.3.0': + resolution: {integrity: sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1876,24 +1907,24 @@ packages: resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/snapshot-utils@30.2.0': - resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} + '@jest/snapshot-utils@30.3.0': + resolution: {integrity: sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/source-map@30.0.1': resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-result@30.2.0': - resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} + '@jest/test-result@30.3.0': + resolution: {integrity: sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-sequencer@30.2.0': - resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} + '@jest/test-sequencer@30.3.0': + resolution: {integrity: sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/transform@30.2.0': - resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} + '@jest/transform@30.3.0': + resolution: {integrity: sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/types@30.0.5': @@ -1904,6 +1935,10 @@ packages: resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.3.0': + resolution: {integrity: sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -2901,6 +2936,9 @@ packages: '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + '@sinonjs/fake-timers@15.1.1': + resolution: {integrity: sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -3038,8 +3076,8 @@ packages: '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} '@typescript-eslint/eslint-plugin@8.57.0': resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==} @@ -3411,8 +3449,8 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - babel-jest@30.2.0: - resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} + babel-jest@30.3.0: + resolution: {integrity: sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@babel/core': ^7.11.0 || ^8.0.0-0 @@ -3428,8 +3466,8 @@ packages: resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} engines: {node: '>=12'} - babel-plugin-jest-hoist@30.2.0: - resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} + babel-plugin-jest-hoist@30.3.0: + resolution: {integrity: sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} babel-plugin-polyfill-corejs2@0.4.15: @@ -3452,8 +3490,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-jest@30.2.0: - resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} + babel-preset-jest@30.3.0: + resolution: {integrity: sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@babel/core': ^7.11.0 || ^8.0.0-beta.1 @@ -3625,16 +3663,12 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} - ci-info@4.3.0: - resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} - engines: {node: '>=8'} - ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - cjs-module-lexer@2.1.0: - resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} + cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} @@ -3668,8 +3702,8 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -3823,8 +3857,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.7.0: - resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -4123,8 +4157,8 @@ packages: resolution: {integrity: sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - expect@30.2.0: - resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + expect@30.3.0: + resolution: {integrity: sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} exponential-backoff@3.1.3: @@ -4309,8 +4343,8 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true @@ -4631,16 +4665,16 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-changed-files@30.2.0: - resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} + jest-changed-files@30.3.0: + resolution: {integrity: sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-circus@30.2.0: - resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} + jest-circus@30.3.0: + resolution: {integrity: sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@30.2.0: - resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} + jest-cli@30.3.0: + resolution: {integrity: sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -4649,8 +4683,8 @@ packages: node-notifier: optional: true - jest-config@30.2.0: - resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} + jest-config@30.3.0: + resolution: {integrity: sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' @@ -4672,20 +4706,20 @@ packages: resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-diff@30.2.0: - resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + jest-diff@30.3.0: + resolution: {integrity: sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-docblock@30.2.0: resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-each@30.2.0: - resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} + jest-each@30.3.0: + resolution: {integrity: sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-environment-jsdom@30.2.0: - resolution: {integrity: sha512-zbBTiqr2Vl78pKp/laGBREYzbZx9ZtqPjOK4++lL4BNDhxRnahg51HtoDrk9/VjIy9IthNEWdKVd7H5bqBhiWQ==} + jest-environment-jsdom@30.3.0: + resolution: {integrity: sha512-RLEOJy6ip1lpw0yqJ8tB3i88FC7VBz7i00Zvl2qF71IdxjS98gC9/0SPWYIBVXHm5hgCYK0PAlSlnHGGy9RoMg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -4693,32 +4727,32 @@ packages: canvas: optional: true - jest-environment-node@30.2.0: - resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} + jest-environment-node@30.3.0: + resolution: {integrity: sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@30.2.0: - resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} + jest-haste-map@30.3.0: + resolution: {integrity: sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-junit@16.0.0: resolution: {integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==} engines: {node: '>=10.12.0'} - jest-leak-detector@30.2.0: - resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} + jest-leak-detector@30.3.0: + resolution: {integrity: sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-matcher-utils@30.0.5: resolution: {integrity: sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@30.2.0: - resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + jest-matcher-utils@30.3.0: + resolution: {integrity: sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-message-util@30.0.5: @@ -4729,6 +4763,10 @@ packages: resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.3.0: + resolution: {integrity: sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.0.5: resolution: {integrity: sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -4737,6 +4775,10 @@ packages: resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.3.0: + resolution: {integrity: sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -4762,24 +4804,24 @@ packages: resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@30.2.0: - resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} + jest-resolve-dependencies@30.3.0: + resolution: {integrity: sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@30.2.0: - resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} + jest-resolve@30.3.0: + resolution: {integrity: sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@30.2.0: - resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} + jest-runner@30.3.0: + resolution: {integrity: sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@30.2.0: - resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} + jest-runtime@30.3.0: + resolution: {integrity: sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-snapshot@30.2.0: - resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} + jest-snapshot@30.3.0: + resolution: {integrity: sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-util@30.0.5: @@ -4790,12 +4832,16 @@ packages: resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-validate@30.2.0: - resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} + jest-util@30.3.0: + resolution: {integrity: sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-watcher@30.2.0: - resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} + jest-validate@30.3.0: + resolution: {integrity: sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watcher@30.3.0: + resolution: {integrity: sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-websocket-mock@2.5.0: @@ -4805,12 +4851,12 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jest-worker@30.2.0: - resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + jest-worker@30.3.0: + resolution: {integrity: sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@30.2.0: - resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} + jest@30.3.0: + resolution: {integrity: sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -4994,6 +5040,10 @@ packages: resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} engines: {node: 20 || >=22} + lru-cache@11.2.7: + resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -5196,8 +5246,8 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - napi-postinstall@0.3.3: - resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true @@ -5340,8 +5390,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.22: - resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} + nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -5635,6 +5685,10 @@ packages: resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-format@30.3.0: + resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + proc-log@6.1.0: resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -6134,8 +6188,8 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} tapable@2.3.0: @@ -6661,18 +6715,6 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.19.0: resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} engines: {node: '>=10.0.0'} @@ -6897,11 +6939,11 @@ snapshots: - chokidar - typescript - '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@angular-builders/common': 5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3) '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular/build': 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) @@ -6950,17 +6992,17 @@ snapshots: - webpack-cli - yaml - '@angular-builders/jest@21.0.3(5a81d46f899dc9147bafdd7de7f725f5)': + '@angular-builders/jest@21.0.3(e6176eac41f0cffc5e05b8a4d945a538)': dependencies: '@angular-builders/common': 5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3) '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/platform-browser-dynamic': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) - jest: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) - jest-preset-angular: 16.1.1(cad993f8bb8f711cb7652a0c571fd9cf) + jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-preset-angular: 16.1.1(135ea37d5312db3eeddee262c6eb1d13) lodash: 4.17.23 transitivePeerDependencies: - '@angular/platform-browser' @@ -6997,7 +7039,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) @@ -7060,8 +7102,8 @@ snapshots: '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) esbuild: 0.27.2 - jest: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) - jest-environment-jsdom: 30.2.0(canvas@3.0.0) + jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-environment-jsdom: 30.3.0(canvas@3.0.0) transitivePeerDependencies: - '@angular/compiler' - '@rspack/core' @@ -7710,7 +7752,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 @@ -7755,7 +7797,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 @@ -8270,16 +8312,32 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.9.0': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.9.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.27.2': optional: true @@ -8638,44 +8696,43 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/console@30.2.0': + '@jest/console@30.3.0': dependencies: - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 '@types/node': 25.4.0 chalk: 4.1.2 - jest-message-util: 30.2.0 - jest-util: 30.2.0 + jest-message-util: 30.3.0 + jest-util: 30.3.0 slash: 3.0.0 - '@jest/core@30.2.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3))': + '@jest/core@30.3.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3))': dependencies: - '@jest/console': 30.2.0 + '@jest/console': 30.3.0 '@jest/pattern': 30.0.1 - '@jest/reporters': 30.2.0 - '@jest/test-result': 30.2.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 + '@jest/reporters': 30.3.0 + '@jest/test-result': 30.3.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 '@types/node': 25.4.0 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 4.3.0 + ci-info: 4.4.0 exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-changed-files: 30.2.0 - jest-config: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) - jest-haste-map: 30.2.0 - jest-message-util: 30.2.0 + jest-changed-files: 30.3.0 + jest-config: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-haste-map: 30.3.0 + jest-message-util: 30.3.0 jest-regex-util: 30.0.1 - jest-resolve: 30.2.0 - jest-resolve-dependencies: 30.2.0 - jest-runner: 30.2.0 - jest-runtime: 30.2.0 - jest-snapshot: 30.2.0 - jest-util: 30.2.0 - jest-validate: 30.2.0 - jest-watcher: 30.2.0 - micromatch: 4.0.8 - pretty-format: 30.2.0 + jest-resolve: 30.3.0 + jest-resolve-dependencies: 30.3.0 + jest-runner: 30.3.0 + jest-runtime: 30.3.0 + jest-snapshot: 30.3.0 + jest-util: 30.3.0 + jest-validate: 30.3.0 + jest-watcher: 30.3.0 + pretty-format: 30.3.0 slash: 3.0.0 transitivePeerDependencies: - babel-plugin-macros @@ -8685,6 +8742,8 @@ snapshots: '@jest/diff-sequences@30.0.1': {} + '@jest/diff-sequences@30.3.0': {} + '@jest/environment-jsdom-abstract@30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0))': dependencies: '@jest/environment': 30.2.0 @@ -8698,6 +8757,19 @@ snapshots: optionalDependencies: canvas: 3.0.0 + '@jest/environment-jsdom-abstract@30.3.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0))': + dependencies: + '@jest/environment': 30.3.0 + '@jest/fake-timers': 30.3.0 + '@jest/types': 30.3.0 + '@types/jsdom': 21.1.7 + '@types/node': 25.4.0 + jest-mock: 30.3.0 + jest-util: 30.3.0 + jsdom: 26.1.0(canvas@3.0.0) + optionalDependencies: + canvas: 3.0.0 + '@jest/environment@30.2.0': dependencies: '@jest/fake-timers': 30.2.0 @@ -8705,18 +8777,25 @@ snapshots: '@types/node': 25.4.0 jest-mock: 30.2.0 + '@jest/environment@30.3.0': + dependencies: + '@jest/fake-timers': 30.3.0 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 + jest-mock: 30.3.0 + '@jest/expect-utils@30.0.5': dependencies: '@jest/get-type': 30.0.1 - '@jest/expect-utils@30.2.0': + '@jest/expect-utils@30.3.0': dependencies: '@jest/get-type': 30.1.0 - '@jest/expect@30.2.0': + '@jest/expect@30.3.0': dependencies: - expect: 30.2.0 - jest-snapshot: 30.2.0 + expect: 30.3.0 + jest-snapshot: 30.3.0 transitivePeerDependencies: - supports-color @@ -8729,16 +8808,25 @@ snapshots: jest-mock: 30.2.0 jest-util: 30.2.0 + '@jest/fake-timers@30.3.0': + dependencies: + '@jest/types': 30.3.0 + '@sinonjs/fake-timers': 15.1.1 + '@types/node': 25.4.0 + jest-message-util: 30.3.0 + jest-mock: 30.3.0 + jest-util: 30.3.0 + '@jest/get-type@30.0.1': {} '@jest/get-type@30.1.0': {} - '@jest/globals@30.2.0': + '@jest/globals@30.3.0': dependencies: - '@jest/environment': 30.2.0 - '@jest/expect': 30.2.0 - '@jest/types': 30.2.0 - jest-mock: 30.2.0 + '@jest/environment': 30.3.0 + '@jest/expect': 30.3.0 + '@jest/types': 30.3.0 + jest-mock: 30.3.0 transitivePeerDependencies: - supports-color @@ -8747,28 +8835,28 @@ snapshots: '@types/node': 25.4.0 jest-regex-util: 30.0.1 - '@jest/reporters@30.2.0': + '@jest/reporters@30.3.0': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.2.0 - '@jest/test-result': 30.2.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 + '@jest/console': 30.3.0 + '@jest/test-result': 30.3.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 '@jridgewell/trace-mapping': 0.3.31 '@types/node': 25.4.0 chalk: 4.1.2 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 exit-x: 0.2.2 - glob: 10.4.5 + glob: 10.5.0 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 - jest-message-util: 30.2.0 - jest-util: 30.2.0 - jest-worker: 30.2.0 + jest-message-util: 30.3.0 + jest-util: 30.3.0 + jest-worker: 30.3.0 slash: 3.0.0 string-length: 4.0.2 v8-to-istanbul: 9.3.0 @@ -8783,9 +8871,9 @@ snapshots: dependencies: '@sinclair/typebox': 0.34.48 - '@jest/snapshot-utils@30.2.0': + '@jest/snapshot-utils@30.3.0': dependencies: - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 chalk: 4.1.2 graceful-fs: 4.2.11 natural-compare: 1.4.0 @@ -8796,34 +8884,33 @@ snapshots: callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@30.2.0': + '@jest/test-result@30.3.0': dependencies: - '@jest/console': 30.2.0 - '@jest/types': 30.2.0 + '@jest/console': 30.3.0 + '@jest/types': 30.3.0 '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 - '@jest/test-sequencer@30.2.0': + '@jest/test-sequencer@30.3.0': dependencies: - '@jest/test-result': 30.2.0 + '@jest/test-result': 30.3.0 graceful-fs: 4.2.11 - jest-haste-map: 30.2.0 + jest-haste-map: 30.3.0 slash: 3.0.0 - '@jest/transform@30.2.0': + '@jest/transform@30.3.0': dependencies: '@babel/core': 7.29.0 - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 7.0.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 30.2.0 + jest-haste-map: 30.3.0 jest-regex-util: 30.0.1 - jest-util: 30.2.0 - micromatch: 4.0.8 + jest-util: 30.3.0 pirates: 4.0.7 slash: 3.0.0 write-file-atomic: 5.0.1 @@ -8837,7 +8924,7 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 25.4.0 - '@types/yargs': 17.0.33 + '@types/yargs': 17.0.35 chalk: 4.1.2 '@jest/types@30.2.0': @@ -8847,7 +8934,17 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 25.4.0 - '@types/yargs': 17.0.33 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + + '@jest/types@30.3.0': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 25.4.0 + '@types/yargs': 17.0.35 chalk: 4.1.2 '@jridgewell/gen-mapping@0.3.13': @@ -9222,8 +9319,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 + '@emnapi/core': 1.9.0 + '@emnapi/runtime': 1.9.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -9271,7 +9368,7 @@ snapshots: agent-base: 7.1.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 - lru-cache: 11.2.6 + lru-cache: 11.2.7 socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -9671,6 +9768,10 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers@15.1.1': + dependencies: + '@sinonjs/commons': 3.0.1 + '@standard-schema/spec@1.1.0': {} '@tsconfig/node10@1.0.9': {} @@ -9838,7 +9939,7 @@ snapshots: '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.33': + '@types/yargs@17.0.35': dependencies: '@types/yargs-parser': 21.0.3 @@ -10224,13 +10325,13 @@ snapshots: axobject-query@4.1.0: {} - babel-jest@30.2.0(@babel/core@7.29.0): + babel-jest@30.3.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@jest/transform': 30.2.0 + '@jest/transform': 30.3.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.1 - babel-preset-jest: 30.2.0(@babel/core@7.29.0) + babel-preset-jest: 30.3.0(@babel/core@7.29.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -10253,7 +10354,7 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@30.2.0: + babel-plugin-jest-hoist@30.3.0: dependencies: '@types/babel__core': 7.20.5 @@ -10300,10 +10401,10 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) - babel-preset-jest@30.2.0(@babel/core@7.29.0): + babel-preset-jest@30.3.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - babel-plugin-jest-hoist: 30.2.0 + babel-plugin-jest-hoist: 30.3.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) balanced-match@1.0.2: {} @@ -10519,11 +10620,9 @@ snapshots: chrome-trace-event@1.0.4: {} - ci-info@4.3.0: {} - ci-info@4.4.0: {} - cjs-module-lexer@2.1.0: {} + cjs-module-lexer@2.2.0: {} cli-cursor@5.0.0: dependencies: @@ -10558,7 +10657,7 @@ snapshots: co@4.6.0: {} - collect-v8-coverage@1.0.2: {} + collect-v8-coverage@1.0.3: {} color-convert@2.0.1: dependencies: @@ -10704,7 +10803,7 @@ snapshots: mimic-response: 3.1.0 optional: true - dedent@1.7.0: {} + dedent@1.7.2: {} deep-extend@0.6.0: optional: true @@ -11020,14 +11119,14 @@ snapshots: jest-mock: 30.0.5 jest-util: 30.0.5 - expect@30.2.0: + expect@30.3.0: dependencies: - '@jest/expect-utils': 30.2.0 + '@jest/expect-utils': 30.3.0 '@jest/get-type': 30.1.0 - jest-matcher-utils: 30.2.0 - jest-message-util: 30.2.0 - jest-mock: 30.2.0 - jest-util: 30.2.0 + jest-matcher-utils: 30.3.0 + jest-message-util: 30.3.0 + jest-mock: 30.3.0 + jest-util: 30.3.0 exponential-backoff@3.1.3: {} @@ -11256,7 +11355,7 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.4.5: + glob@10.5.0: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 @@ -11569,31 +11668,31 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jest-changed-files@30.2.0: + jest-changed-files@30.3.0: dependencies: execa: 5.1.1 - jest-util: 30.2.0 + jest-util: 30.3.0 p-limit: 3.1.0 - jest-circus@30.2.0: + jest-circus@30.3.0: dependencies: - '@jest/environment': 30.2.0 - '@jest/expect': 30.2.0 - '@jest/test-result': 30.2.0 - '@jest/types': 30.2.0 + '@jest/environment': 30.3.0 + '@jest/expect': 30.3.0 + '@jest/test-result': 30.3.0 + '@jest/types': 30.3.0 '@types/node': 25.4.0 chalk: 4.1.2 co: 4.6.0 - dedent: 1.7.0 + dedent: 1.7.2 is-generator-fn: 2.1.0 - jest-each: 30.2.0 - jest-matcher-utils: 30.2.0 - jest-message-util: 30.2.0 - jest-runtime: 30.2.0 - jest-snapshot: 30.2.0 - jest-util: 30.2.0 + jest-each: 30.3.0 + jest-matcher-utils: 30.3.0 + jest-message-util: 30.3.0 + jest-runtime: 30.3.0 + jest-snapshot: 30.3.0 + jest-util: 30.3.0 p-limit: 3.1.0 - pretty-format: 30.2.0 + pretty-format: 30.3.0 pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 @@ -11601,17 +11700,17 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): + jest-cli@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): dependencies: - '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) - '@jest/test-result': 30.2.0 - '@jest/types': 30.2.0 + '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + '@jest/test-result': 30.3.0 + '@jest/types': 30.3.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) - jest-util: 30.2.0 - jest-validate: 30.2.0 + jest-config: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-util: 30.3.0 + jest-validate: 30.3.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -11620,30 +11719,29 @@ snapshots: - supports-color - ts-node - jest-config@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): + jest-config@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): dependencies: '@babel/core': 7.29.0 '@jest/get-type': 30.1.0 '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.2.0 - '@jest/types': 30.2.0 - babel-jest: 30.2.0(@babel/core@7.29.0) + '@jest/test-sequencer': 30.3.0 + '@jest/types': 30.3.0 + babel-jest: 30.3.0(@babel/core@7.29.0) chalk: 4.1.2 - ci-info: 4.3.0 + ci-info: 4.4.0 deepmerge: 4.3.1 - glob: 10.4.5 + glob: 10.5.0 graceful-fs: 4.2.11 - jest-circus: 30.2.0 + jest-circus: 30.3.0 jest-docblock: 30.2.0 - jest-environment-node: 30.2.0 + jest-environment-node: 30.3.0 jest-regex-util: 30.0.1 - jest-resolve: 30.2.0 - jest-runner: 30.2.0 - jest-util: 30.2.0 - jest-validate: 30.2.0 - micromatch: 4.0.8 + jest-resolve: 30.3.0 + jest-runner: 30.3.0 + jest-util: 30.3.0 + jest-validate: 30.3.0 parse-json: 5.2.0 - pretty-format: 30.2.0 + pretty-format: 30.3.0 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: @@ -11667,31 +11765,29 @@ snapshots: chalk: 4.1.2 pretty-format: 30.0.5 - jest-diff@30.2.0: + jest-diff@30.3.0: dependencies: - '@jest/diff-sequences': 30.0.1 + '@jest/diff-sequences': 30.3.0 '@jest/get-type': 30.1.0 chalk: 4.1.2 - pretty-format: 30.2.0 + pretty-format: 30.3.0 jest-docblock@30.2.0: dependencies: detect-newline: 3.1.0 - jest-each@30.2.0: + jest-each@30.3.0: dependencies: '@jest/get-type': 30.1.0 - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 chalk: 4.1.2 - jest-util: 30.2.0 - pretty-format: 30.2.0 + jest-util: 30.3.0 + pretty-format: 30.3.0 - jest-environment-jsdom@30.2.0(canvas@3.0.0): + jest-environment-jsdom@30.3.0(canvas@3.0.0): dependencies: - '@jest/environment': 30.2.0 - '@jest/environment-jsdom-abstract': 30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) - '@types/jsdom': 21.1.7 - '@types/node': 25.4.0 + '@jest/environment': 30.3.0 + '@jest/environment-jsdom-abstract': 30.3.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) jsdom: 26.1.0(canvas@3.0.0) optionalDependencies: canvas: 3.0.0 @@ -11700,29 +11796,29 @@ snapshots: - supports-color - utf-8-validate - jest-environment-node@30.2.0: + jest-environment-node@30.3.0: dependencies: - '@jest/environment': 30.2.0 - '@jest/fake-timers': 30.2.0 - '@jest/types': 30.2.0 + '@jest/environment': 30.3.0 + '@jest/fake-timers': 30.3.0 + '@jest/types': 30.3.0 '@types/node': 25.4.0 - jest-mock: 30.2.0 - jest-util: 30.2.0 - jest-validate: 30.2.0 + jest-mock: 30.3.0 + jest-util: 30.3.0 + jest-validate: 30.3.0 jest-get-type@29.6.3: {} - jest-haste-map@30.2.0: + jest-haste-map@30.3.0: dependencies: - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 '@types/node': 25.4.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 30.0.1 - jest-util: 30.2.0 - jest-worker: 30.2.0 - micromatch: 4.0.8 + jest-util: 30.3.0 + jest-worker: 30.3.0 + picomatch: 4.0.3 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -11734,10 +11830,10 @@ snapshots: uuid: 8.3.2 xml: 1.0.1 - jest-leak-detector@30.2.0: + jest-leak-detector@30.3.0: dependencies: '@jest/get-type': 30.1.0 - pretty-format: 30.2.0 + pretty-format: 30.3.0 jest-matcher-utils@30.0.5: dependencies: @@ -11746,12 +11842,12 @@ snapshots: jest-diff: 30.0.5 pretty-format: 30.0.5 - jest-matcher-utils@30.2.0: + jest-matcher-utils@30.3.0: dependencies: '@jest/get-type': 30.1.0 chalk: 4.1.2 - jest-diff: 30.2.0 - pretty-format: 30.2.0 + jest-diff: 30.3.0 + pretty-format: 30.3.0 jest-message-util@30.0.5: dependencies: @@ -11777,6 +11873,18 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 + jest-message-util@30.3.0: + dependencies: + '@babel/code-frame': 7.29.0 + '@jest/types': 30.3.0 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + pretty-format: 30.3.0 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-mock@30.0.5: dependencies: '@jest/types': 30.0.5 @@ -11789,11 +11897,17 @@ snapshots: '@types/node': 25.4.0 jest-util: 30.2.0 - jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): - optionalDependencies: - jest-resolve: 30.2.0 + jest-mock@30.3.0: + dependencies: + '@jest/types': 30.3.0 + '@types/node': 25.4.0 + jest-util: 30.3.0 - jest-preset-angular@16.1.1(cad993f8bb8f711cb7652a0c571fd9cf): + jest-pnp-resolver@1.2.3(jest-resolve@30.3.0): + optionalDependencies: + jest-resolve: 30.3.0 + + jest-preset-angular@16.1.1(135ea37d5312db3eeddee262c6eb1d13): dependencies: '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) @@ -11802,11 +11916,11 @@ snapshots: '@jest/environment-jsdom-abstract': 30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) bs-logger: 0.2.6 esbuild-wasm: 0.27.3 - jest: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) jest-util: 30.2.0 jsdom: 26.1.0(canvas@3.0.0) pretty-format: 30.2.0 - ts-jest: 29.4.6(@babel/core@7.29.0)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3) + ts-jest: 29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3) typescript: 5.9.3 optionalDependencies: esbuild: 0.27.3 @@ -11819,101 +11933,101 @@ snapshots: jest-regex-util@30.0.1: {} - jest-resolve-dependencies@30.2.0: + jest-resolve-dependencies@30.3.0: dependencies: jest-regex-util: 30.0.1 - jest-snapshot: 30.2.0 + jest-snapshot: 30.3.0 transitivePeerDependencies: - supports-color - jest-resolve@30.2.0: + jest-resolve@30.3.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 30.2.0 - jest-pnp-resolver: 1.2.3(jest-resolve@30.2.0) - jest-util: 30.2.0 - jest-validate: 30.2.0 + jest-haste-map: 30.3.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.3.0) + jest-util: 30.3.0 + jest-validate: 30.3.0 slash: 3.0.0 unrs-resolver: 1.11.1 - jest-runner@30.2.0: + jest-runner@30.3.0: dependencies: - '@jest/console': 30.2.0 - '@jest/environment': 30.2.0 - '@jest/test-result': 30.2.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 + '@jest/console': 30.3.0 + '@jest/environment': 30.3.0 + '@jest/test-result': 30.3.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 '@types/node': 25.4.0 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-docblock: 30.2.0 - jest-environment-node: 30.2.0 - jest-haste-map: 30.2.0 - jest-leak-detector: 30.2.0 - jest-message-util: 30.2.0 - jest-resolve: 30.2.0 - jest-runtime: 30.2.0 - jest-util: 30.2.0 - jest-watcher: 30.2.0 - jest-worker: 30.2.0 + jest-environment-node: 30.3.0 + jest-haste-map: 30.3.0 + jest-leak-detector: 30.3.0 + jest-message-util: 30.3.0 + jest-resolve: 30.3.0 + jest-runtime: 30.3.0 + jest-util: 30.3.0 + jest-watcher: 30.3.0 + jest-worker: 30.3.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@30.2.0: + jest-runtime@30.3.0: dependencies: - '@jest/environment': 30.2.0 - '@jest/fake-timers': 30.2.0 - '@jest/globals': 30.2.0 + '@jest/environment': 30.3.0 + '@jest/fake-timers': 30.3.0 + '@jest/globals': 30.3.0 '@jest/source-map': 30.0.1 - '@jest/test-result': 30.2.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 + '@jest/test-result': 30.3.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 '@types/node': 25.4.0 chalk: 4.1.2 - cjs-module-lexer: 2.1.0 - collect-v8-coverage: 1.0.2 - glob: 10.4.5 + cjs-module-lexer: 2.2.0 + collect-v8-coverage: 1.0.3 + glob: 10.5.0 graceful-fs: 4.2.11 - jest-haste-map: 30.2.0 - jest-message-util: 30.2.0 - jest-mock: 30.2.0 + jest-haste-map: 30.3.0 + jest-message-util: 30.3.0 + jest-mock: 30.3.0 jest-regex-util: 30.0.1 - jest-resolve: 30.2.0 - jest-snapshot: 30.2.0 - jest-util: 30.2.0 + jest-resolve: 30.3.0 + jest-snapshot: 30.3.0 + jest-util: 30.3.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@30.2.0: + jest-snapshot@30.3.0: dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@babel/types': 7.29.0 - '@jest/expect-utils': 30.2.0 + '@jest/expect-utils': 30.3.0 '@jest/get-type': 30.1.0 - '@jest/snapshot-utils': 30.2.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 + '@jest/snapshot-utils': 30.3.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) chalk: 4.1.2 - expect: 30.2.0 + expect: 30.3.0 graceful-fs: 4.2.11 - jest-diff: 30.2.0 - jest-matcher-utils: 30.2.0 - jest-message-util: 30.2.0 - jest-util: 30.2.0 - pretty-format: 30.2.0 + jest-diff: 30.3.0 + jest-matcher-utils: 30.3.0 + jest-message-util: 30.3.0 + jest-util: 30.3.0 + pretty-format: 30.3.0 semver: 7.7.4 - synckit: 0.11.11 + synckit: 0.11.12 transitivePeerDependencies: - supports-color @@ -11935,24 +12049,33 @@ snapshots: graceful-fs: 4.2.11 picomatch: 4.0.3 - jest-validate@30.2.0: + jest-util@30.3.0: + dependencies: + '@jest/types': 30.3.0 + '@types/node': 25.4.0 + chalk: 4.1.2 + ci-info: 4.4.0 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + + jest-validate@30.3.0: dependencies: '@jest/get-type': 30.1.0 - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 camelcase: 6.3.0 chalk: 4.1.2 leven: 3.1.0 - pretty-format: 30.2.0 + pretty-format: 30.3.0 - jest-watcher@30.2.0: + jest-watcher@30.3.0: dependencies: - '@jest/test-result': 30.2.0 - '@jest/types': 30.2.0 + '@jest/test-result': 30.3.0 + '@jest/types': 30.3.0 '@types/node': 25.4.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 30.2.0 + jest-util: 30.3.0 string-length: 4.0.2 jest-websocket-mock@2.5.0: @@ -11966,20 +12089,20 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest-worker@30.2.0: + jest-worker@30.3.0: dependencies: '@types/node': 25.4.0 '@ungap/structured-clone': 1.3.0 - jest-util: 30.2.0 + jest-util: 30.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): + jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): dependencies: - '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) - '@jest/types': 30.2.0 + '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + '@jest/types': 30.3.0 import-local: 3.2.0 - jest-cli: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-cli: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -12011,7 +12134,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.22 + nwsapi: 2.2.23 parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 @@ -12022,7 +12145,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.18.3 + ws: 8.19.0 xml-name-validator: 5.0.0 optionalDependencies: canvas: 3.0.0 @@ -12190,6 +12313,8 @@ snapshots: lru-cache@11.2.6: {} + lru-cache@11.2.7: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -12392,7 +12517,7 @@ snapshots: napi-build-utils@2.0.0: optional: true - napi-postinstall@0.3.3: {} + napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} @@ -12551,7 +12676,7 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.22: {} + nwsapi@2.2.23: {} object-assign@4.1.1: {} @@ -12865,6 +12990,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-format@30.3.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + proc-log@6.1.0: {} process-nextick-args@2.0.1: {} @@ -13480,7 +13611,7 @@ snapshots: symbol-tree@3.2.4: {} - synckit@0.11.11: + synckit@0.11.12: dependencies: '@pkgr/core': 0.2.9 @@ -13594,12 +13725,12 @@ snapshots: dependencies: typescript: 5.9.3 - ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 30.2.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -13609,9 +13740,9 @@ snapshots: yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.29.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 - babel-jest: 30.2.0(@babel/core@7.29.0) + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 + babel-jest: 30.3.0(@babel/core@7.29.0) esbuild: 0.27.3 jest-util: 30.2.0 @@ -13724,7 +13855,7 @@ snapshots: unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.3.3 + napi-postinstall: 0.3.4 optionalDependencies: '@unrs/resolver-binding-android-arm-eabi': 1.11.1 '@unrs/resolver-binding-android-arm64': 1.11.1 @@ -14088,8 +14219,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@8.18.3: {} - ws@8.19.0: {} wsl-utils@0.1.0: From 261ae9d8ce1400267e213c0d4c83717c2110922d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 03:55:03 +0000 Subject: [PATCH 033/113] Chore(deps): Update django-allauth[mfa,socialaccount] requirement (#12381) Updates the requirements on [django-allauth[mfa,socialaccount]](https://github.com/sponsors/pennersr) to permit the latest version. - [Commits](https://github.com/sponsors/pennersr/commits) --- updated-dependencies: - dependency-name: django-allauth[mfa,socialaccount] dependency-version: 65.15.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a62ad51fa..43ad1e1cc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ dependencies = [ # WARNING: django does not use semver. # Only patch versions are guaranteed to not introduce breaking changes. "django~=5.2.10", - "django-allauth[mfa,socialaccount]~=65.14.0", + "django-allauth[mfa,socialaccount]~=65.15.0", "django-auditlog~=3.4.1", "django-cachalot~=2.9.0", "django-celery-results~=2.6.0", diff --git a/uv.lock b/uv.lock index d7a56fe5a..1bab7f323 100644 --- a/uv.lock +++ b/uv.lock @@ -897,15 +897,15 @@ wheels = [ [[package]] name = "django-allauth" -version = "65.14.1" +version = "65.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/02/549b6f41ba3e55d4e2cf8e181cdf57b50035a3c0bdddb710a7df0b24efb0/django_allauth-65.14.1.tar.gz", hash = "sha256:2467656d0adc835607e407847054979ab5a943778f6eb8980ed2a29eee6c5790", size = 1993088, upload-time = "2026-02-07T22:36:52.279Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/c1/d3385f4c3169c1d6eea3c63aed0f36af51478c1d72e46db12bb1a08f8034/django_allauth-65.15.0.tar.gz", hash = "sha256:b404d48cf0c3ee14dacc834c541f30adedba2ff1c433980ecc494d6cb0b395a8", size = 2215709, upload-time = "2026-03-09T13:51:28.675Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/80/05e2b3fffb80260af2dbb179d186929d7531bc9331974ba774d1d8eb3e38/django_allauth-65.14.1-py3-none-any.whl", hash = "sha256:204d8a07f217c41769a62aa4c7ae7afeb2886c841bebda6964e613e5be72e8b3", size = 1793120, upload-time = "2026-02-07T22:37:03.486Z" }, + { url = "https://files.pythonhosted.org/packages/75/b8/c8411339171bd8bc075c09ef190fb42195e9a2149e5c5026e094fe62fce0/django_allauth-65.15.0-py3-none-any.whl", hash = "sha256:ad9fc49c49a9368eaa5bb95456b76e2a4f377b3c6862ee8443507816578c098d", size = 2022994, upload-time = "2026-03-09T13:51:19.711Z" }, ] [package.optional-dependencies] @@ -3008,7 +3008,7 @@ requires-dist = [ { name = "concurrent-log-handler", specifier = "~=0.9.25" }, { name = "dateparser", specifier = "~=1.2" }, { name = "django", specifier = "~=5.2.10" }, - { name = "django-allauth", extras = ["mfa", "socialaccount"], specifier = "~=65.14.0" }, + { name = "django-allauth", extras = ["mfa", "socialaccount"], specifier = "~=65.15.0" }, { name = "django-auditlog", specifier = "~=3.4.1" }, { name = "django-cachalot", specifier = "~=2.9.0" }, { name = "django-celery-results", specifier = "~=2.6.0" }, From 79da72f69c6f1b8aee54b18bed380d0494f262fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 04:07:06 +0000 Subject: [PATCH 034/113] Chore(deps-dev): Bump types-python-dateutil (#12380) Bumps [types-python-dateutil](https://github.com/typeshed-internal/stub_uploader) from 2.9.0.20260124 to 2.9.0.20260305. - [Commits](https://github.com/typeshed-internal/stub_uploader/commits) --- updated-dependencies: - dependency-name: types-python-dateutil dependency-version: 2.9.0.20260305 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 1bab7f323..636c2588b 100644 --- a/uv.lock +++ b/uv.lock @@ -5104,11 +5104,11 @@ wheels = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20260124" +version = "2.9.0.20260305" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/41/4f8eb1ce08688a9e3e23709ed07089ccdeaf95b93745bfb768c6da71197d/types_python_dateutil-2.9.0.20260124.tar.gz", hash = "sha256:7d2db9f860820c30e5b8152bfe78dbdf795f7d1c6176057424e8b3fdd1f581af", size = 16596, upload-time = "2026-01-24T03:18:42.975Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/c7/025c624f347e10476b439a6619a95f1d200250ea88e7ccea6e09e48a7544/types_python_dateutil-2.9.0.20260305.tar.gz", hash = "sha256:389717c9f64d8f769f36d55a01873915b37e97e52ce21928198d210fbd393c8b", size = 16885, upload-time = "2026-03-05T04:00:47.409Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/c2/aa5e3f4103cc8b1dcf92432415dde75d70021d634ecfd95b2e913cf43e17/types_python_dateutil-2.9.0.20260124-py3-none-any.whl", hash = "sha256:f802977ae08bf2260142e7ca1ab9d4403772a254409f7bbdf652229997124951", size = 18266, upload-time = "2026-01-24T03:18:42.155Z" }, + { url = "https://files.pythonhosted.org/packages/0a/77/8c0d1ec97f0d9707ad3d8fa270ab8964e7b31b076d2f641c94987395cc75/types_python_dateutil-2.9.0.20260305-py3-none-any.whl", hash = "sha256:a3be9ca444d38cadabd756cfbb29780d8b338ae2a3020e73c266a83cc3025dd7", size = 18419, upload-time = "2026-03-05T04:00:46.392Z" }, ] [[package]] From 7e94dd8208772c99b25b2dbe0d281739ec5bdcf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 04:29:01 +0000 Subject: [PATCH 035/113] Chore(deps): Bump openai in the utilities-minor group (#12379) Bumps the utilities-minor group with 1 update: [openai](https://github.com/openai/openai-python). Updates `openai` from 2.24.0 to 2.26.0 - [Release notes](https://github.com/openai/openai-python/releases) - [Changelog](https://github.com/openai/openai-python/blob/main/CHANGELOG.md) - [Commits](https://github.com/openai/openai-python/compare/v2.24.0...v2.26.0) --- updated-dependencies: - dependency-name: openai dependency-version: 2.26.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: utilities-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 636c2588b..5e9199f30 100644 --- a/uv.lock +++ b/uv.lock @@ -2821,7 +2821,7 @@ wheels = [ [[package]] name = "openai" -version = "2.24.0" +version = "2.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2833,9 +2833,9 @@ dependencies = [ { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/13/17e87641b89b74552ed408a92b231283786523edddc95f3545809fab673c/openai-2.24.0.tar.gz", hash = "sha256:1e5769f540dbd01cb33bc4716a23e67b9d695161a734aff9c5f925e2bf99a673", size = 658717, upload-time = "2026-02-24T20:02:07.958Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/91/2a06c4e9597c338cac1e5e5a8dd6f29e1836fc229c4c523529dca387fda8/openai-2.26.0.tar.gz", hash = "sha256:b41f37c140ae0034a6e92b0c509376d907f3a66109935fba2c1b471a7c05a8fb", size = 666702, upload-time = "2026-03-05T23:17:35.874Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/30/844dc675ee6902579b8eef01ed23917cc9319a1c9c0c14ec6e39340c96d0/openai-2.24.0-py3-none-any.whl", hash = "sha256:fed30480d7d6c884303287bde864980a4b137b60553ffbcf9ab4a233b7a73d94", size = 1120122, upload-time = "2026-02-24T20:02:05.669Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2e/3f73e8ca53718952222cacd0cf7eecc9db439d020f0c1fe7ae717e4e199a/openai-2.26.0-py3-none-any.whl", hash = "sha256:6151bf8f83802f036117f06cc8a57b3a4da60da9926826cc96747888b57f394f", size = 1136409, upload-time = "2026-03-05T23:17:34.072Z" }, ] [[package]] From b98697ab8bd2e0124acd7093a55a18e2c7677960 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 22:31:04 -0700 Subject: [PATCH 036/113] Chore(deps): Bump the utilities-patch group across 1 directory with 2 updates (#12382) Bumps the utilities-patch group with 2 updates in the / directory: [llama-index-core](https://github.com/run-llama/llama_index) and [zensical](https://github.com/zensical/zensical). Updates `llama-index-core` from 0.14.15 to 0.14.16 - [Release notes](https://github.com/run-llama/llama_index/releases) - [Changelog](https://github.com/run-llama/llama_index/blob/main/CHANGELOG.md) - [Commits](https://github.com/run-llama/llama_index/compare/v0.14.15...v0.14.16) Updates `zensical` from 0.0.24 to 0.0.25 - [Release notes](https://github.com/zensical/zensical/releases) - [Commits](https://github.com/zensical/zensical/compare/v0.0.24...v0.0.25) --- updated-dependencies: - dependency-name: llama-index-core dependency-version: 0.14.16 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: utilities-patch - dependency-name: zensical dependency-version: 0.0.25 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: utilities-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/uv.lock b/uv.lock index 5e9199f30..e06bc5e79 100644 --- a/uv.lock +++ b/uv.lock @@ -2148,7 +2148,7 @@ wheels = [ [[package]] name = "llama-index-core" -version = "0.14.15" +version = "0.14.16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2180,9 +2180,9 @@ dependencies = [ { name = "typing-inspect", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "wrapt", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0c/4f/7c714bdf94dd229707b43e7f8cedf3aed0a99938fd46a9ad8a418c199988/llama_index_core-0.14.15.tar.gz", hash = "sha256:3766aeeb95921b3a2af8c2a51d844f75f404215336e1639098e3652db52c68ce", size = 11593505, upload-time = "2026-02-18T19:05:48.274Z" } +sdist = { url = "https://files.pythonhosted.org/packages/13/cb/1d7383f9f4520bb1d921c34f18c147b4b270007135212cedfa240edcd4c3/llama_index_core-0.14.16.tar.gz", hash = "sha256:cf2b7e4b798cb5ebad19c935174c200595c7ecff84a83793540cc27b03636a52", size = 11599715, upload-time = "2026-03-10T19:19:52.476Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/9e/262f6465ee4fffa40698b3cc2177e377ce7d945d3bd8b7d9c6b09448625d/llama_index_core-0.14.15-py3-none-any.whl", hash = "sha256:e02b321c10673871a38aaefdc4a93d5ae8ec324cad4408683189e5a1aa1e3d52", size = 11937002, upload-time = "2026-02-18T19:05:45.855Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f5/a33839bae0bd07e4030969bdba1ac90665e359ae88c56c296991ae16b8a8/llama_index_core-0.14.16-py3-none-any.whl", hash = "sha256:0cc273ebc44d51ad636217661a25f9cd02fb2d0440641430f105da3ae9f43a6b", size = 11944927, upload-time = "2026-03-10T19:19:48.043Z" }, ] [[package]] @@ -5639,7 +5639,7 @@ wheels = [ [[package]] name = "zensical" -version = "0.0.24" +version = "0.0.25" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -5649,18 +5649,16 @@ dependencies = [ { name = "pymdown-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/96/9c6cbdd7b351d1023cdbbcf7872d4cb118b0334cfe5821b99e0dd18e3f00/zensical-0.0.24.tar.gz", hash = "sha256:b5d99e225329bf4f98c8022bdf0a0ee9588c2fada7b4df1b7b896fcc62b37ec3", size = 3840688, upload-time = "2026-02-26T09:43:44.557Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/69/4b49ce778059b4888ea854cf4db40e1b2080fe828b7280198999048d6fce/zensical-0.0.25.tar.gz", hash = "sha256:462808359d949469fa7209d367f2e38ed796744074e5dadeac9ddfef0c44be25", size = 3841318, upload-time = "2026-03-10T19:32:35.048Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/aa/b8201af30e376a67566f044a1c56210edac5ae923fd986a836d2cf593c9c/zensical-0.0.24-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:d390c5453a5541ca35d4f9e1796df942b6612c546e3153dd928236d3b758409a", size = 12263407, upload-time = "2026-02-26T09:43:14.716Z" }, - { url = "https://files.pythonhosted.org/packages/78/8e/3d910214471ade604fd39b080db3696864acc23678b5b4b8475c7dbfd2ce/zensical-0.0.24-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:81ac072869cf4d280853765b2bfb688653da0dfb9408f3ab15aca96455ab8223", size = 12142610, upload-time = "2026-02-26T09:43:17.546Z" }, - { url = "https://files.pythonhosted.org/packages/cf/d7/eb0983640aa0419ddf670298cfbcf8b75629b6484925429b857851e00784/zensical-0.0.24-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5eb1dfa84cae8e960bfa2c6851d2bc8e9710c4c4c683bd3aaf23185f646ae46", size = 12508380, upload-time = "2026-02-26T09:43:20.114Z" }, - { url = "https://files.pythonhosted.org/packages/a3/04/4405b9e6f937a75db19f0d875798a7eb70817d6a3bec2a2d289a2d5e8aea/zensical-0.0.24-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57d7c9e589da99c1879a1c703e67c85eaa6be4661cdc6ce6534f7bb3575983f4", size = 12440807, upload-time = "2026-02-26T09:43:22.679Z" }, - { url = "https://files.pythonhosted.org/packages/12/dc/a7ca2a4224b3072a2c2998b6611ad7fd4f8f131ceae7aa23238d97d26e22/zensical-0.0.24-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42fcc121c3095734b078a95a0dae4d4924fb8fbf16bf730456146ad6cab48ad0", size = 12782727, upload-time = "2026-02-26T09:43:25.347Z" }, - { url = "https://files.pythonhosted.org/packages/42/37/22f1727da356ed3fcbd31f68d4a477f15c232997c87e270cfffb927459ac/zensical-0.0.24-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d4a2a051b9f49561031a2986ace502326f82d9a401ddf125530d30025fdd4", size = 12547616, upload-time = "2026-02-26T09:43:28.031Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ff/c75ff111b8e12157901d00752beef9d691dbb5a034b6a77359972262416a/zensical-0.0.24-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e5fea3bb61238dba9f930f52669db67b0c26be98e1c8386a05eb2b1e3cb875dc", size = 12684883, upload-time = "2026-02-26T09:43:30.642Z" }, - { url = "https://files.pythonhosted.org/packages/b9/92/4f6ea066382e3d068d3cadbed99e9a71af25e46c84a403e0f747960472a2/zensical-0.0.24-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:75eef0428eec2958590633fdc82dc2a58af124879e29573aa7e153b662978073", size = 12713825, upload-time = "2026-02-26T09:43:33.273Z" }, - { url = "https://files.pythonhosted.org/packages/bc/fb/bf735b19bce0034b1f3b8e1c50b2896ebbd0c5d92d462777e759e78bb083/zensical-0.0.24-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:3c6b39659156394ff805b4831dac108c839483d9efa4c9b901eaa913efee1ac7", size = 12854318, upload-time = "2026-02-26T09:43:35.632Z" }, - { url = "https://files.pythonhosted.org/packages/7e/28/0ddab6c1237e3625e7763ff666806f31e5760bb36d18624135a6bb6e8643/zensical-0.0.24-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9eef82865a18b3ca4c3cd13e245dff09a865d1da3c861e2fc86eaa9253a90f02", size = 12818270, upload-time = "2026-02-26T09:43:37.749Z" }, + { url = "https://files.pythonhosted.org/packages/42/7c/f6f5eb1903b5a557d98f48d09e3d4bc33033ed78508986250dabe5387d91/zensical-0.0.25-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c481dd16a968f97d43f6b596e10e941d8294ed446b8b117235a6b149c0d6965", size = 12263809, upload-time = "2026-03-10T19:31:49.907Z" }, + { url = "https://files.pythonhosted.org/packages/37/b2/3f8be43526a68c52c84f099887d1903c2526a22aa4344378a72671bf6070/zensical-0.0.25-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:ae51751e8b11f50df04641b40c1e07d4b703fed9d9548b16dbcb0cf260da229a", size = 12146107, upload-time = "2026-03-10T19:31:53.576Z" }, + { url = "https://files.pythonhosted.org/packages/16/59/89a3a715b1fe538b4b5ee382d71b86bd06d4f351383e36eefd36e824c150/zensical-0.0.25-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56ccf88245bd0b3684bf313384164972f1890802d4a51dd9b7ae6ea126a810bc", size = 12505963, upload-time = "2026-03-10T19:31:57.517Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5b/cc0bada291818bdf36be777af9c16f655a021f16578a31e6fb233affca03/zensical-0.0.25-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d2f4e58bcc06f3e50cc518666a0c9d8f82246255a42b37bb1d7c7343e214fbac", size = 12455496, upload-time = "2026-03-10T19:32:02.37Z" }, + { url = "https://files.pythonhosted.org/packages/e9/16/ff91ee42d8b14a1b63e2e0d74922e6c4b0ec1da3819377f20b7ca2742f76/zensical-0.0.25-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:69895273b1319a45667abac543c3e5065ff2a646d9a698eae056b6a35b57e00a", size = 12683609, upload-time = "2026-03-10T19:32:06.144Z" }, + { url = "https://files.pythonhosted.org/packages/01/fd/a85acc4234d31658f4bb54c4900edfc8d4227ad83e4c79de92cfdcd05c79/zensical-0.0.25-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c51a00ae1de2e9647bfd0ea1965b223fb3891111a00930416e1277e06f3ab3c4", size = 12725420, upload-time = "2026-03-10T19:32:09.938Z" }, + { url = "https://files.pythonhosted.org/packages/37/c7/896c91e457af3d5769d8d70d2bd66a8a287ad129879b51ab5e985ac68889/zensical-0.0.25-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:28e56ec1f06ea66227c1f5af9d7a6ed3bd4246e6af1e45d29e09f40251b52e1f", size = 12861970, upload-time = "2026-03-10T19:32:13.471Z" }, + { url = "https://files.pythonhosted.org/packages/41/06/5d804cf19e4e093394674d9f213546dc1364a34fd85d81a1153b05733c5a/zensical-0.0.25-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d2d5997baad148b65eb0de6baf81973110538e01a3f64467d06d0c5ac23b0d70", size = 12816321, upload-time = "2026-03-10T19:32:17.031Z" }, ] [[package]] From 330ee696a8eec24496e87b77f0ded17f64583b61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 06:18:11 +0000 Subject: [PATCH 037/113] Chore(deps): Bump the actions group with 2 updates (#12377) Bumps the actions group with 2 updates: [docker/metadata-action](https://github.com/docker/metadata-action) and [docker/build-push-action](https://github.com/docker/build-push-action). Updates `docker/metadata-action` from 5.10.0 to 6.0.0 - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/v5.10.0...v6.0.0) Updates `docker/build-push-action` from 6.19.2 to 7.0.0 - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6.19.2...v7.0.0) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-version: 6.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: docker/build-push-action dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-docker.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 69fff92d4..2d6da2da9 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -119,7 +119,7 @@ jobs: sudo rm -rf "$AGENT_TOOLSDIRECTORY" - name: Docker metadata id: docker-meta - uses: docker/metadata-action@v5.10.0 + uses: docker/metadata-action@v6.0.0 with: images: | ${{ env.REGISTRY }}/${{ steps.repo.outputs.name }} @@ -130,7 +130,7 @@ jobs: type=semver,pattern={{major}}.{{minor}} - name: Build and push by digest id: build - uses: docker/build-push-action@v6.19.2 + uses: docker/build-push-action@v7.0.0 with: context: . file: ./Dockerfile @@ -201,7 +201,7 @@ jobs: password: ${{ secrets.QUAY_ROBOT_TOKEN }} - name: Docker metadata id: docker-meta - uses: docker/metadata-action@v5.10.0 + uses: docker/metadata-action@v6.0.0 with: images: | ${{ env.REGISTRY }}/${{ needs.build-arch.outputs.repository }} From 0a08499fc79b6204bb0c25fccb21dc9d9ed9680f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 06:25:40 +0000 Subject: [PATCH 038/113] Chore(deps): Bump https://github.com/astral-sh/ruff-pre-commit (#12371) Bumps the pre-commit-dependencies group with 1 update: [https://github.com/astral-sh/ruff-pre-commit](https://github.com/astral-sh/ruff-pre-commit). Updates `https://github.com/astral-sh/ruff-pre-commit` from v0.15.5 to 0.15.6 - [Release notes](https://github.com/astral-sh/ruff-pre-commit/releases) - [Commits](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.5...v0.15.6) --- updated-dependencies: - dependency-name: https://github.com/astral-sh/ruff-pre-commit dependency-version: 0.15.6 dependency-type: direct:production dependency-group: pre-commit-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 073dbac1d..8d6456ff0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -50,7 +50,7 @@ repos: - 'prettier-plugin-organize-imports@4.3.0' # Python hooks - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.15.5 + rev: v0.15.6 hooks: - id: ruff-check - id: ruff-format From 3abff21d1fcbfdc13b4f83d2dba1167ce4c6a046 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 06:51:56 +0000 Subject: [PATCH 039/113] Chore(deps): Bump pyasn1 from 0.6.2 to 0.6.3 (#12370) Bumps [pyasn1](https://github.com/pyasn1/pyasn1) from 0.6.2 to 0.6.3. - [Release notes](https://github.com/pyasn1/pyasn1/releases) - [Changelog](https://github.com/pyasn1/pyasn1/blob/main/CHANGES.rst) - [Commits](https://github.com/pyasn1/pyasn1/compare/v0.6.2...v0.6.3) --- updated-dependencies: - dependency-name: pyasn1 dependency-version: 0.6.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index e06bc5e79..236624b37 100644 --- a/uv.lock +++ b/uv.lock @@ -3548,11 +3548,11 @@ sdist = { url = "https://files.pythonhosted.org/packages/1d/c7/28220d37e041fe1df [[package]] name = "pyasn1" -version = "0.6.2" +version = "0.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload-time = "2026-01-16T18:04:18.534Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload-time = "2026-01-16T18:04:17.174Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, ] [[package]] From 87ebd13abcc8f041e3df1c8116e3c054ad8dffc4 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 18 Mar 2026 06:48:05 -0700 Subject: [PATCH 040/113] Fix: remove pagination from document notes api spec (#12388) --- src/documents/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/documents/views.py b/src/documents/views.py index 842ebeab8..6974ddc1c 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -1038,6 +1038,7 @@ class DocumentViewSet( methods=["get", "post", "delete"], detail=True, permission_classes=[PaperlessNotePermissions], + pagination_class=None, filter_backends=[], ) def notes(self, request, pk=None): From d3ac75741f553e7721287ab03aa76989e45e27f4 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 18 Mar 2026 07:04:51 -0700 Subject: [PATCH 041/113] Update serialisers.py --- src/paperless/serialisers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/paperless/serialisers.py b/src/paperless/serialisers.py index 495ae018a..4939bc1ba 100644 --- a/src/paperless/serialisers.py +++ b/src/paperless/serialisers.py @@ -248,7 +248,9 @@ class ApplicationConfigurationSerializer(serializers.ModelSerializer): allow_internal=settings.LLM_ALLOW_INTERNAL_ENDPOINTS, ) except ValueError as e: - raise serializers.ValidationError(str(e)) from e + raise serializers.ValidationError( + f"Invalid LLM endpoint: {e.args[0]}, see logs for details", + ) from e return value From d162c83eb7cf857011b454acc1851fd1a868a1ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 09:19:36 -0700 Subject: [PATCH 042/113] Chore(deps): Bump ujson from 5.11.0 to 5.12.0 (#12387) Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.11.0 to 5.12.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.11.0...5.12.0) --- updated-dependencies: - dependency-name: ujson dependency-version: 5.12.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 98 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 51 insertions(+), 47 deletions(-) diff --git a/uv.lock b/uv.lock index 236624b37..c700b0339 100644 --- a/uv.lock +++ b/uv.lock @@ -5252,55 +5252,59 @@ wheels = [ [[package]] name = "ujson" -version = "5.11.0" +version = "5.12.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/d9/3f17e3c5773fb4941c68d9a37a47b1a79c9649d6c56aefbed87cc409d18a/ujson-5.11.0.tar.gz", hash = "sha256:e204ae6f909f099ba6b6b942131cee359ddda2b6e4ea39c12eb8b991fe2010e0", size = 7156583, upload-time = "2025-08-20T11:57:02.452Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/3e/c35530c5ffc25b71c59ae0cd7b8f99df37313daa162ce1e2f7925f7c2877/ujson-5.12.0.tar.gz", hash = "sha256:14b2e1eb528d77bc0f4c5bd1a7ebc05e02b5b41beefb7e8567c9675b8b13bcf4", size = 7158451, upload-time = "2026-03-11T22:19:30.397Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/ea/80346b826349d60ca4d612a47cdf3533694e49b45e9d1c07071bb867a184/ujson-5.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d7c46cb0fe5e7056b9acb748a4c35aa1b428025853032540bb7e41f46767321f", size = 55248, upload-time = "2025-08-20T11:55:19.033Z" }, - { url = "https://files.pythonhosted.org/packages/57/df/b53e747562c89515e18156513cc7c8ced2e5e3fd6c654acaa8752ffd7cd9/ujson-5.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8951bb7a505ab2a700e26f691bdfacf395bc7e3111e3416d325b513eea03a58", size = 53156, upload-time = "2025-08-20T11:55:20.174Z" }, - { url = "https://files.pythonhosted.org/packages/41/b8/ab67ec8c01b8a3721fd13e5cb9d85ab2a6066a3a5e9148d661a6870d6293/ujson-5.11.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952c0be400229940248c0f5356514123d428cba1946af6fa2bbd7503395fef26", size = 57657, upload-time = "2025-08-20T11:55:21.296Z" }, - { url = "https://files.pythonhosted.org/packages/7b/c7/fb84f27cd80a2c7e2d3c6012367aecade0da936790429801803fa8d4bffc/ujson-5.11.0-cp311-cp311-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:94fcae844f1e302f6f8095c5d1c45a2f0bfb928cccf9f1b99e3ace634b980a2a", size = 59779, upload-time = "2025-08-20T11:55:22.772Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7c/48706f7c1e917ecb97ddcfb7b1d756040b86ed38290e28579d63bd3fcc48/ujson-5.11.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e0ec1646db172beb8d3df4c32a9d78015e671d2000af548252769e33079d9a6", size = 57284, upload-time = "2025-08-20T11:55:24.01Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ce/48877c6eb4afddfd6bd1db6be34456538c07ca2d6ed233d3f6c6efc2efe8/ujson-5.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:da473b23e3a54448b008d33f742bcd6d5fb2a897e42d1fc6e7bf306ea5d18b1b", size = 1036395, upload-time = "2025-08-20T11:55:25.725Z" }, - { url = "https://files.pythonhosted.org/packages/8b/7a/2c20dc97ad70cd7c31ad0596ba8e2cf8794d77191ba4d1e0bded69865477/ujson-5.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:aa6b3d4f1c0d3f82930f4cbd7fe46d905a4a9205a7c13279789c1263faf06dba", size = 1195731, upload-time = "2025-08-20T11:55:27.915Z" }, - { url = "https://files.pythonhosted.org/packages/15/f5/ca454f2f6a2c840394b6f162fff2801450803f4ff56c7af8ce37640b8a2a/ujson-5.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4843f3ab4fe1cc596bb7e02228ef4c25d35b4bb0809d6a260852a4bfcab37ba3", size = 1088710, upload-time = "2025-08-20T11:55:29.426Z" }, - { url = "https://files.pythonhosted.org/packages/b9/ef/a9cb1fce38f699123ff012161599fb9f2ff3f8d482b4b18c43a2dc35073f/ujson-5.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7895f0d2d53bd6aea11743bd56e3cb82d729980636cd0ed9b89418bf66591702", size = 55434, upload-time = "2025-08-20T11:55:34.987Z" }, - { url = "https://files.pythonhosted.org/packages/b1/05/dba51a00eb30bd947791b173766cbed3492269c150a7771d2750000c965f/ujson-5.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12b5e7e22a1fe01058000d1b317d3b65cc3daf61bd2ea7a2b76721fe160fa74d", size = 53190, upload-time = "2025-08-20T11:55:36.384Z" }, - { url = "https://files.pythonhosted.org/packages/03/3c/fd11a224f73fbffa299fb9644e425f38b38b30231f7923a088dd513aabb4/ujson-5.11.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80", size = 57600, upload-time = "2025-08-20T11:55:37.692Z" }, - { url = "https://files.pythonhosted.org/packages/55/b9/405103cae24899df688a3431c776e00528bd4799e7d68820e7ebcf824f92/ujson-5.11.0-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc", size = 59791, upload-time = "2025-08-20T11:55:38.877Z" }, - { url = "https://files.pythonhosted.org/packages/17/7b/2dcbc2bbfdbf68f2368fb21ab0f6735e872290bb604c75f6e06b81edcb3f/ujson-5.11.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8254e858437c00f17cb72e7a644fc42dad0ebb21ea981b71df6e84b1072aaa7c", size = 57356, upload-time = "2025-08-20T11:55:40.036Z" }, - { url = "https://files.pythonhosted.org/packages/d1/71/fea2ca18986a366c750767b694430d5ded6b20b6985fddca72f74af38a4c/ujson-5.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1aa8a2ab482f09f6c10fba37112af5f957689a79ea598399c85009f2f29898b5", size = 1036313, upload-time = "2025-08-20T11:55:41.408Z" }, - { url = "https://files.pythonhosted.org/packages/a3/bb/d4220bd7532eac6288d8115db51710fa2d7d271250797b0bfba9f1e755af/ujson-5.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a638425d3c6eed0318df663df44480f4a40dc87cc7c6da44d221418312f6413b", size = 1195782, upload-time = "2025-08-20T11:55:43.357Z" }, - { url = "https://files.pythonhosted.org/packages/80/47/226e540aa38878ce1194454385701d82df538ccb5ff8db2cf1641dde849a/ujson-5.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e3cff632c1d78023b15f7e3a81c3745cd3f94c044d1e8fa8efbd6b161997bbc", size = 1088817, upload-time = "2025-08-20T11:55:45.262Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ec/2de9dd371d52c377abc05d2b725645326c4562fc87296a8907c7bcdf2db7/ujson-5.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:109f59885041b14ee9569bf0bb3f98579c3fa0652317b355669939e5fc5ede53", size = 55435, upload-time = "2025-08-20T11:55:50.243Z" }, - { url = "https://files.pythonhosted.org/packages/5b/a4/f611f816eac3a581d8a4372f6967c3ed41eddbae4008d1d77f223f1a4e0a/ujson-5.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a31c6b8004438e8c20fc55ac1c0e07dad42941db24176fe9acf2815971f8e752", size = 53193, upload-time = "2025-08-20T11:55:51.373Z" }, - { url = "https://files.pythonhosted.org/packages/e9/c5/c161940967184de96f5cbbbcce45b562a4bf851d60f4c677704b1770136d/ujson-5.11.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78c684fb21255b9b90320ba7e199780f653e03f6c2528663768965f4126a5b50", size = 57603, upload-time = "2025-08-20T11:55:52.583Z" }, - { url = "https://files.pythonhosted.org/packages/2b/d6/c7b2444238f5b2e2d0e3dab300b9ddc3606e4b1f0e4bed5a48157cebc792/ujson-5.11.0-cp313-cp313-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:4c9f5d6a27d035dd90a146f7761c2272cf7103de5127c9ab9c4cd39ea61e878a", size = 59794, upload-time = "2025-08-20T11:55:53.69Z" }, - { url = "https://files.pythonhosted.org/packages/fe/a3/292551f936d3d02d9af148f53e1bc04306b00a7cf1fcbb86fa0d1c887242/ujson-5.11.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:837da4d27fed5fdc1b630bd18f519744b23a0b5ada1bbde1a36ba463f2900c03", size = 57363, upload-time = "2025-08-20T11:55:54.843Z" }, - { url = "https://files.pythonhosted.org/packages/90/a6/82cfa70448831b1a9e73f882225980b5c689bf539ec6400b31656a60ea46/ujson-5.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:787aff4a84da301b7f3bac09bc696e2e5670df829c6f8ecf39916b4e7e24e701", size = 1036311, upload-time = "2025-08-20T11:55:56.197Z" }, - { url = "https://files.pythonhosted.org/packages/84/5c/96e2266be50f21e9b27acaee8ca8f23ea0b85cb998c33d4f53147687839b/ujson-5.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6dd703c3e86dc6f7044c5ac0b3ae079ed96bf297974598116aa5fb7f655c3a60", size = 1195783, upload-time = "2025-08-20T11:55:58.081Z" }, - { url = "https://files.pythonhosted.org/packages/8d/20/78abe3d808cf3bb3e76f71fca46cd208317bf461c905d79f0d26b9df20f1/ujson-5.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3772e4fe6b0c1e025ba3c50841a0ca4786825a4894c8411bf8d3afe3a8061328", size = 1088822, upload-time = "2025-08-20T11:55:59.469Z" }, - { url = "https://files.pythonhosted.org/packages/28/08/4518146f4984d112764b1dfa6fb7bad691c44a401adadaa5e23ccd930053/ujson-5.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:65724738c73645db88f70ba1f2e6fb678f913281804d5da2fd02c8c5839af302", size = 55462, upload-time = "2025-08-20T11:56:04.873Z" }, - { url = "https://files.pythonhosted.org/packages/29/37/2107b9a62168867a692654d8766b81bd2fd1e1ba13e2ec90555861e02b0c/ujson-5.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29113c003ca33ab71b1b480bde952fbab2a0b6b03a4ee4c3d71687cdcbd1a29d", size = 53246, upload-time = "2025-08-20T11:56:06.054Z" }, - { url = "https://files.pythonhosted.org/packages/9b/f8/25583c70f83788edbe3ca62ce6c1b79eff465d78dec5eb2b2b56b3e98b33/ujson-5.11.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c44c703842024d796b4c78542a6fcd5c3cb948b9fc2a73ee65b9c86a22ee3638", size = 57631, upload-time = "2025-08-20T11:56:07.374Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ca/19b3a632933a09d696f10dc1b0dfa1d692e65ad507d12340116ce4f67967/ujson-5.11.0-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:e750c436fb90edf85585f5c62a35b35082502383840962c6983403d1bd96a02c", size = 59877, upload-time = "2025-08-20T11:56:08.534Z" }, - { url = "https://files.pythonhosted.org/packages/55/7a/4572af5324ad4b2bfdd2321e898a527050290147b4ea337a79a0e4e87ec7/ujson-5.11.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f278b31a7c52eb0947b2db55a5133fbc46b6f0ef49972cd1a80843b72e135aba", size = 57363, upload-time = "2025-08-20T11:56:09.758Z" }, - { url = "https://files.pythonhosted.org/packages/7b/71/a2b8c19cf4e1efe53cf439cdf7198ac60ae15471d2f1040b490c1f0f831f/ujson-5.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ab2cb8351d976e788669c8281465d44d4e94413718af497b4e7342d7b2f78018", size = 1036394, upload-time = "2025-08-20T11:56:11.168Z" }, - { url = "https://files.pythonhosted.org/packages/7a/3e/7b98668cba3bb3735929c31b999b374ebc02c19dfa98dfebaeeb5c8597ca/ujson-5.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:090b4d11b380ae25453100b722d0609d5051ffe98f80ec52853ccf8249dfd840", size = 1195837, upload-time = "2025-08-20T11:56:12.6Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ea/8870f208c20b43571a5c409ebb2fe9b9dba5f494e9e60f9314ac01ea8f78/ujson-5.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:80017e870d882d5517d28995b62e4e518a894f932f1e242cbc802a2fd64d365c", size = 1088837, upload-time = "2025-08-20T11:56:14.15Z" }, - { url = "https://files.pythonhosted.org/packages/6e/cd/e9809b064a89fe5c4184649adeb13c1b98652db3f8518980b04227358574/ujson-5.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:de6e88f62796372fba1de973c11138f197d3e0e1d80bcb2b8aae1e826096d433", size = 55759, upload-time = "2025-08-20T11:56:18.882Z" }, - { url = "https://files.pythonhosted.org/packages/1b/be/ae26a6321179ebbb3a2e2685b9007c71bcda41ad7a77bbbe164005e956fc/ujson-5.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:49e56ef8066f11b80d620985ae36869a3ff7e4b74c3b6129182ec5d1df0255f3", size = 53634, upload-time = "2025-08-20T11:56:20.012Z" }, - { url = "https://files.pythonhosted.org/packages/ae/e9/fb4a220ee6939db099f4cfeeae796ecb91e7584ad4d445d4ca7f994a9135/ujson-5.11.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a325fd2c3a056cf6c8e023f74a0c478dd282a93141356ae7f16d5309f5ff823", size = 58547, upload-time = "2025-08-20T11:56:21.175Z" }, - { url = "https://files.pythonhosted.org/packages/bd/f8/fc4b952b8f5fea09ea3397a0bd0ad019e474b204cabcb947cead5d4d1ffc/ujson-5.11.0-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:a0af6574fc1d9d53f4ff371f58c96673e6d988ed2b5bf666a6143c782fa007e9", size = 60489, upload-time = "2025-08-20T11:56:22.342Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e5/af5491dfda4f8b77e24cf3da68ee0d1552f99a13e5c622f4cef1380925c3/ujson-5.11.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10f29e71ecf4ecd93a6610bd8efa8e7b6467454a363c3d6416db65de883eb076", size = 58035, upload-time = "2025-08-20T11:56:23.92Z" }, - { url = "https://files.pythonhosted.org/packages/c4/09/0945349dd41f25cc8c38d78ace49f14c5052c5bbb7257d2f466fa7bdb533/ujson-5.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1a0a9b76a89827a592656fe12e000cf4f12da9692f51a841a4a07aa4c7ecc41c", size = 1037212, upload-time = "2025-08-20T11:56:25.274Z" }, - { url = "https://files.pythonhosted.org/packages/49/44/8e04496acb3d5a1cbee3a54828d9652f67a37523efa3d3b18a347339680a/ujson-5.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b16930f6a0753cdc7d637b33b4e8f10d5e351e1fb83872ba6375f1e87be39746", size = 1196500, upload-time = "2025-08-20T11:56:27.517Z" }, - { url = "https://files.pythonhosted.org/packages/64/ae/4bc825860d679a0f208a19af2f39206dfd804ace2403330fdc3170334a2f/ujson-5.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:04c41afc195fd477a59db3a84d5b83a871bd648ef371cf8c6f43072d89144eef", size = 1089487, upload-time = "2025-08-20T11:56:29.07Z" }, - { url = "https://files.pythonhosted.org/packages/50/17/30275aa2933430d8c0c4ead951cc4fdb922f575a349aa0b48a6f35449e97/ujson-5.11.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:abae0fb58cc820092a0e9e8ba0051ac4583958495bfa5262a12f628249e3b362", size = 51206, upload-time = "2025-08-20T11:56:48.797Z" }, - { url = "https://files.pythonhosted.org/packages/c3/15/42b3924258eac2551f8f33fa4e35da20a06a53857ccf3d4deb5e5d7c0b6c/ujson-5.11.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39", size = 48907, upload-time = "2025-08-20T11:56:50.136Z" }, - { url = "https://files.pythonhosted.org/packages/94/7e/0519ff7955aba581d1fe1fb1ca0e452471250455d182f686db5ac9e46119/ujson-5.11.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b42c115c7c6012506e8168315150d1e3f76e7ba0f4f95616f4ee599a1372bbc", size = 50319, upload-time = "2025-08-20T11:56:51.63Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/209d90506b7d6c5873f82c5a226d7aad1a1da153364e9ebf61eff0740c33/ujson-5.11.0-pp311-pypy311_pp73-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:86baf341d90b566d61a394869ce77188cc8668f76d7bb2c311d77a00f4bdf844", size = 56584, upload-time = "2025-08-20T11:56:52.89Z" }, - { url = "https://files.pythonhosted.org/packages/e9/97/bd939bb76943cb0e1d2b692d7e68629f51c711ef60425fa5bb6968037ecd/ujson-5.11.0-pp311-pypy311_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4598bf3965fc1a936bd84034312bcbe00ba87880ef1ee33e33c1e88f2c398b49", size = 51588, upload-time = "2025-08-20T11:56:54.054Z" }, + { url = "https://files.pythonhosted.org/packages/10/22/fd22e2f6766bae934d3050517ca47d463016bd8688508d1ecc1baa18a7ad/ujson-5.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58a11cb49482f1a095a2bd9a1d81dd7c8fb5d2357f959ece85db4e46a825fd00", size = 56139, upload-time = "2026-03-11T22:18:04.591Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fd/6839adff4fc0164cbcecafa2857ba08a6eaeedd7e098d6713cb899a91383/ujson-5.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9b3cf13facf6f77c283af0e1713e5e8c47a0fe295af81326cb3cb4380212e797", size = 53836, upload-time = "2026-03-11T22:18:05.662Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b0/0c19faac62d68ceeffa83a08dc3d71b8462cf5064d0e7e0b15ba19898dad/ujson-5.12.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb94245a715b4d6e24689de12772b85329a1f9946cbf6187923a64ecdea39e65", size = 57851, upload-time = "2026-03-11T22:18:06.744Z" }, + { url = "https://files.pythonhosted.org/packages/04/f6/e7fd283788de73b86e99e08256726bb385923249c21dcd306e59d532a1a1/ujson-5.12.0-cp311-cp311-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:0fe6b8b8968e11dd9b2348bd508f0f57cf49ab3512064b36bc4117328218718e", size = 59906, upload-time = "2026-03-11T22:18:07.791Z" }, + { url = "https://files.pythonhosted.org/packages/d7/3a/b100735a2b43ee6e8fe4c883768e362f53576f964d4ea841991060aeaf35/ujson-5.12.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89e302abd3749f6d6699691747969a5d85f7c73081d5ed7e2624c7bd9721a2ab", size = 57409, upload-time = "2026-03-11T22:18:08.79Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/f97cc20c99ca304662191b883ae13ae02912ca7244710016ba0cb8a5be34/ujson-5.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0727363b05ab05ee737a28f6200dc4078bce6b0508e10bd8aab507995a15df61", size = 1037339, upload-time = "2026-03-11T22:18:10.424Z" }, + { url = "https://files.pythonhosted.org/packages/10/7a/53ddeda0ffe1420db2f9999897b3cbb920fbcff1849d1f22b196d0f34785/ujson-5.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b62cb9a7501e1f5c9ffe190485501349c33e8862dde4377df774e40b8166871f", size = 1196625, upload-time = "2026-03-11T22:18:11.82Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1a/4c64a6bef522e9baf195dd5be151bc815cd4896c50c6e2489599edcda85f/ujson-5.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a6ec5bf6bc361f2f0f9644907a36ce527715b488988a8df534120e5c34eeda94", size = 1089669, upload-time = "2026-03-11T22:18:13.343Z" }, + { url = "https://files.pythonhosted.org/packages/84/f6/ac763d2108d28f3a40bb3ae7d2fafab52ca31b36c2908a4ad02cd3ceba2a/ujson-5.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:09b4beff9cc91d445d5818632907b85fb06943b61cb346919ce202668bf6794a", size = 56326, upload-time = "2026-03-11T22:18:18.467Z" }, + { url = "https://files.pythonhosted.org/packages/25/46/d0b3af64dcdc549f9996521c8be6d860ac843a18a190ffc8affeb7259687/ujson-5.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca0c7ce828bb76ab78b3991904b477c2fd0f711d7815c252d1ef28ff9450b052", size = 53910, upload-time = "2026-03-11T22:18:19.502Z" }, + { url = "https://files.pythonhosted.org/packages/9a/10/853c723bcabc3e9825a079019055fc99e71b85c6bae600607a2b9d31d18d/ujson-5.12.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2d79c6635ccffcbfc1d5c045874ba36b594589be81d50d43472570bb8de9c57", size = 57754, upload-time = "2026-03-11T22:18:20.874Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c6/6e024830d988f521f144ead641981c1f7a82c17ad1927c22de3242565f5c/ujson-5.12.0-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:7e07f6f644d2c44d53b7a320a084eef98063651912c1b9449b5f45fcbdc6ccd2", size = 59936, upload-time = "2026-03-11T22:18:21.924Z" }, + { url = "https://files.pythonhosted.org/packages/34/c9/c5f236af5abe06b720b40b88819d00d10182d2247b1664e487b3ed9229cf/ujson-5.12.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:085b6ce182cdd6657481c7c4003a417e0655c4f6e58b76f26ee18f0ae21db827", size = 57463, upload-time = "2026-03-11T22:18:22.924Z" }, + { url = "https://files.pythonhosted.org/packages/ae/04/41342d9ef68e793a87d84e4531a150c2b682f3bcedfe59a7a5e3f73e9213/ujson-5.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:16b4fe9c97dc605f5e1887a9e1224287291e35c56cbc379f8aa44b6b7bcfe2bb", size = 1037239, upload-time = "2026-03-11T22:18:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/d4/81/dc2b7617d5812670d4ff4a42f6dd77926430ee52df0dedb2aec7990b2034/ujson-5.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0d2e8db5ade3736a163906154ca686203acc7d1d30736cbf577c730d13653d84", size = 1196713, upload-time = "2026-03-11T22:18:25.391Z" }, + { url = "https://files.pythonhosted.org/packages/b6/9c/80acff0504f92459ed69e80a176286e32ca0147ac6a8252cd0659aad3227/ujson-5.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93bc91fdadcf046da37a214eaa714574e7e9b1913568e93bb09527b2ceb7f759", size = 1089742, upload-time = "2026-03-11T22:18:26.738Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f1/0ef0eeab1db8493e1833c8b440fe32cf7538f7afa6e7f7c7e9f62cef464d/ujson-5.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:15d416440148f3e56b9b244fdaf8a09fcf5a72e4944b8e119f5bf60417a2bfc8", size = 56331, upload-time = "2026-03-11T22:18:31.539Z" }, + { url = "https://files.pythonhosted.org/packages/b0/2f/9159f6f399b3f572d20847a2b80d133e3a03c14712b0da4971a36879fb64/ujson-5.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0dd3676ea0837cd70ea1879765e9e9f6be063be0436de9b3ea4b775caf83654", size = 53910, upload-time = "2026-03-11T22:18:32.829Z" }, + { url = "https://files.pythonhosted.org/packages/e5/a9/f96376818d71495d1a4be19a0ab6acf0cc01dd8826553734c3d4dac685b2/ujson-5.12.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7bbf05c38debc90d1a195b11340cc85cb43ab3e753dc47558a3a84a38cbc72da", size = 57757, upload-time = "2026-03-11T22:18:33.866Z" }, + { url = "https://files.pythonhosted.org/packages/98/8d/dd4a151caac6fdcb77f024fbe7f09d465ebf347a628ed6dd581a0a7f6364/ujson-5.12.0-cp313-cp313-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:3c2f947e55d3c7cfe124dd4521ee481516f3007d13c6ad4bf6aeb722e190eb1b", size = 59940, upload-time = "2026-03-11T22:18:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/c7/17/0d36c2fee0a8d8dc37b011ccd5bbdcfaff8b8ec2bcfc5be998661cdc935b/ujson-5.12.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ea6206043385343aff0b7da65cf73677f6f5e50de8f1c879e557f4298cac36a", size = 57465, upload-time = "2026-03-11T22:18:36.644Z" }, + { url = "https://files.pythonhosted.org/packages/8c/04/b0ee4a4b643a01ba398441da1e357480595edb37c6c94c508dbe0eb9eb60/ujson-5.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb349dbba57c76eec25e5917e07f35aabaf0a33b9e67fc13d188002500106487", size = 1037236, upload-time = "2026-03-11T22:18:37.743Z" }, + { url = "https://files.pythonhosted.org/packages/2d/08/0e7780d0bbb48fe57ded91f550144bcc99c03b5360bf2886dd0dae0ea8f5/ujson-5.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:937794042342006f707837f38d721426b11b0774d327a2a45c0bd389eb750a87", size = 1196717, upload-time = "2026-03-11T22:18:39.101Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4c/e0e34107715bb4dd2d4dcc1ce244d2f074638837adf38aff85a37506efe4/ujson-5.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6ad57654570464eb1b040b5c353dee442608e06cff9102b8fcb105565a44c9ed", size = 1089748, upload-time = "2026-03-11T22:18:40.473Z" }, + { url = "https://files.pythonhosted.org/packages/10/bd/9a8d693254bada62bfea75a507e014afcfdb6b9d047b6f8dd134bfefaf67/ujson-5.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85833bca01aa5cae326ac759276dc175c5fa3f7b3733b7d543cf27f2df12d1ef", size = 56499, upload-time = "2026-03-11T22:18:45.431Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2d/285a83df8176e18dcd675d1a4cff8f7620f003f30903ea43929406e98986/ujson-5.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d22cad98c2a10bbf6aa083a8980db6ed90d4285a841c4de892890c2b28286ef9", size = 53998, upload-time = "2026-03-11T22:18:47.184Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8b/e2f09e16dabfa91f6a84555df34a4329fa7621e92ed054d170b9054b9bb2/ujson-5.12.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99cc80facad240b0c2fb5a633044420878aac87a8e7c348b9486450cba93f27c", size = 57783, upload-time = "2026-03-11T22:18:48.271Z" }, + { url = "https://files.pythonhosted.org/packages/68/fb/ba1d06f3658a0c36d0ab3869ec3914f202bad0a9bde92654e41516c7bb13/ujson-5.12.0-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:d1831c07bd4dce53c4b666fa846c7eba4b7c414f2e641a4585b7f50b72f502dc", size = 60011, upload-time = "2026-03-11T22:18:49.284Z" }, + { url = "https://files.pythonhosted.org/packages/64/2b/3e322bf82d926d9857206cd5820438d78392d1f523dacecb8bd899952f73/ujson-5.12.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e00cec383eab2406c9e006bd4edb55d284e94bb943fda558326048178d26961", size = 57465, upload-time = "2026-03-11T22:18:50.584Z" }, + { url = "https://files.pythonhosted.org/packages/e9/fd/af72d69603f9885e5136509a529a4f6d88bf652b457263ff96aefcd3ab7d/ujson-5.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f19b3af31d02a2e79c5f9a6deaab0fb3c116456aeb9277d11720ad433de6dfc6", size = 1037275, upload-time = "2026-03-11T22:18:51.998Z" }, + { url = "https://files.pythonhosted.org/packages/9c/a7/a2411ec81aef7872578e56304c3e41b3a544a9809e95c8e1df46923fc40b/ujson-5.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bacbd3c69862478cbe1c7ed4325caedec580d8acf31b8ee1b9a1e02a56295cad", size = 1196758, upload-time = "2026-03-11T22:18:53.548Z" }, + { url = "https://files.pythonhosted.org/packages/ed/85/aa18ae175dd03a118555aa14304d4f466f9db61b924c97c6f84388ecacb1/ujson-5.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94c5f1621cbcab83c03be46441f090b68b9f307b6c7ec44d4e3f6d5997383df4", size = 1089760, upload-time = "2026-03-11T22:18:55.336Z" }, + { url = "https://files.pythonhosted.org/packages/c3/71/9b4dacb177d3509077e50497222d39eec04c8b41edb1471efc764d645237/ujson-5.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7ddb08b3c2f9213df1f2e3eb2fbea4963d80ec0f8de21f0b59898e34f3b3d96d", size = 56845, upload-time = "2026-03-11T22:18:59.629Z" }, + { url = "https://files.pythonhosted.org/packages/24/c2/8abffa3be1f3d605c4a62445fab232b3e7681512ce941c6b23014f404d36/ujson-5.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a3ae28f0b209be5af50b54ca3e2123a3de3a57d87b75f1e5aa3d7961e041983", size = 54463, upload-time = "2026-03-11T22:19:00.697Z" }, + { url = "https://files.pythonhosted.org/packages/db/2e/60114a35d1d6796eb428f7affcba00a921831ff604a37d9142c3d8bbe5c5/ujson-5.12.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30ad4359413c8821cc7b3707f7ca38aa8bc852ba3b9c5a759ee2d7740157315", size = 58689, upload-time = "2026-03-11T22:19:01.739Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ad/010925c2116c21ce119f9c2ff18d01f48a19ade3ff4c5795da03ce5829fc/ujson-5.12.0-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:02f93da7a4115e24f886b04fd56df1ee8741c2ce4ea491b7ab3152f744ad8f8e", size = 60618, upload-time = "2026-03-11T22:19:03.101Z" }, + { url = "https://files.pythonhosted.org/packages/9b/74/db7f638bf20282b1dccf454386cbd483faaaed3cdbb9cb27e06f74bb109e/ujson-5.12.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ff4ede90ed771140caa7e1890de17431763a483c54b3c1f88bd30f0cc1affc0", size = 58151, upload-time = "2026-03-11T22:19:04.175Z" }, + { url = "https://files.pythonhosted.org/packages/9c/7e/3ebaecfa70a2e8ce623db8e21bd5cb05d42a5ef943bcbb3309d71b5de68d/ujson-5.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bf9cc97f05048ac8f3e02cd58f0fe62b901453c24345bfde287f4305dcc31c", size = 1038117, upload-time = "2026-03-11T22:19:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/2e/aa/e073eda7f0036c2973b28db7bb99faba17a932e7b52d801f9bb3e726271f/ujson-5.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2324d9a0502317ffc35d38e153c1b2fa9610ae03775c9d0f8d0cca7b8572b04e", size = 1197434, upload-time = "2026-03-11T22:19:06.92Z" }, + { url = "https://files.pythonhosted.org/packages/1c/01/b9a13f058fdd50c746b192c4447ca8d6352e696dcda912ccee10f032ff85/ujson-5.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:50524f4f6a1c839714dbaff5386a1afb245d2d5ec8213a01fbc99cea7307811e", size = 1090401, upload-time = "2026-03-11T22:19:08.383Z" }, + { url = "https://files.pythonhosted.org/packages/95/3c/5ee154d505d1aad2debc4ba38b1a60ae1949b26cdb5fa070e85e320d6b64/ujson-5.12.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:bf85a00ac3b56a1e7a19c5be7b02b5180a0895ac4d3c234d717a55e86960691c", size = 54494, upload-time = "2026-03-11T22:19:13.035Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b3/9496ec399ec921e434a93b340bd5052999030b7ac364be4cbe5365ac6b20/ujson-5.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:64df53eef4ac857eb5816a56e2885ccf0d7dff6333c94065c93b39c51063e01d", size = 57999, upload-time = "2026-03-11T22:19:14.385Z" }, + { url = "https://files.pythonhosted.org/packages/0e/da/e9ae98133336e7c0d50b43626c3f2327937cecfa354d844e02ac17379ed1/ujson-5.12.0-graalpy312-graalpy250_312_native-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c0aed6a4439994c9666fb8a5b6c4eac94d4ef6ddc95f9b806a599ef83547e3b", size = 54518, upload-time = "2026-03-11T22:19:15.4Z" }, + { url = "https://files.pythonhosted.org/packages/58/10/978d89dded6bb1558cd46ba78f4351198bd2346db8a8ee1a94119022ce40/ujson-5.12.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efae5df7a8cc8bdb1037b0f786b044ce281081441df5418c3a0f0e1f86fe7bb3", size = 55736, upload-time = "2026-03-11T22:19:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/19/fa/f4a957dddb99bd68c8be91928c0b6fefa7aa8aafc92c93f5d1e8b32f6702/ujson-5.12.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:871c0e5102e47995b0e37e8df7819a894a6c3da0d097545cd1f9f1f7d7079927", size = 52145, upload-time = "2026-03-11T22:19:18.566Z" }, + { url = "https://files.pythonhosted.org/packages/55/6e/50b5cf612de1ca06c7effdc5a5d7e815774dee85a5858f1882c425553b82/ujson-5.12.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:56ba3f7abbd6b0bb282a544dc38406d1a188d8bb9164f49fdb9c2fee62cb29da", size = 49577, upload-time = "2026-03-11T22:19:19.627Z" }, + { url = "https://files.pythonhosted.org/packages/6e/24/b6713fa9897774502cd4c2d6955bb4933349f7d84c3aa805531c382a4209/ujson-5.12.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c5a52987a990eb1bae55f9000994f1afdb0326c154fb089992f839ab3c30688", size = 50807, upload-time = "2026-03-11T22:19:20.778Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b6/c0e0f7901180ef80d16f3a4bccb5dc8b01515a717336a62928963a07b80b/ujson-5.12.0-pp311-pypy311_pp73-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:adf28d13a33f9d750fe7a78fb481cac298fa257d8863d8727b2ea4455ea41235", size = 56972, upload-time = "2026-03-11T22:19:21.84Z" }, + { url = "https://files.pythonhosted.org/packages/02/a9/05d91b4295ea7239151eb08cf240e5a2ba969012fda50bc27bcb1ea9cd71/ujson-5.12.0-pp311-pypy311_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51acc750ec7a2df786cdc868fb16fa04abd6269a01d58cf59bafc57978773d8e", size = 52045, upload-time = "2026-03-11T22:19:22.879Z" }, ] [[package]] From b6501b0c47a1d106fe38504f3b8f1bed6e6fba8e Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 18 Mar 2026 09:51:48 -0700 Subject: [PATCH 043/113] Fix: avoid moving files if already moved (#12389) --- src/documents/signals/handlers.py | 58 ++++++++++++++++++----- src/documents/tests/test_file_handling.py | 47 ++++++++++++++++++ 2 files changed, 93 insertions(+), 12 deletions(-) diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index 5be8855e6..160e6021b 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -1,5 +1,6 @@ from __future__ import annotations +import hashlib import logging import shutil from pathlib import Path @@ -391,6 +392,14 @@ class CannotMoveFilesException(Exception): pass +def _path_matches_checksum(path: Path, checksum: str | None) -> bool: + if checksum is None or not path.is_file(): + return False + + with path.open("rb") as f: + return hashlib.md5(f.read()).hexdigest() == checksum + + def _filename_template_uses_custom_fields(doc: Document) -> bool: template = None if doc.storage_path is not None: @@ -461,10 +470,12 @@ def update_filename_and_move_files( old_filename = instance.filename old_source_path = instance.source_path move_original = False + original_already_moved = False old_archive_filename = instance.archive_filename old_archive_path = instance.archive_path move_archive = False + archive_already_moved = False candidate_filename = generate_filename(instance) if len(str(candidate_filename)) > Document.MAX_STORED_FILENAME_LENGTH: @@ -485,14 +496,23 @@ def update_filename_and_move_files( candidate_source_path.exists() and candidate_source_path != old_source_path ): - # Only fall back to unique search when there is an actual conflict - new_filename = generate_unique_filename(instance) + if not old_source_path.is_file() and _path_matches_checksum( + candidate_source_path, + instance.checksum, + ): + new_filename = candidate_filename + original_already_moved = True + else: + # Only fall back to unique search when there is an actual conflict + new_filename = generate_unique_filename(instance) else: new_filename = candidate_filename # Need to convert to string to be able to save it to the db instance.filename = str(new_filename) - move_original = old_filename != instance.filename + move_original = ( + old_filename != instance.filename and not original_already_moved + ) if instance.has_archive_version: archive_candidate = generate_filename(instance, archive_filename=True) @@ -513,24 +533,38 @@ def update_filename_and_move_files( archive_candidate_path.exists() and archive_candidate_path != old_archive_path ): - new_archive_filename = generate_unique_filename( - instance, - archive_filename=True, - ) + if not old_archive_path.is_file() and _path_matches_checksum( + archive_candidate_path, + instance.archive_checksum, + ): + new_archive_filename = archive_candidate + archive_already_moved = True + else: + new_archive_filename = generate_unique_filename( + instance, + archive_filename=True, + ) else: new_archive_filename = archive_candidate instance.archive_filename = str(new_archive_filename) - move_archive = old_archive_filename != instance.archive_filename + move_archive = ( + old_archive_filename != instance.archive_filename + and not archive_already_moved + ) else: move_archive = False if not move_original and not move_archive: - # Just update modified. Also, don't save() here to prevent infinite recursion. - Document.objects.filter(pk=instance.pk).update( - modified=timezone.now(), - ) + updates = {"modified": timezone.now()} + if old_filename != instance.filename: + updates["filename"] = instance.filename + if old_archive_filename != instance.archive_filename: + updates["archive_filename"] = instance.archive_filename + + # Don't save() here to prevent infinite recursion. + Document.objects.filter(pk=instance.pk).update(**updates) return if move_original: diff --git a/src/documents/tests/test_file_handling.py b/src/documents/tests/test_file_handling.py index 9430bf669..4e09643b5 100644 --- a/src/documents/tests/test_file_handling.py +++ b/src/documents/tests/test_file_handling.py @@ -1,4 +1,5 @@ import datetime +import hashlib import logging import tempfile from pathlib import Path @@ -166,6 +167,52 @@ class TestFileHandling(DirectoriesMixin, FileSystemAssertsMixin, TestCase): ) self.assertEqual(document.filename, "none/none.pdf") + @override_settings(FILENAME_FORMAT=None) + def test_stale_save_recovers_already_moved_files(self) -> None: + old_storage_path = StoragePath.objects.create( + name="old-path", + path="old/{{title}}", + ) + new_storage_path = StoragePath.objects.create( + name="new-path", + path="new/{{title}}", + ) + original_bytes = b"original" + archive_bytes = b"archive" + + doc = Document.objects.create( + title="document", + mime_type="application/pdf", + checksum=hashlib.md5(original_bytes).hexdigest(), + archive_checksum=hashlib.md5(archive_bytes).hexdigest(), + filename="old/document.pdf", + archive_filename="old/document.pdf", + storage_path=old_storage_path, + ) + create_source_path_directory(doc.source_path) + doc.source_path.write_bytes(original_bytes) + create_source_path_directory(doc.archive_path) + doc.archive_path.write_bytes(archive_bytes) + + stale_doc = Document.objects.get(pk=doc.pk) + fresh_doc = Document.objects.get(pk=doc.pk) + fresh_doc.storage_path = new_storage_path + fresh_doc.save() + doc.refresh_from_db() + self.assertEqual(doc.filename, "new/document.pdf") + self.assertEqual(doc.archive_filename, "new/document.pdf") + + stale_doc.storage_path = new_storage_path + stale_doc.save() + + doc.refresh_from_db() + self.assertEqual(doc.filename, "new/document.pdf") + self.assertEqual(doc.archive_filename, "new/document.pdf") + self.assertIsFile(doc.source_path) + self.assertIsFile(doc.archive_path) + self.assertIsNotFile(settings.ORIGINALS_DIR / "old" / "document.pdf") + self.assertIsNotFile(settings.ARCHIVE_DIR / "old" / "document.pdf") + @override_settings(FILENAME_FORMAT="{correspondent}/{correspondent}") def test_document_delete(self): document = Document() From 95dea787f20ad616a14b54990190cf8de07597c4 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Wed, 18 Mar 2026 10:38:45 -0700 Subject: [PATCH 044/113] Fix: don't try to usermod/groupmod when non-root + update docs (#12365) (#12391) --- .../s6-overlay/s6-rc.d/init-modify-user/run | 11 +++++++++ docs/setup.md | 23 +++++++------------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run index aa617355d..f8430aee2 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run @@ -2,6 +2,17 @@ # shellcheck shell=bash declare -r log_prefix="[init-user]" +# When the container is started as a non-root user (e.g. via `user: 999:999` +# in Docker Compose), usermod/groupmod require root and are meaningless. +# USERMAP_* variables only apply to the root-started path. +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + if [[ -n "${USERMAP_UID}" || -n "${USERMAP_GID}" ]]; then + echo "${log_prefix} WARNING: USERMAP_UID/USERMAP_GID are set but have no effect when the container is started as a non-root user" + fi + echo "${log_prefix} Running as non-root user ($(id --user):$(id --group)), skipping UID/GID remapping" + exit 0 +fi + declare -r usermap_original_uid=$(id -u paperless) declare -r usermap_original_gid=$(id -g paperless) declare -r usermap_new_uid=${USERMAP_UID:-$usermap_original_uid} diff --git a/docs/setup.md b/docs/setup.md index 3628eee68..28cd75c7f 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -140,24 +140,17 @@ a [superuser](usage.md#superusers) account. !!! warning - It is currently not possible to run the container rootless if additional languages are specified via `PAPERLESS_OCR_LANGUAGES`. + It is not possible to run the container rootless if additional languages are specified via `PAPERLESS_OCR_LANGUAGES`. -If you want to run Paperless as a rootless container, make this -change in `docker-compose.yml`: +If you want to run Paperless as a rootless container, set `user:` in `docker-compose.yml` to the UID and GID of your host user (use `id -u` and `id -g` to find these values). The container process starts directly as that user with no internal privilege remapping: -- Set the `user` running the container to map to the `paperless` - user in the container. This value (`user_id` below) should be - the same ID that `USERMAP_UID` and `USERMAP_GID` are set to in - `docker-compose.env`. See `USERMAP_UID` and `USERMAP_GID` - [here](configuration.md#docker). +```yaml +webserver: + image: ghcr.io/paperless-ngx/paperless-ngx:latest + user: '1000:1000' +``` -Your entry for Paperless should contain something like: - -> ``` -> webserver: -> image: ghcr.io/paperless-ngx/paperless-ngx:latest -> user: -> ``` +Do not combine this with `USERMAP_UID` or `USERMAP_GID`, which are intended for the non-rootless case described in step 3. **File systems without inotify support (e.g. NFS)** From 0f7c02de5e8391d49e08031749ae95785956b670 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Wed, 18 Mar 2026 13:31:09 -0700 Subject: [PATCH 045/113] Fix: test: add regression test for workflow save clobbering filename (#12390) Add test_workflow_document_updated_does_not_overwrite_filename to verify that run_workflows (DOCUMENT_UPDATED path) does not revert a DB filename that was updated by a concurrent bulk_update_documents task's update_filename_and_move_files call. The test replicates the race window by: - Updating the DB filename directly (simulating BUD-1 completing) - Mocking refresh_from_db so the stale in-memory filename persists - Asserting the DB filename is not clobbered after run_workflows Relates to: https://github.com/paperless-ngx/paperless-ngx/issues/12386 Co-authored-by: Claude Sonnet 4.6 --- src/documents/signals/handlers.py | 23 +++++++++-- src/documents/tests/test_workflows.py | 58 +++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index 160e6021b..f8d670e30 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -867,10 +867,25 @@ def run_workflows( if not use_overrides: # limit title to 128 characters document.title = document.title[:128] - # Make sure the filename and archive filename are accurate - document.refresh_from_db(fields=["filename", "archive_filename"]) - # save first before setting tags - document.save() + # Save only the fields that workflow actions can set directly. + # Deliberately excludes filename and archive_filename — those are + # managed exclusively by update_filename_and_move_files via the + # post_save signal. Writing stale in-memory values here would revert + # a concurrent update_filename_and_move_files DB write, leaving the + # DB pointing at the old path while the file is already at the new + # one (see: https://github.com/paperless-ngx/paperless-ngx/issues/12386). + # modified has auto_now=True but is not auto-added when update_fields + # is specified, so it must be listed explicitly. + document.save( + update_fields=[ + "title", + "correspondent", + "document_type", + "storage_path", + "owner", + "modified", + ], + ) document.tags.set(doc_tag_ids) WorkflowRun.objects.create( diff --git a/src/documents/tests/test_workflows.py b/src/documents/tests/test_workflows.py index ba1e72e1f..924533698 100644 --- a/src/documents/tests/test_workflows.py +++ b/src/documents/tests/test_workflows.py @@ -956,6 +956,64 @@ class TestWorkflows( self.assertEqual(Path(doc.filename), expected_filename) self.assertTrue(doc.source_path.is_file()) + def test_workflow_document_updated_does_not_overwrite_filename(self) -> None: + """ + GIVEN: + - A document whose filename has been updated in the DB by a concurrent + bulk_update_documents task (simulating update_filename_and_move_files + completing and writing the new filename to the DB) + - A stale in-memory document instance still holding the old filename + - An active DOCUMENT_UPDATED workflow + WHEN: + - run_workflows is called with the stale in-memory instance + (as would happen in the second concurrent bulk_update_documents task) + THEN: + - The DB filename is NOT overwritten with the stale in-memory value + (regression test for GH #12386 — the race window between + refresh_from_db and document.save in run_workflows) + """ + trigger = WorkflowTrigger.objects.create( + type=WorkflowTrigger.WorkflowTriggerType.DOCUMENT_UPDATED, + ) + action = WorkflowAction.objects.create( + type=WorkflowAction.WorkflowActionType.ASSIGNMENT, + assign_title="Updated by workflow", + ) + workflow = Workflow.objects.create(name="Race condition test workflow", order=0) + workflow.triggers.add(trigger) + workflow.actions.add(action) + workflow.save() + + doc = Document.objects.create( + title="race condition test", + mime_type="application/pdf", + checksum="racecondition123", + original_filename="old.pdf", + filename="old/path/old.pdf", + ) + + # Simulate BUD-1 completing update_filename_and_move_files: + # the DB now holds the new filename while BUD-2's in-memory instance is stale. + new_filename = "new/path/new.pdf" + Document.global_objects.filter(pk=doc.pk).update(filename=new_filename) + + # The stale instance still has filename="old/path/old.pdf" in memory. + # Mock refresh_from_db so the stale value persists through run_workflows, + # replicating the race window between refresh and save. + # Mock update_filename_and_move_files to prevent file-not-found errors + # since we are only testing DB state here. + with ( + mock.patch( + "documents.signals.handlers.update_filename_and_move_files", + ), + mock.patch.object(Document, "refresh_from_db"), + ): + run_workflows(WorkflowTrigger.WorkflowTriggerType.DOCUMENT_UPDATED, doc) + + # The DB filename must not have been reverted to the stale old value. + doc.refresh_from_db() + self.assertEqual(doc.filename, new_filename) + def test_document_added_workflow(self): trigger = WorkflowTrigger.objects.create( type=WorkflowTrigger.WorkflowTriggerType.DOCUMENT_ADDED, From b0bb31654ffcf398ec3da516b325077dc6223680 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Wed, 18 Mar 2026 15:53:34 -0700 Subject: [PATCH 046/113] Bumps zensical to 0.0.26 to resolve the wheel building it tries to do (#12392) --- uv.lock | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/uv.lock b/uv.lock index c700b0339..0698948c5 100644 --- a/uv.lock +++ b/uv.lock @@ -5643,7 +5643,7 @@ wheels = [ [[package]] name = "zensical" -version = "0.0.25" +version = "0.0.26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -5653,16 +5653,18 @@ dependencies = [ { name = "pymdown-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/69/4b49ce778059b4888ea854cf4db40e1b2080fe828b7280198999048d6fce/zensical-0.0.25.tar.gz", hash = "sha256:462808359d949469fa7209d367f2e38ed796744074e5dadeac9ddfef0c44be25", size = 3841318, upload-time = "2026-03-10T19:32:35.048Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/1f/0a0b1ce8e0553a9dabaedc736d0f34b11fc33d71ff46bce44d674996d41f/zensical-0.0.26.tar.gz", hash = "sha256:f4d9c8403df25fbb3d6dd9577122dc2f23c73a2d16ab778bb7d40370dd71e987", size = 3841473, upload-time = "2026-03-11T09:51:38.838Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/7c/f6f5eb1903b5a557d98f48d09e3d4bc33033ed78508986250dabe5387d91/zensical-0.0.25-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c481dd16a968f97d43f6b596e10e941d8294ed446b8b117235a6b149c0d6965", size = 12263809, upload-time = "2026-03-10T19:31:49.907Z" }, - { url = "https://files.pythonhosted.org/packages/37/b2/3f8be43526a68c52c84f099887d1903c2526a22aa4344378a72671bf6070/zensical-0.0.25-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:ae51751e8b11f50df04641b40c1e07d4b703fed9d9548b16dbcb0cf260da229a", size = 12146107, upload-time = "2026-03-10T19:31:53.576Z" }, - { url = "https://files.pythonhosted.org/packages/16/59/89a3a715b1fe538b4b5ee382d71b86bd06d4f351383e36eefd36e824c150/zensical-0.0.25-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56ccf88245bd0b3684bf313384164972f1890802d4a51dd9b7ae6ea126a810bc", size = 12505963, upload-time = "2026-03-10T19:31:57.517Z" }, - { url = "https://files.pythonhosted.org/packages/ad/5b/cc0bada291818bdf36be777af9c16f655a021f16578a31e6fb233affca03/zensical-0.0.25-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d2f4e58bcc06f3e50cc518666a0c9d8f82246255a42b37bb1d7c7343e214fbac", size = 12455496, upload-time = "2026-03-10T19:32:02.37Z" }, - { url = "https://files.pythonhosted.org/packages/e9/16/ff91ee42d8b14a1b63e2e0d74922e6c4b0ec1da3819377f20b7ca2742f76/zensical-0.0.25-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:69895273b1319a45667abac543c3e5065ff2a646d9a698eae056b6a35b57e00a", size = 12683609, upload-time = "2026-03-10T19:32:06.144Z" }, - { url = "https://files.pythonhosted.org/packages/01/fd/a85acc4234d31658f4bb54c4900edfc8d4227ad83e4c79de92cfdcd05c79/zensical-0.0.25-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c51a00ae1de2e9647bfd0ea1965b223fb3891111a00930416e1277e06f3ab3c4", size = 12725420, upload-time = "2026-03-10T19:32:09.938Z" }, - { url = "https://files.pythonhosted.org/packages/37/c7/896c91e457af3d5769d8d70d2bd66a8a287ad129879b51ab5e985ac68889/zensical-0.0.25-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:28e56ec1f06ea66227c1f5af9d7a6ed3bd4246e6af1e45d29e09f40251b52e1f", size = 12861970, upload-time = "2026-03-10T19:32:13.471Z" }, - { url = "https://files.pythonhosted.org/packages/41/06/5d804cf19e4e093394674d9f213546dc1364a34fd85d81a1153b05733c5a/zensical-0.0.25-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d2d5997baad148b65eb0de6baf81973110538e01a3f64467d06d0c5ac23b0d70", size = 12816321, upload-time = "2026-03-10T19:32:17.031Z" }, + { url = "https://files.pythonhosted.org/packages/41/58/fa3d9538ff1ea8cf4a193edbf47254f374fa7983fcfa876bb4336d72c53a/zensical-0.0.26-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7823b25afe7d36099253aa59d643abaac940f80fd015d4a37954210c87d3da56", size = 12263607, upload-time = "2026-03-11T09:50:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6e/44a3b21bd3569b9cad203364d73a956768d28a879e4c2be91bd889f74d2c/zensical-0.0.26-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c0254814382cdd3769bc7689180d09bf41de8879871dd736dc52d5f141e8ada7", size = 12144562, upload-time = "2026-03-11T09:50:53.685Z" }, + { url = "https://files.pythonhosted.org/packages/07/ae/31b9885745b3e7ef23a3ae7f175b879807288d11b3fb7e2d3c119c916258/zensical-0.0.26-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8e601b2bbd239e564b04cf235eefb9777e7dfc7e1857b8871d6cdcfb577aa0", size = 12506728, upload-time = "2026-03-11T09:50:57.775Z" }, + { url = "https://files.pythonhosted.org/packages/bd/93/f5291e2c47076474f181f6eef35ef0428117d3f192da4358c0511e2ce09e/zensical-0.0.26-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2dc43c7e6c25d9724fc0450f0273ca4e5e2506eeb7f89f52f1405a592896ca3b", size = 12454975, upload-time = "2026-03-11T09:51:01.514Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2e/61cac4f2ebad31dab768eb02753ffde9e56d4d34b8f876b949bf516fbd50/zensical-0.0.26-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24ed236d1254cc474c19227eaa3670a1ccf921af53134ec5542b05853bdcd59c", size = 12791930, upload-time = "2026-03-11T09:51:05.162Z" }, + { url = "https://files.pythonhosted.org/packages/02/86/51995d1ed2dd6ad8a1a70bcdf3c5eb16b50e62ea70e638d454a6b9061c4d/zensical-0.0.26-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1110147710d1dd025d932c4a7eada836bdf079c91b70fb0ae5b202e14b094617", size = 12548166, upload-time = "2026-03-11T09:51:09.218Z" }, + { url = "https://files.pythonhosted.org/packages/3d/93/decbafdbfc77170cbc3851464632390846e9aaf45e743c8dd5a24d5673e9/zensical-0.0.26-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7d21596a785428cdebc20859bd94a05334abe14ad24f1bb9cd80d19219e3c220", size = 12682103, upload-time = "2026-03-11T09:51:12.68Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e2/391d2d08dde621177da069a796a886b549fefb15734aeeb6e696af99b662/zensical-0.0.26-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:680a3c7bb71499b4da784d6072e44b3d7b8c0df3ce9bbd9974e24bd8058c2736", size = 12724219, upload-time = "2026-03-11T09:51:17.32Z" }, + { url = "https://files.pythonhosted.org/packages/80/2a/21b40c5c40a67da8a841f278d61dbd8d5e035e489de6fe1cef5f4e211b4f/zensical-0.0.26-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:e3294a79f98218b6fc2219232e166aa0932ae4dad58f6c8dbc0dbe0ecbff9c25", size = 12862117, upload-time = "2026-03-11T09:51:22.161Z" }, + { url = "https://files.pythonhosted.org/packages/51/76/e1910d6d75d207654c867b8efbda6822dedda9fed3601bf4a864a1f4fe26/zensical-0.0.26-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:630229587df1fb47be184a4a69d0772ce59a44cd2c481ae9f7e8852fffaff11e", size = 12815714, upload-time = "2026-03-11T09:51:26.24Z" }, ] [[package]] From 2cbe6ae892f3386aab3ff300393bb01b76a58011 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:19:46 -0700 Subject: [PATCH 047/113] Feature: Convert remote AI parser to plugin system (#12334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactor: move remote parser, test, and sample to paperless.parsers Relocates three files to their new homes in the parser plugin system: - src/paperless_remote/parsers.py → src/paperless/parsers/remote.py - src/paperless_remote/tests/test_parser.py → src/paperless/tests/parsers/test_remote_parser.py - src/paperless_remote/tests/samples/simple-digital.pdf → src/paperless/tests/samples/remote/simple-digital.pdf Content and imports will be updated in the follow-up commit that rewrites the parser to the new ParserProtocol interface. Co-Authored-By: Claude Sonnet 4.6 * Feature: migrate RemoteDocumentParser to ParserProtocol interface Rewrites the remote OCR parser to the new plugin system contract: - `supported_mime_types()` is now a classmethod that always returns the full set of 7 MIME types; the old instance-method hack (returning {} when unconfigured) is removed - `score()` classmethod returns None when no remote engine is configured (making the parser invisible to the registry), and 20 when active — higher than the tesseract default of 10 so the remote engine takes priority when both are available - No longer inherits from RasterisedDocumentParser; inherits no parser class at all — just implements the protocol directly - `can_produce_archive = True`; `requires_pdf_rendition = False` - `_azure_ai_vision_parse()` takes explicit config arg; API client created and closed within the method - `get_page_count()` returns the PDF page count for application/pdf, delegating to the new `get_page_count_for_pdf()` utility - `extract_metadata()` delegates to `extract_pdf_metadata()` for PDFs; returns [] for all other MIME types New files: - `src/paperless/parsers/utils.py` — shared `extract_pdf_metadata()` and `get_page_count_for_pdf()` utilities (pikepdf-based); both the remote and tesseract parsers will use these going forward - `src/paperless/tests/parsers/test_remote_parser.py` — 42 pytest-style tests using pytest-django `settings` and pytest-mock `mocker` fixtures - `src/paperless/tests/parsers/conftest.py` — remote parser instance, sample-file, and settings-helper fixtures Co-Authored-By: Claude Sonnet 4.6 * Refactor: use fixture factory and usefixtures in remote parser tests - `_make_azure_mock` helper promoted to `make_azure_mock` factory fixture in conftest.py; tests call `make_azure_mock()` or `make_azure_mock("custom text")` instead of a module-level function - `azure_settings` and `no_engine_settings` applied via `@pytest.mark.usefixtures` wherever their value is not referenced inside the test body; `TestRemoteParserParseError` marked at the class level since all three tests need the same setting Co-Authored-By: Claude Sonnet 4.6 * Refactor: improve remote parser test fixture structure - make_azure_mock moved from conftest.py back into test_remote_parser.py; it is specific to that module and does not belong in shared fixtures - azure_client fixture composes azure_settings + make_azure_mock + patch in one step; tests no longer repeat the mocker.patch call or carry an unused azure_settings parameter - failing_azure_client fixture similarly composes azure_settings + patch with a RuntimeError side effect; TestRemoteParserParseError now only receives the mock it actually uses - All @pytest.mark.parametrize calls use pytest.param with explicit ids (pdf, png, jpeg, ...) for readable test output Co-Authored-By: Claude Sonnet 4.6 * Refactor: wire RemoteDocumentParser into consumer and fix signals - paperless_remote/signals.py: import from paperless.parsers.remote (new location after git mv). supported_mime_types() is now a classmethod that always returns the full set, so get_supported_mime_types() in the signal layer explicitly checks RemoteEngineConfig validity and returns {} when unconfigured — preserving the old behaviour where an unconfigured remote parser does not register for any MIME types. - documents/consumer.py: extend the _parser_cleanup() shim, parse() dispatch, and get_thumbnail() dispatch to include RemoteDocumentParser alongside TextDocumentParser. Both new-style parsers use __exit__ for cleanup and take (document_path, mime_type) without a file_name argument. Co-Authored-By: Claude Sonnet 4.6 * Refactor: fix type errors in remote parser and signals - remote.py: add `if TYPE_CHECKING: assert` guards before the Azure client construction to narrow config.endpoint and config.api_key from str|None to str. The narrowing is safe: engine_is_valid() guarantees both are non-None when it returns True (api_key explicitly; endpoint via `not (engine=="azureai" and endpoint is None)` for the only valid engine). Asserts are wrapped in TYPE_CHECKING so they carry zero runtime cost. - signals.py: add full type annotations — return types, Any-typed sender parameter, and explicit logging_group argument replacing *args. Add `from __future__ import annotations` for consistent annotation style. Co-Authored-By: Claude Sonnet 4.6 * Fix: get_parser factory forwards logging_group, drops progress_callback consumer.py calls parser_class(logging_group, progress_callback=...). RemoteDocumentParser.__init__ accepts logging_group but not progress_callback, so only the latter is dropped — matching the pattern established by the TextDocumentParser signals shim. Co-Authored-By: Claude Sonnet 4.6 * Fix: text parser get_parser forwards logging_group, drops progress_callback TextDocumentParser.__init__ accepts logging_group: object = None, same as RemoteDocumentParser. The old shim incorrectly dropped it; fix to forward it as a positional arg and only drop progress_callback. Add type annotations and from __future__ import annotations for consistency with the remote parser signals shim. Co-Authored-By: Claude Sonnet 4.6 --------- Co-authored-by: Claude Sonnet 4.6 --- src/documents/consumer.py | 21 +- src/paperless/parsers/registry.py | 2 + src/paperless/parsers/remote.py | 429 +++++++++++++++ src/paperless/parsers/utils.py | 130 +++++ src/paperless/tests/parsers/conftest.py | 89 ++++ .../tests/parsers/test_remote_parser.py | 490 ++++++++++++++++++ .../tests/samples/remote}/simple-digital.pdf | Bin src/paperless_remote/parsers.py | 118 ----- src/paperless_remote/signals.py | 32 +- src/paperless_remote/tests/test_parser.py | 131 ----- src/paperless_text/signals.py | 11 +- 11 files changed, 1191 insertions(+), 262 deletions(-) create mode 100644 src/paperless/parsers/remote.py create mode 100644 src/paperless/parsers/utils.py create mode 100644 src/paperless/tests/parsers/test_remote_parser.py rename src/{paperless_remote/tests/samples => paperless/tests/samples/remote}/simple-digital.pdf (100%) delete mode 100644 src/paperless_remote/parsers.py delete mode 100644 src/paperless_remote/tests/test_parser.py diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 53fd1ca0f..11abf46d4 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -51,6 +51,7 @@ from documents.templating.workflows import parse_w_workflow_placeholders from documents.utils import copy_basic_file_stats from documents.utils import copy_file_with_basic_stats from documents.utils import run_subprocess +from paperless.parsers.remote import RemoteDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser from paperless_mail.parsers import MailDocumentParser @@ -68,7 +69,10 @@ def _parser_cleanup(parser: DocumentParser) -> None: TODO(stumpylog): Remove me in the future """ - if isinstance(parser, (TextDocumentParser, TikaDocumentParser)): + if isinstance( + parser, + (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), + ): parser.__exit__(None, None, None) else: parser.cleanup() @@ -452,7 +456,10 @@ class ConsumerPlugin( # New-style parsers use __enter__/__exit__ for resource management. # _parser_cleanup (below) handles __exit__; call __enter__ here. # TODO(stumpylog): Remove me in the future - if isinstance(document_parser, (TextDocumentParser, TikaDocumentParser)): + if isinstance( + document_parser, + (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), + ): document_parser.__enter__() self.log.debug(f"Parser: {type(document_parser).__name__}") @@ -483,7 +490,10 @@ class ConsumerPlugin( self.filename, self.input_doc.mailrule_id, ) - elif isinstance(document_parser, (TextDocumentParser, TikaDocumentParser)): + elif isinstance( + document_parser, + (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), + ): # TODO(stumpylog): Remove me in the future document_parser.parse(self.working_copy, mime_type) else: @@ -496,7 +506,10 @@ class ConsumerPlugin( ProgressStatusOptions.WORKING, ConsumerStatusShortMessage.GENERATING_THUMBNAIL, ) - if isinstance(document_parser, (TextDocumentParser, TikaDocumentParser)): + if isinstance( + document_parser, + (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), + ): # TODO(stumpylog): Remove me in the future thumbnail = document_parser.get_thumbnail(self.working_copy, mime_type) else: diff --git a/src/paperless/parsers/registry.py b/src/paperless/parsers/registry.py index 85e825fa4..e579d24dd 100644 --- a/src/paperless/parsers/registry.py +++ b/src/paperless/parsers/registry.py @@ -193,10 +193,12 @@ class ParserRegistry: that log output is predictable; scoring determines which parser wins at runtime regardless of registration order. """ + from paperless.parsers.remote import RemoteDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser self.register_builtin(TextDocumentParser) + self.register_builtin(RemoteDocumentParser) self.register_builtin(TikaDocumentParser) # ------------------------------------------------------------------ diff --git a/src/paperless/parsers/remote.py b/src/paperless/parsers/remote.py new file mode 100644 index 000000000..45311cdbd --- /dev/null +++ b/src/paperless/parsers/remote.py @@ -0,0 +1,429 @@ +""" +Built-in remote-OCR document parser. + +Handles documents by sending them to a configured remote OCR engine +(currently Azure AI Vision / Document Intelligence) and retrieving both +the extracted text and a searchable PDF with an embedded text layer. + +When no engine is configured, ``score()`` returns ``None`` so the parser +is effectively invisible to the registry — the tesseract parser handles +these MIME types instead. +""" + +from __future__ import annotations + +import logging +import shutil +import tempfile +from pathlib import Path +from typing import TYPE_CHECKING +from typing import Self + +from django.conf import settings + +from paperless.version import __full_version_str__ + +if TYPE_CHECKING: + import datetime + from types import TracebackType + + from paperless.parsers import MetadataEntry + +logger = logging.getLogger("paperless.parsing.remote") + +_SUPPORTED_MIME_TYPES: dict[str, str] = { + "application/pdf": ".pdf", + "image/png": ".png", + "image/jpeg": ".jpg", + "image/tiff": ".tiff", + "image/bmp": ".bmp", + "image/gif": ".gif", + "image/webp": ".webp", +} + + +class RemoteEngineConfig: + """Holds and validates the remote OCR engine configuration.""" + + def __init__( + self, + engine: str | None, + api_key: str | None = None, + endpoint: str | None = None, + ) -> None: + self.engine = engine + self.api_key = api_key + self.endpoint = endpoint + + def engine_is_valid(self) -> bool: + """Return True when the engine is known and fully configured.""" + return ( + self.engine in ("azureai",) + and self.api_key is not None + and not (self.engine == "azureai" and self.endpoint is None) + ) + + +class RemoteDocumentParser: + """Parse documents via a remote OCR API (currently Azure AI Vision). + + This parser sends documents to a remote engine that returns both + extracted text and a searchable PDF with an embedded text layer. + It does not depend on Tesseract or ocrmypdf. + + Class attributes + ---------------- + name : str + Human-readable parser name. + version : str + Semantic version string, kept in sync with Paperless-ngx releases. + author : str + Maintainer name. + url : str + Issue tracker / source URL. + """ + + name: str = "Paperless-ngx Remote OCR Parser" + version: str = __full_version_str__ + author: str = "Paperless-ngx Contributors" + url: str = "https://github.com/paperless-ngx/paperless-ngx" + + # ------------------------------------------------------------------ + # Class methods + # ------------------------------------------------------------------ + + @classmethod + def supported_mime_types(cls) -> dict[str, str]: + """Return the MIME types this parser can handle. + + The full set is always returned regardless of whether a remote + engine is configured. The ``score()`` method handles the + "am I active?" logic by returning ``None`` when not configured. + + Returns + ------- + dict[str, str] + Mapping of MIME type to preferred file extension. + """ + return _SUPPORTED_MIME_TYPES + + @classmethod + def score( + cls, + mime_type: str, + filename: str, + path: Path | None = None, + ) -> int | None: + """Return the priority score for handling this file, or None. + + Returns ``None`` when no valid remote engine is configured, + making the parser invisible to the registry for this file. + When configured, returns 20 — higher than the Tesseract parser's + default of 10 — so the remote engine takes priority. + + Parameters + ---------- + mime_type: + Detected MIME type of the file. + filename: + Original filename including extension. + path: + Optional filesystem path. Not inspected by this parser. + + Returns + ------- + int | None + 20 when the remote engine is configured and the MIME type is + supported, otherwise None. + """ + config = RemoteEngineConfig( + engine=settings.REMOTE_OCR_ENGINE, + api_key=settings.REMOTE_OCR_API_KEY, + endpoint=settings.REMOTE_OCR_ENDPOINT, + ) + if not config.engine_is_valid(): + return None + if mime_type not in _SUPPORTED_MIME_TYPES: + return None + return 20 + + # ------------------------------------------------------------------ + # Properties + # ------------------------------------------------------------------ + + @property + def can_produce_archive(self) -> bool: + """Whether this parser can produce a searchable PDF archive copy. + + Returns + ------- + bool + Always True — the remote engine always returns a PDF with an + embedded text layer that serves as the archive copy. + """ + return True + + @property + def requires_pdf_rendition(self) -> bool: + """Whether the parser must produce a PDF for the frontend to display. + + Returns + ------- + bool + Always False — all supported originals are displayable by + the browser (PDF) or handled via the archive copy (images). + """ + return False + + # ------------------------------------------------------------------ + # Lifecycle + # ------------------------------------------------------------------ + + def __init__(self, logging_group: object = None) -> None: + settings.SCRATCH_DIR.mkdir(parents=True, exist_ok=True) + self._tempdir = Path( + tempfile.mkdtemp(prefix="paperless-", dir=settings.SCRATCH_DIR), + ) + self._logging_group = logging_group + self._text: str | None = None + self._archive_path: Path | None = None + + def __enter__(self) -> Self: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + logger.debug("Cleaning up temporary directory %s", self._tempdir) + shutil.rmtree(self._tempdir, ignore_errors=True) + + # ------------------------------------------------------------------ + # Core parsing interface + # ------------------------------------------------------------------ + + def parse( + self, + document_path: Path, + mime_type: str, + *, + produce_archive: bool = True, + ) -> None: + """Send the document to the remote engine and store results. + + Parameters + ---------- + document_path: + Absolute path to the document file to parse. + mime_type: + Detected MIME type of the document. + produce_archive: + Ignored — the remote engine always returns a searchable PDF, + which is stored as the archive copy regardless of this flag. + """ + config = RemoteEngineConfig( + engine=settings.REMOTE_OCR_ENGINE, + api_key=settings.REMOTE_OCR_API_KEY, + endpoint=settings.REMOTE_OCR_ENDPOINT, + ) + + if not config.engine_is_valid(): + logger.warning( + "No valid remote parser engine is configured, content will be empty.", + ) + self._text = "" + return + + if config.engine == "azureai": + self._text = self._azure_ai_vision_parse(document_path, config) + + # ------------------------------------------------------------------ + # Result accessors + # ------------------------------------------------------------------ + + def get_text(self) -> str | None: + """Return the plain-text content extracted during parse.""" + return self._text + + def get_date(self) -> datetime.datetime | None: + """Return the document date detected during parse. + + Returns + ------- + datetime.datetime | None + Always None — the remote parser does not detect dates. + """ + return None + + def get_archive_path(self) -> Path | None: + """Return the path to the generated archive PDF, or None.""" + return self._archive_path + + # ------------------------------------------------------------------ + # Thumbnail and metadata + # ------------------------------------------------------------------ + + def get_thumbnail(self, document_path: Path, mime_type: str) -> Path: + """Generate a thumbnail image for the document. + + Uses the archive PDF produced by the remote engine when available, + otherwise falls back to the original document path (PDF inputs). + + Parameters + ---------- + document_path: + Absolute path to the source document. + mime_type: + Detected MIME type of the document. + + Returns + ------- + Path + Path to the generated WebP thumbnail inside the temp directory. + """ + # make_thumbnail_from_pdf lives in documents.parsers for now; + # it will move to paperless.parsers.utils when the tesseract + # parser is migrated in a later phase. + from documents.parsers import make_thumbnail_from_pdf + + return make_thumbnail_from_pdf( + self._archive_path or document_path, + self._tempdir, + self._logging_group, + ) + + def get_page_count( + self, + document_path: Path, + mime_type: str, + ) -> int | None: + """Return the number of pages in a PDF document. + + Parameters + ---------- + document_path: + Absolute path to the source document. + mime_type: + Detected MIME type of the document. + + Returns + ------- + int | None + Page count for PDF inputs, or ``None`` for other MIME types. + """ + if mime_type != "application/pdf": + return None + + from paperless.parsers.utils import get_page_count_for_pdf + + return get_page_count_for_pdf(document_path, log=logger) + + def extract_metadata( + self, + document_path: Path, + mime_type: str, + ) -> list[MetadataEntry]: + """Extract format-specific metadata from the document. + + Delegates to the shared pikepdf-based extractor for PDF files. + Returns ``[]`` for all other MIME types. + + Parameters + ---------- + document_path: + Absolute path to the file to extract metadata from. + mime_type: + MIME type of the file. May be ``"application/pdf"`` when + called for the archive version of an image original. + + Returns + ------- + list[MetadataEntry] + Zero or more metadata entries. + """ + if mime_type != "application/pdf": + return [] + + from paperless.parsers.utils import extract_pdf_metadata + + return extract_pdf_metadata(document_path, log=logger) + + # ------------------------------------------------------------------ + # Private helpers + # ------------------------------------------------------------------ + + def _azure_ai_vision_parse( + self, + file: Path, + config: RemoteEngineConfig, + ) -> str | None: + """Send ``file`` to Azure AI Document Intelligence and return text. + + Downloads the searchable PDF output from Azure and stores it at + ``self._archive_path``. Returns the extracted text content, or + ``None`` on failure (the error is logged). + + Parameters + ---------- + file: + Absolute path to the document to analyse. + config: + Validated remote engine configuration. + + Returns + ------- + str | None + Extracted text, or None if the Azure call failed. + """ + if TYPE_CHECKING: + # Callers must have already validated config via engine_is_valid(): + # engine_is_valid() asserts api_key is not None and (for azureai) + # endpoint is not None, so these casts are provably safe. + assert config.endpoint is not None + assert config.api_key is not None + + from azure.ai.documentintelligence import DocumentIntelligenceClient + from azure.ai.documentintelligence.models import AnalyzeDocumentRequest + from azure.ai.documentintelligence.models import AnalyzeOutputOption + from azure.ai.documentintelligence.models import DocumentContentFormat + from azure.core.credentials import AzureKeyCredential + + client = DocumentIntelligenceClient( + endpoint=config.endpoint, + credential=AzureKeyCredential(config.api_key), + ) + + try: + with file.open("rb") as f: + analyze_request = AnalyzeDocumentRequest(bytes_source=f.read()) + poller = client.begin_analyze_document( + model_id="prebuilt-read", + body=analyze_request, + output_content_format=DocumentContentFormat.TEXT, + output=[AnalyzeOutputOption.PDF], + content_type="application/json", + ) + + poller.wait() + result_id = poller.details["operation_id"] + result = poller.result() + + self._archive_path = self._tempdir / "archive.pdf" + with self._archive_path.open("wb") as f: + for chunk in client.get_analyze_result_pdf( + model_id="prebuilt-read", + result_id=result_id, + ): + f.write(chunk) + + return result.content + + except Exception as e: + logger.error("Azure AI Vision parsing failed: %s", e) + + finally: + client.close() + + return None diff --git a/src/paperless/parsers/utils.py b/src/paperless/parsers/utils.py new file mode 100644 index 000000000..b72f31a28 --- /dev/null +++ b/src/paperless/parsers/utils.py @@ -0,0 +1,130 @@ +""" +Shared utilities for Paperless-ngx document parsers. + +Functions here are format-neutral helpers that multiple parsers need. +Keeping them here avoids parsers inheriting from each other just to +share implementation. +""" + +from __future__ import annotations + +import logging +import re +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from pathlib import Path + + from paperless.parsers import MetadataEntry + +logger = logging.getLogger("paperless.parsers.utils") + + +def get_page_count_for_pdf( + document_path: Path, + log: logging.Logger | None = None, +) -> int | None: + """Return the number of pages in a PDF file using pikepdf. + + Parameters + ---------- + document_path: + Absolute path to the PDF file. + log: + Logger to use for warnings. Falls back to the module-level logger + when omitted. + + Returns + ------- + int | None + Page count, or ``None`` if the file cannot be opened or is not a + valid PDF. + """ + import pikepdf + + _log = log or logger + + try: + with pikepdf.Pdf.open(document_path) as pdf: + return len(pdf.pages) + except Exception as e: + _log.warning("Unable to determine PDF page count for %s: %s", document_path, e) + return None + + +def extract_pdf_metadata( + document_path: Path, + log: logging.Logger | None = None, +) -> list[MetadataEntry]: + """Extract XMP/PDF metadata from a PDF file using pikepdf. + + Reads all XMP metadata entries from the document and returns them as a + list of ``MetadataEntry`` dicts. The method never raises — any failure + to open the file or read a specific key is logged and skipped. + + Parameters + ---------- + document_path: + Absolute path to the PDF file. + log: + Logger to use for warnings and debug messages. Falls back to the + module-level logger when omitted. + + Returns + ------- + list[MetadataEntry] + Zero or more metadata entries. Returns ``[]`` if the file cannot + be opened or contains no readable XMP metadata. + """ + import pikepdf + + from paperless.parsers import MetadataEntry + + _log = log or logger + result: list[MetadataEntry] = [] + namespace_pattern = re.compile(r"\{(.*)\}(.*)") + + try: + pdf = pikepdf.open(document_path) + meta = pdf.open_metadata() + except Exception as e: + _log.warning("Could not open PDF metadata for %s: %s", document_path, e) + return [] + + for key, value in meta.items(): + if isinstance(value, list): + value = " ".join(str(e) for e in value) + value = str(value) + + try: + m = namespace_pattern.match(key) + if m is None: + continue + + namespace = m.group(1) + key_value = m.group(2) + + try: + namespace.encode("utf-8") + key_value.encode("utf-8") + except UnicodeEncodeError as enc_err: + _log.debug("Skipping metadata key %s: %s", key, enc_err) + continue + + result.append( + MetadataEntry( + namespace=namespace, + prefix=meta.REVERSE_NS[namespace], + key=key_value, + value=value, + ), + ) + except Exception as e: + _log.warning( + "Error reading metadata key %s value %s: %s", + key, + value, + e, + ) + + return result diff --git a/src/paperless/tests/parsers/conftest.py b/src/paperless/tests/parsers/conftest.py index 936058733..19603db83 100644 --- a/src/paperless/tests/parsers/conftest.py +++ b/src/paperless/tests/parsers/conftest.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING import pytest +from paperless.parsers.remote import RemoteDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser @@ -17,6 +18,8 @@ if TYPE_CHECKING: from collections.abc import Generator from pathlib import Path + from pytest_django.fixtures import SettingsWrapper + # ------------------------------------------------------------------ # Text parser sample files @@ -77,6 +80,92 @@ def text_parser() -> Generator[TextDocumentParser, None, None]: yield parser +# ------------------------------------------------------------------ +# Remote parser sample files +# ------------------------------------------------------------------ + + +@pytest.fixture(scope="session") +def remote_samples_dir(samples_dir: Path) -> Path: + """Absolute path to the remote parser sample files directory. + + Returns + ------- + Path + ``/remote/`` + """ + return samples_dir / "remote" + + +@pytest.fixture(scope="session") +def sample_pdf_file(remote_samples_dir: Path) -> Path: + """Path to a simple digital PDF sample file. + + Returns + ------- + Path + Absolute path to ``remote/simple-digital.pdf``. + """ + return remote_samples_dir / "simple-digital.pdf" + + +# ------------------------------------------------------------------ +# Remote parser instance +# ------------------------------------------------------------------ + + +@pytest.fixture() +def remote_parser() -> Generator[RemoteDocumentParser, None, None]: + """Yield a RemoteDocumentParser and clean up its temporary directory afterwards. + + Yields + ------ + RemoteDocumentParser + A ready-to-use parser instance. + """ + with RemoteDocumentParser() as parser: + yield parser + + +# ------------------------------------------------------------------ +# Remote parser settings helpers +# ------------------------------------------------------------------ + + +@pytest.fixture() +def azure_settings(settings: SettingsWrapper) -> SettingsWrapper: + """Configure Django settings for a valid Azure AI OCR engine. + + Sets ``REMOTE_OCR_ENGINE``, ``REMOTE_OCR_API_KEY``, and + ``REMOTE_OCR_ENDPOINT`` to test values. Settings are restored + automatically after the test by pytest-django. + + Returns + ------- + SettingsWrapper + The modified settings object (for chaining further overrides). + """ + settings.REMOTE_OCR_ENGINE = "azureai" + settings.REMOTE_OCR_API_KEY = "test-api-key" + settings.REMOTE_OCR_ENDPOINT = "https://test.cognitiveservices.azure.com" + return settings + + +@pytest.fixture() +def no_engine_settings(settings: SettingsWrapper) -> SettingsWrapper: + """Configure Django settings with no remote engine configured. + + Returns + ------- + SettingsWrapper + The modified settings object. + """ + settings.REMOTE_OCR_ENGINE = None + settings.REMOTE_OCR_API_KEY = None + settings.REMOTE_OCR_ENDPOINT = None + return settings + + # ------------------------------------------------------------------ # Tika parser sample files # ------------------------------------------------------------------ diff --git a/src/paperless/tests/parsers/test_remote_parser.py b/src/paperless/tests/parsers/test_remote_parser.py new file mode 100644 index 000000000..3e58498c1 --- /dev/null +++ b/src/paperless/tests/parsers/test_remote_parser.py @@ -0,0 +1,490 @@ +""" +Tests for paperless.parsers.remote.RemoteDocumentParser. + +All tests use the context-manager protocol for parser lifecycle. + +Fixture layout +-------------- +make_azure_mock — factory (defined here; specific to this module) +azure_client — composes azure_settings + make_azure_mock + patch; + use when a test needs the client to succeed +failing_azure_client + — composes azure_settings + patch with RuntimeError; + use when a test needs the client to fail +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING +from unittest.mock import Mock + +import pytest + +from paperless.parsers import ParserProtocol +from paperless.parsers.remote import RemoteDocumentParser + +if TYPE_CHECKING: + from collections.abc import Callable + from pathlib import Path + + from pytest_django.fixtures import SettingsWrapper + from pytest_mock import MockerFixture + + +# --------------------------------------------------------------------------- +# Module-local fixtures +# --------------------------------------------------------------------------- + +_AZURE_CLIENT_TARGET = "azure.ai.documentintelligence.DocumentIntelligenceClient" +_DEFAULT_TEXT = "Extracted text." + + +@pytest.fixture() +def make_azure_mock() -> Callable[[str], Mock]: + """Return a factory that builds a mock Azure DocumentIntelligenceClient. + + Usage:: + + mock_client = make_azure_mock() # default extracted text + mock_client = make_azure_mock("My text.") # custom extracted text + """ + + def _factory(text: str = _DEFAULT_TEXT) -> Mock: + mock_client = Mock() + mock_poller = Mock() + mock_poller.wait.return_value = None + mock_poller.details = {"operation_id": "fake-op-id"} + mock_poller.result.return_value.content = text + mock_client.begin_analyze_document.return_value = mock_poller + mock_client.get_analyze_result_pdf.return_value = [b"%PDF-1.4 FAKE"] + return mock_client + + return _factory + + +@pytest.fixture() +def azure_client( + azure_settings: SettingsWrapper, + make_azure_mock: Callable[[str], Mock], + mocker: MockerFixture, +) -> Mock: + """Patch the Azure DI client with a succeeding mock and return the instance. + + Implicitly applies ``azure_settings`` so tests using this fixture do not + also need ``@pytest.mark.usefixtures("azure_settings")``. + """ + mock_client = make_azure_mock() + mocker.patch(_AZURE_CLIENT_TARGET, return_value=mock_client) + return mock_client + + +@pytest.fixture() +def failing_azure_client( + azure_settings: SettingsWrapper, + mocker: MockerFixture, +) -> Mock: + """Patch the Azure DI client to raise RuntimeError on every call. + + Implicitly applies ``azure_settings``. Returns the mock instance so + tests can assert on calls such as ``close()``. + """ + mock_client = Mock() + mock_client.begin_analyze_document.side_effect = RuntimeError("network failure") + mocker.patch(_AZURE_CLIENT_TARGET, return_value=mock_client) + return mock_client + + +# --------------------------------------------------------------------------- +# Protocol contract +# --------------------------------------------------------------------------- + + +class TestRemoteParserProtocol: + """Verify that RemoteDocumentParser satisfies the ParserProtocol contract.""" + + def test_isinstance_satisfies_protocol( + self, + remote_parser: RemoteDocumentParser, + ) -> None: + assert isinstance(remote_parser, ParserProtocol) + + def test_class_attributes_present(self) -> None: + assert isinstance(RemoteDocumentParser.name, str) and RemoteDocumentParser.name + assert ( + isinstance(RemoteDocumentParser.version, str) + and RemoteDocumentParser.version + ) + assert ( + isinstance(RemoteDocumentParser.author, str) and RemoteDocumentParser.author + ) + assert isinstance(RemoteDocumentParser.url, str) and RemoteDocumentParser.url + + +# --------------------------------------------------------------------------- +# supported_mime_types +# --------------------------------------------------------------------------- + + +class TestRemoteParserSupportedMimeTypes: + """supported_mime_types() always returns the full set regardless of config.""" + + def test_returns_dict(self) -> None: + mime_types = RemoteDocumentParser.supported_mime_types() + assert isinstance(mime_types, dict) + + def test_includes_all_expected_types(self) -> None: + mime_types = RemoteDocumentParser.supported_mime_types() + expected = { + "application/pdf", + "image/png", + "image/jpeg", + "image/tiff", + "image/bmp", + "image/gif", + "image/webp", + } + assert expected == set(mime_types.keys()) + + @pytest.mark.usefixtures("no_engine_settings") + def test_returns_full_set_when_not_configured(self) -> None: + """ + GIVEN: No remote engine is configured + WHEN: supported_mime_types() is called + THEN: The full MIME type dict is still returned (score() handles activation) + """ + mime_types = RemoteDocumentParser.supported_mime_types() + assert len(mime_types) == 7 + + +# --------------------------------------------------------------------------- +# score() +# --------------------------------------------------------------------------- + + +class TestRemoteParserScore: + """score() encodes the activation logic: None when unconfigured, 20 when active.""" + + @pytest.mark.usefixtures("azure_settings") + @pytest.mark.parametrize( + "mime_type", + [ + pytest.param("application/pdf", id="pdf"), + pytest.param("image/png", id="png"), + pytest.param("image/jpeg", id="jpeg"), + pytest.param("image/tiff", id="tiff"), + pytest.param("image/bmp", id="bmp"), + pytest.param("image/gif", id="gif"), + pytest.param("image/webp", id="webp"), + ], + ) + def test_score_returns_20_when_configured(self, mime_type: str) -> None: + result = RemoteDocumentParser.score(mime_type, "doc.pdf") + assert result == 20 + + @pytest.mark.usefixtures("no_engine_settings") + @pytest.mark.parametrize( + "mime_type", + [ + pytest.param("application/pdf", id="pdf"), + pytest.param("image/png", id="png"), + pytest.param("image/jpeg", id="jpeg"), + ], + ) + def test_score_returns_none_when_no_engine(self, mime_type: str) -> None: + result = RemoteDocumentParser.score(mime_type, "doc.pdf") + assert result is None + + def test_score_returns_none_when_api_key_missing( + self, + settings: SettingsWrapper, + ) -> None: + settings.REMOTE_OCR_ENGINE = "azureai" + settings.REMOTE_OCR_API_KEY = None + settings.REMOTE_OCR_ENDPOINT = "https://test.cognitiveservices.azure.com" + result = RemoteDocumentParser.score("application/pdf", "doc.pdf") + assert result is None + + def test_score_returns_none_when_endpoint_missing( + self, + settings: SettingsWrapper, + ) -> None: + settings.REMOTE_OCR_ENGINE = "azureai" + settings.REMOTE_OCR_API_KEY = "key" + settings.REMOTE_OCR_ENDPOINT = None + result = RemoteDocumentParser.score("application/pdf", "doc.pdf") + assert result is None + + @pytest.mark.usefixtures("azure_settings") + def test_score_returns_none_for_unsupported_mime_type(self) -> None: + result = RemoteDocumentParser.score("text/plain", "doc.txt") + assert result is None + + @pytest.mark.usefixtures("azure_settings") + def test_score_higher_than_tesseract_default(self) -> None: + """Remote parser (20) outranks the tesseract default (10) when configured.""" + score = RemoteDocumentParser.score("application/pdf", "doc.pdf") + assert score is not None and score > 10 + + +# --------------------------------------------------------------------------- +# Properties +# --------------------------------------------------------------------------- + + +class TestRemoteParserProperties: + def test_can_produce_archive_is_true( + self, + remote_parser: RemoteDocumentParser, + ) -> None: + assert remote_parser.can_produce_archive is True + + def test_requires_pdf_rendition_is_false( + self, + remote_parser: RemoteDocumentParser, + ) -> None: + assert remote_parser.requires_pdf_rendition is False + + +# --------------------------------------------------------------------------- +# Lifecycle +# --------------------------------------------------------------------------- + + +class TestRemoteParserLifecycle: + def test_context_manager_cleans_up_tempdir(self) -> None: + with RemoteDocumentParser() as parser: + tempdir = parser._tempdir + assert tempdir.exists() + assert not tempdir.exists() + + def test_context_manager_cleans_up_after_exception(self) -> None: + tempdir: Path | None = None + with pytest.raises(RuntimeError): + with RemoteDocumentParser() as parser: + tempdir = parser._tempdir + raise RuntimeError("boom") + assert tempdir is not None + assert not tempdir.exists() + + +# --------------------------------------------------------------------------- +# parse() — happy path +# --------------------------------------------------------------------------- + + +class TestRemoteParserParse: + def test_parse_returns_text_from_azure( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + azure_client: Mock, + ) -> None: + remote_parser.parse(sample_pdf_file, "application/pdf") + + assert remote_parser.get_text() == _DEFAULT_TEXT + + def test_parse_sets_archive_path( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + azure_client: Mock, + ) -> None: + remote_parser.parse(sample_pdf_file, "application/pdf") + + archive = remote_parser.get_archive_path() + assert archive is not None + assert archive.exists() + assert archive.suffix == ".pdf" + + def test_parse_closes_client_on_success( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + azure_client: Mock, + ) -> None: + remote_parser.parse(sample_pdf_file, "application/pdf") + + azure_client.close.assert_called_once() + + @pytest.mark.usefixtures("no_engine_settings") + def test_parse_sets_empty_text_when_not_configured( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + ) -> None: + remote_parser.parse(sample_pdf_file, "application/pdf") + + assert remote_parser.get_text() == "" + assert remote_parser.get_archive_path() is None + + def test_get_text_none_before_parse( + self, + remote_parser: RemoteDocumentParser, + ) -> None: + assert remote_parser.get_text() is None + + def test_get_date_always_none( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + azure_client: Mock, + ) -> None: + remote_parser.parse(sample_pdf_file, "application/pdf") + + assert remote_parser.get_date() is None + + +# --------------------------------------------------------------------------- +# parse() — Azure failure path +# --------------------------------------------------------------------------- + + +class TestRemoteParserParseError: + def test_parse_returns_none_on_azure_error( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + failing_azure_client: Mock, + ) -> None: + remote_parser.parse(sample_pdf_file, "application/pdf") + + assert remote_parser.get_text() is None + + def test_parse_closes_client_on_error( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + failing_azure_client: Mock, + ) -> None: + remote_parser.parse(sample_pdf_file, "application/pdf") + + failing_azure_client.close.assert_called_once() + + def test_parse_logs_error_on_azure_failure( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + failing_azure_client: Mock, + mocker: MockerFixture, + ) -> None: + mock_log = mocker.patch("paperless.parsers.remote.logger") + + remote_parser.parse(sample_pdf_file, "application/pdf") + + mock_log.error.assert_called_once() + assert "Azure AI Vision parsing failed" in mock_log.error.call_args[0][0] + + +# --------------------------------------------------------------------------- +# get_page_count() +# --------------------------------------------------------------------------- + + +class TestRemoteParserPageCount: + def test_page_count_for_pdf( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + ) -> None: + count = remote_parser.get_page_count(sample_pdf_file, "application/pdf") + assert isinstance(count, int) + assert count >= 1 + + def test_page_count_returns_none_for_image_mime( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + ) -> None: + count = remote_parser.get_page_count(sample_pdf_file, "image/png") + assert count is None + + def test_page_count_returns_none_for_invalid_pdf( + self, + remote_parser: RemoteDocumentParser, + tmp_path: Path, + ) -> None: + bad_pdf = tmp_path / "bad.pdf" + bad_pdf.write_bytes(b"not a pdf at all") + count = remote_parser.get_page_count(bad_pdf, "application/pdf") + assert count is None + + +# --------------------------------------------------------------------------- +# extract_metadata() +# --------------------------------------------------------------------------- + + +class TestRemoteParserMetadata: + def test_extract_metadata_non_pdf_returns_empty( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + ) -> None: + result = remote_parser.extract_metadata(sample_pdf_file, "image/png") + assert result == [] + + def test_extract_metadata_pdf_returns_list( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + ) -> None: + result = remote_parser.extract_metadata(sample_pdf_file, "application/pdf") + assert isinstance(result, list) + + def test_extract_metadata_pdf_entries_have_required_keys( + self, + remote_parser: RemoteDocumentParser, + sample_pdf_file: Path, + ) -> None: + result = remote_parser.extract_metadata(sample_pdf_file, "application/pdf") + for entry in result: + assert "namespace" in entry + assert "prefix" in entry + assert "key" in entry + assert "value" in entry + assert isinstance(entry["value"], str) + + def test_extract_metadata_does_not_raise_on_invalid_pdf( + self, + remote_parser: RemoteDocumentParser, + tmp_path: Path, + ) -> None: + bad_pdf = tmp_path / "bad.pdf" + bad_pdf.write_bytes(b"not a pdf at all") + result = remote_parser.extract_metadata(bad_pdf, "application/pdf") + assert result == [] + + +# --------------------------------------------------------------------------- +# Registry integration +# --------------------------------------------------------------------------- + + +class TestRemoteParserRegistry: + def test_registered_in_defaults(self) -> None: + from paperless.parsers.registry import ParserRegistry + + registry = ParserRegistry() + registry.register_defaults() + + assert RemoteDocumentParser in registry._builtins + + @pytest.mark.usefixtures("azure_settings") + def test_get_parser_returns_remote_when_configured(self) -> None: + from paperless.parsers.registry import get_parser_registry + + registry = get_parser_registry() + parser_cls = registry.get_parser_for_file("application/pdf", "doc.pdf") + + assert parser_cls is RemoteDocumentParser + + @pytest.mark.usefixtures("no_engine_settings") + def test_get_parser_returns_none_for_pdf_when_not_configured(self) -> None: + """With no tesseract parser registered yet, PDF has no handler if remote is off.""" + from paperless.parsers.registry import ParserRegistry + + registry = ParserRegistry() + registry.register_defaults() + parser_cls = registry.get_parser_for_file("application/pdf", "doc.pdf") + + assert parser_cls is None diff --git a/src/paperless_remote/tests/samples/simple-digital.pdf b/src/paperless/tests/samples/remote/simple-digital.pdf similarity index 100% rename from src/paperless_remote/tests/samples/simple-digital.pdf rename to src/paperless/tests/samples/remote/simple-digital.pdf diff --git a/src/paperless_remote/parsers.py b/src/paperless_remote/parsers.py deleted file mode 100644 index 493b7d7bb..000000000 --- a/src/paperless_remote/parsers.py +++ /dev/null @@ -1,118 +0,0 @@ -from pathlib import Path - -from django.conf import settings - -from paperless_tesseract.parsers import RasterisedDocumentParser - - -class RemoteEngineConfig: - def __init__( - self, - engine: str, - api_key: str | None = None, - endpoint: str | None = None, - ): - self.engine = engine - self.api_key = api_key - self.endpoint = endpoint - - def engine_is_valid(self): - valid = self.engine in ["azureai"] and self.api_key is not None - if self.engine == "azureai": - valid = valid and self.endpoint is not None - return valid - - -class RemoteDocumentParser(RasterisedDocumentParser): - """ - This parser uses a remote OCR engine to parse documents. Currently, it supports Azure AI Vision - as this is the only service that provides a remote OCR API with text-embedded PDF output. - """ - - logging_name = "paperless.parsing.remote" - - def get_settings(self) -> RemoteEngineConfig: - """ - Returns the configuration for the remote OCR engine, loaded from Django settings. - """ - return RemoteEngineConfig( - engine=settings.REMOTE_OCR_ENGINE, - api_key=settings.REMOTE_OCR_API_KEY, - endpoint=settings.REMOTE_OCR_ENDPOINT, - ) - - def supported_mime_types(self): - if self.settings.engine_is_valid(): - return { - "application/pdf": ".pdf", - "image/png": ".png", - "image/jpeg": ".jpg", - "image/tiff": ".tiff", - "image/bmp": ".bmp", - "image/gif": ".gif", - "image/webp": ".webp", - } - else: - return {} - - def azure_ai_vision_parse( - self, - file: Path, - ) -> str | None: - """ - Uses Azure AI Vision to parse the document and return the text content. - It requests a searchable PDF output with embedded text. - The PDF is saved to the archive_path attribute. - Returns the text content extracted from the document. - If the parsing fails, it returns None. - """ - from azure.ai.documentintelligence import DocumentIntelligenceClient - from azure.ai.documentintelligence.models import AnalyzeDocumentRequest - from azure.ai.documentintelligence.models import AnalyzeOutputOption - from azure.ai.documentintelligence.models import DocumentContentFormat - from azure.core.credentials import AzureKeyCredential - - client = DocumentIntelligenceClient( - endpoint=self.settings.endpoint, - credential=AzureKeyCredential(self.settings.api_key), - ) - - try: - with file.open("rb") as f: - analyze_request = AnalyzeDocumentRequest(bytes_source=f.read()) - poller = client.begin_analyze_document( - model_id="prebuilt-read", - body=analyze_request, - output_content_format=DocumentContentFormat.TEXT, - output=[AnalyzeOutputOption.PDF], # request searchable PDF output - content_type="application/json", - ) - - poller.wait() - result_id = poller.details["operation_id"] - result = poller.result() - - # Download the PDF with embedded text - self.archive_path = self.tempdir / "archive.pdf" - with self.archive_path.open("wb") as f: - for chunk in client.get_analyze_result_pdf( - model_id="prebuilt-read", - result_id=result_id, - ): - f.write(chunk) - return result.content - except Exception as e: - self.log.error(f"Azure AI Vision parsing failed: {e}") - finally: - client.close() - - return None - - def parse(self, document_path: Path, mime_type, file_name=None): - if not self.settings.engine_is_valid(): - self.log.warning( - "No valid remote parser engine is configured, content will be empty.", - ) - self.text = "" - elif self.settings.engine == "azureai": - self.text = self.azure_ai_vision_parse(document_path) diff --git a/src/paperless_remote/signals.py b/src/paperless_remote/signals.py index 81955a479..2300be760 100644 --- a/src/paperless_remote/signals.py +++ b/src/paperless_remote/signals.py @@ -1,16 +1,36 @@ -def get_parser(*args, **kwargs): - from paperless_remote.parsers import RemoteDocumentParser +from __future__ import annotations +from typing import Any + + +def get_parser(*args: Any, **kwargs: Any) -> Any: + from paperless.parsers.remote import RemoteDocumentParser + + # The new RemoteDocumentParser does not accept the progress_callback + # kwarg injected by the old signal-based consumer. logging_group is + # forwarded as a positional arg. + # Phase 4 will replace this signal path with the new ParserRegistry. + kwargs.pop("progress_callback", None) return RemoteDocumentParser(*args, **kwargs) -def get_supported_mime_types(): - from paperless_remote.parsers import RemoteDocumentParser +def get_supported_mime_types() -> dict[str, str]: + from django.conf import settings - return RemoteDocumentParser(None).supported_mime_types() + from paperless.parsers.remote import RemoteDocumentParser + from paperless.parsers.remote import RemoteEngineConfig + + config = RemoteEngineConfig( + engine=settings.REMOTE_OCR_ENGINE, + api_key=settings.REMOTE_OCR_API_KEY, + endpoint=settings.REMOTE_OCR_ENDPOINT, + ) + if not config.engine_is_valid(): + return {} + return RemoteDocumentParser.supported_mime_types() -def remote_consumer_declaration(sender, **kwargs): +def remote_consumer_declaration(sender: Any, **kwargs: Any) -> dict[str, Any]: return { "parser": get_parser, "weight": 5, diff --git a/src/paperless_remote/tests/test_parser.py b/src/paperless_remote/tests/test_parser.py deleted file mode 100644 index 0116365f4..000000000 --- a/src/paperless_remote/tests/test_parser.py +++ /dev/null @@ -1,131 +0,0 @@ -import uuid -from pathlib import Path -from unittest import mock - -from django.test import TestCase -from django.test import override_settings - -from documents.tests.utils import DirectoriesMixin -from documents.tests.utils import FileSystemAssertsMixin -from paperless_remote.parsers import RemoteDocumentParser -from paperless_remote.signals import get_parser - - -class TestParser(DirectoriesMixin, FileSystemAssertsMixin, TestCase): - SAMPLE_FILES = Path(__file__).resolve().parent / "samples" - - def assertContainsStrings(self, content: str, strings: list[str]) -> None: - # Asserts that all strings appear in content, in the given order. - indices = [] - for s in strings: - if s in content: - indices.append(content.index(s)) - else: - self.fail(f"'{s}' is not in '{content}'") - self.assertListEqual(indices, sorted(indices)) - - @mock.patch("paperless_tesseract.parsers.run_subprocess") - @mock.patch("azure.ai.documentintelligence.DocumentIntelligenceClient") - def test_get_text_with_azure(self, mock_client_cls, mock_subprocess) -> None: - # Arrange mock Azure client - mock_client = mock.Mock() - mock_client_cls.return_value = mock_client - - # Simulate poller result and its `.details` - mock_poller = mock.Mock() - mock_poller.wait.return_value = None - mock_poller.details = {"operation_id": "fake-op-id"} - mock_client.begin_analyze_document.return_value = mock_poller - mock_poller.result.return_value.content = "This is a test document." - - # Return dummy PDF bytes - mock_client.get_analyze_result_pdf.return_value = [ - b"%PDF-", - b"1.7 ", - b"FAKEPDF", - ] - - # Simulate pdftotext by writing dummy text to sidecar file - def fake_run(cmd, *args, **kwargs) -> None: - with Path(cmd[-1]).open("w", encoding="utf-8") as f: - f.write("This is a test document.") - - mock_subprocess.side_effect = fake_run - - with override_settings( - REMOTE_OCR_ENGINE="azureai", - REMOTE_OCR_API_KEY="somekey", - REMOTE_OCR_ENDPOINT="https://endpoint.cognitiveservices.azure.com", - ): - parser = get_parser(uuid.uuid4()) - parser.parse( - self.SAMPLE_FILES / "simple-digital.pdf", - "application/pdf", - ) - - self.assertContainsStrings( - parser.text.strip(), - ["This is a test document."], - ) - - @mock.patch("azure.ai.documentintelligence.DocumentIntelligenceClient") - def test_get_text_with_azure_error_logged_and_returns_none( - self, - mock_client_cls, - ) -> None: - mock_client = mock.Mock() - mock_client.begin_analyze_document.side_effect = RuntimeError("fail") - mock_client_cls.return_value = mock_client - - with override_settings( - REMOTE_OCR_ENGINE="azureai", - REMOTE_OCR_API_KEY="somekey", - REMOTE_OCR_ENDPOINT="https://endpoint.cognitiveservices.azure.com", - ): - parser = get_parser(uuid.uuid4()) - with mock.patch.object(parser.log, "error") as mock_log_error: - parser.parse( - self.SAMPLE_FILES / "simple-digital.pdf", - "application/pdf", - ) - - self.assertIsNone(parser.text) - mock_client.begin_analyze_document.assert_called_once() - mock_client.close.assert_called_once() - mock_log_error.assert_called_once() - self.assertIn( - "Azure AI Vision parsing failed", - mock_log_error.call_args[0][0], - ) - - @override_settings( - REMOTE_OCR_ENGINE="azureai", - REMOTE_OCR_API_KEY="key", - REMOTE_OCR_ENDPOINT="https://endpoint.cognitiveservices.azure.com", - ) - def test_supported_mime_types_valid_config(self) -> None: - parser = RemoteDocumentParser(uuid.uuid4()) - expected_types = { - "application/pdf": ".pdf", - "image/png": ".png", - "image/jpeg": ".jpg", - "image/tiff": ".tiff", - "image/bmp": ".bmp", - "image/gif": ".gif", - "image/webp": ".webp", - } - self.assertEqual(parser.supported_mime_types(), expected_types) - - def test_supported_mime_types_invalid_config(self) -> None: - parser = get_parser(uuid.uuid4()) - self.assertEqual(parser.supported_mime_types(), {}) - - @override_settings( - REMOTE_OCR_ENGINE=None, - REMOTE_OCR_API_KEY=None, - REMOTE_OCR_ENDPOINT=None, - ) - def test_parse_with_invalid_config(self) -> None: - parser = get_parser(uuid.uuid4()) - parser.parse(self.SAMPLE_FILES / "simple-digital.pdf", "application/pdf") - self.assertEqual(parser.text, "") diff --git a/src/paperless_text/signals.py b/src/paperless_text/signals.py index bfdabc601..916f0a7c0 100644 --- a/src/paperless_text/signals.py +++ b/src/paperless_text/signals.py @@ -1,4 +1,9 @@ -def get_parser(*args, **kwargs): +from __future__ import annotations + +from typing import Any + + +def get_parser(*args: Any, **kwargs: Any) -> Any: from paperless.parsers.text import TextDocumentParser # TextDocumentParser accepts logging_group for constructor compatibility but @@ -9,10 +14,10 @@ def get_parser(*args, **kwargs): # path with the new ParserRegistry so the shim can be removed at that point. kwargs.pop("logging_group", None) kwargs.pop("progress_callback", None) - return TextDocumentParser() + return TextDocumentParser(*args, **kwargs) -def text_consumer_declaration(sender, **kwargs): +def text_consumer_declaration(sender: Any, **kwargs: Any) -> dict[str, Any]: return { "parser": get_parser, "weight": 10, From 68fc8980428d01fa07fc380331a57ab5cce77a21 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 19 Mar 2026 10:05:07 -0700 Subject: [PATCH 048/113] Fix: Resolve more instances of tests which mutated global states (#12395) --- src/documents/tests/test_api_status.py | 18 +++++++++++------- src/paperless_ai/tests/conftest.py | 10 ++++++++++ src/paperless_ai/tests/test_ai_indexing.py | 8 -------- src/paperless_ai/tests/test_embedding.py | 9 --------- src/paperless_mail/tests/test_mail_oauth.py | 14 +++++++------- 5 files changed, 28 insertions(+), 31 deletions(-) create mode 100644 src/paperless_ai/tests/conftest.py diff --git a/src/documents/tests/test_api_status.py b/src/documents/tests/test_api_status.py index 409f4bd7f..705f28145 100644 --- a/src/documents/tests/test_api_status.py +++ b/src/documents/tests/test_api_status.py @@ -101,13 +101,17 @@ class TestSystemStatus(APITestCase): - The response contains the correct install type """ self.client.force_login(self.user) - os.environ["PNGX_CONTAINERIZED"] = "1" - response = self.client.get(self.ENDPOINT) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data["install_type"], "docker") - os.environ["KUBERNETES_SERVICE_HOST"] = "http://localhost" - response = self.client.get(self.ENDPOINT) - self.assertEqual(response.data["install_type"], "kubernetes") + with mock.patch.dict(os.environ, {"PNGX_CONTAINERIZED": "1"}, clear=False): + response = self.client.get(self.ENDPOINT) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["install_type"], "docker") + with mock.patch.dict( + os.environ, + {"PNGX_CONTAINERIZED": "1", "KUBERNETES_SERVICE_HOST": "http://localhost"}, + clear=False, + ): + response = self.client.get(self.ENDPOINT) + self.assertEqual(response.data["install_type"], "kubernetes") @mock.patch("redis.Redis.execute_command") def test_system_status_redis_ping(self, mock_ping) -> None: diff --git a/src/paperless_ai/tests/conftest.py b/src/paperless_ai/tests/conftest.py new file mode 100644 index 000000000..2d71476c7 --- /dev/null +++ b/src/paperless_ai/tests/conftest.py @@ -0,0 +1,10 @@ +from pathlib import Path + +import pytest +from pytest_django.fixtures import SettingsWrapper + + +@pytest.fixture +def temp_llm_index_dir(tmp_path: Path, settings: SettingsWrapper): + settings.LLM_INDEX_DIR = tmp_path + return tmp_path diff --git a/src/paperless_ai/tests/test_ai_indexing.py b/src/paperless_ai/tests/test_ai_indexing.py index 724ac43e4..c1e3b64d8 100644 --- a/src/paperless_ai/tests/test_ai_indexing.py +++ b/src/paperless_ai/tests/test_ai_indexing.py @@ -13,14 +13,6 @@ from documents.models import PaperlessTask from paperless_ai import indexing -@pytest.fixture -def temp_llm_index_dir(tmp_path): - original_dir = indexing.settings.LLM_INDEX_DIR - indexing.settings.LLM_INDEX_DIR = tmp_path - yield tmp_path - indexing.settings.LLM_INDEX_DIR = original_dir - - @pytest.fixture def real_document(db): return Document.objects.create( diff --git a/src/paperless_ai/tests/test_embedding.py b/src/paperless_ai/tests/test_embedding.py index f9dbfd85d..74151ff89 100644 --- a/src/paperless_ai/tests/test_embedding.py +++ b/src/paperless_ai/tests/test_embedding.py @@ -3,7 +3,6 @@ from unittest.mock import MagicMock from unittest.mock import patch import pytest -from django.conf import settings from documents.models import Document from paperless.models import LLMEmbeddingBackend @@ -19,14 +18,6 @@ def mock_ai_config(): yield MockAIConfig -@pytest.fixture -def temp_llm_index_dir(tmp_path): - original_dir = settings.LLM_INDEX_DIR - settings.LLM_INDEX_DIR = tmp_path - yield tmp_path - settings.LLM_INDEX_DIR = original_dir - - @pytest.fixture def mock_document(): doc = MagicMock(spec=Document) diff --git a/src/paperless_mail/tests/test_mail_oauth.py b/src/paperless_mail/tests/test_mail_oauth.py index 1f7033bdd..651094673 100644 --- a/src/paperless_mail/tests/test_mail_oauth.py +++ b/src/paperless_mail/tests/test_mail_oauth.py @@ -1,7 +1,6 @@ from datetime import timedelta from unittest import mock -from django.conf import settings from django.contrib.auth.models import Permission from django.contrib.auth.models import User from django.test import TestCase @@ -16,6 +15,13 @@ from paperless_mail.models import MailAccount from paperless_mail.oauth import PaperlessMailOAuth2Manager +@override_settings( + OAUTH_CALLBACK_BASE_URL="http://localhost:8000", + GMAIL_OAUTH_CLIENT_ID="test_gmail_client_id", + GMAIL_OAUTH_CLIENT_SECRET="test_gmail_client_secret", + OUTLOOK_OAUTH_CLIENT_ID="test_outlook_client_id", + OUTLOOK_OAUTH_CLIENT_SECRET="test_outlook_client_secret", +) class TestMailOAuth( TestCase, ): @@ -31,12 +37,6 @@ class TestMailOAuth( self.user.save() self.client.force_login(self.user) self.mail_account_handler = MailAccountHandler() - # Mock settings - settings.OAUTH_CALLBACK_BASE_URL = "http://localhost:8000" - settings.GMAIL_OAUTH_CLIENT_ID = "test_gmail_client_id" - settings.GMAIL_OAUTH_CLIENT_SECRET = "test_gmail_client_secret" - settings.OUTLOOK_OAUTH_CLIENT_ID = "test_outlook_client_id" - settings.OUTLOOK_OAUTH_CLIENT_SECRET = "test_outlook_client_secret" super().setUp() def test_generate_paths(self) -> None: From f7c12d550a37f983d2757de052f5c88be4061ddf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:02:16 -0700 Subject: [PATCH 049/113] Chore(deps): Bump tinytag in the uv group across 1 directory (#12396) Bumps the uv group with 1 update in the / directory: [tinytag](https://github.com/tinytag/tinytag). Updates `tinytag` from 2.2.0 to 2.2.1 - [Release notes](https://github.com/tinytag/tinytag/releases) - [Commits](https://github.com/tinytag/tinytag/compare/2.2.0...2.2.1) --- updated-dependencies: - dependency-name: tinytag dependency-version: 2.2.1 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 0698948c5..66cfc41ac 100644 --- a/uv.lock +++ b/uv.lock @@ -4754,11 +4754,11 @@ wheels = [ [[package]] name = "tinytag" -version = "2.2.0" +version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/07/fb260bac73119f369a10e884016516d07cd760b5068e703773f83dd5e7bf/tinytag-2.2.0.tar.gz", hash = "sha256:f15b082510f6e0fc717e597edc8759d6f2d3ff6194ac0f3bcd675a9a09d9b798", size = 38120, upload-time = "2025-12-15T21:10:19.093Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/59/8a8cb2331e2602b53e4dc06960f57d1387a2b18e7efd24e5f9cb60ea4925/tinytag-2.2.1.tar.gz", hash = "sha256:e6d06610ebe7cd66fd07be2d3b9495914ab32654a5e47657bb8cd44c2484523c", size = 38214, upload-time = "2026-03-15T18:48:01.11Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/e2/9818fcebb348237389d2ac2fea97cf2b2638378a0866105a45ae9be49728/tinytag-2.2.0-py3-none-any.whl", hash = "sha256:d2cf3ef8ee0f6c854663f77d9d5f8159ee1c834c70f5ea4f214ddc4af8148f79", size = 32861, upload-time = "2025-12-15T21:10:17.63Z" }, + { url = "https://files.pythonhosted.org/packages/ce/34/d50e338631baaf65ec5396e70085e5de0b52b24b28db1ffbc1c6e82190dc/tinytag-2.2.1-py3-none-any.whl", hash = "sha256:ed8b1e6d25367937e3321e054f4974f9abfde1a3e0a538824c87da377130c2b6", size = 32927, upload-time = "2026-03-15T18:47:59.613Z" }, ] [[package]] From d671e345590db7bd59ad2f38d8eab254c8ab6d85 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 19 Mar 2026 22:03:00 -0700 Subject: [PATCH 050/113] Documentation: OIDC token_auth_method setting for v3 (#12398) --- docs/configuration.md | 3 +++ docs/migration-v3.md | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/docs/configuration.md b/docs/configuration.md index 59bc56907..4ce2d9dc6 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -674,6 +674,9 @@ See the corresponding [django-allauth documentation](https://docs.allauth.org/en for a list of provider configurations. You will also need to include the relevant Django 'application' inside the [PAPERLESS_APPS](#PAPERLESS_APPS) setting to activate that specific authentication provider (e.g. `allauth.socialaccount.providers.openid_connect` for the [OIDC Connect provider](https://docs.allauth.org/en/latest/socialaccount/providers/openid_connect.html)). +: For OpenID Connect providers, set `settings.token_auth_method` if your identity provider +requires a specific token endpoint authentication method. + Defaults to None, which does not enable any third party authentication systems. #### [`PAPERLESS_SOCIAL_AUTO_SIGNUP=`](#PAPERLESS_SOCIAL_AUTO_SIGNUP) {#PAPERLESS_SOCIAL_AUTO_SIGNUP} diff --git a/docs/migration-v3.md b/docs/migration-v3.md index 43a3690c0..4c728a6a4 100644 --- a/docs/migration-v3.md +++ b/docs/migration-v3.md @@ -103,3 +103,30 @@ Multiple options are combined in a single value: ```bash PAPERLESS_DB_OPTIONS="sslmode=require;sslrootcert=/certs/ca.pem;pool.max_size=10" ``` + +## OpenID Connect Token Endpoint Authentication + +Some existing OpenID Connect setups may require an explicit token endpoint authentication method after upgrading to v3. + +#### Action Required + +If OIDC login fails at the callback with an `invalid_client` error, add `token_auth_method` to the provider `settings` in +[`PAPERLESS_SOCIALACCOUNT_PROVIDERS`](configuration.md#PAPERLESS_SOCIALACCOUNT_PROVIDERS). + +For example: + +```json +{ + "openid_connect": { + "APPS": [ + { + ... + "settings": { + "server_url": "https://login.example.com", + "token_auth_method": "client_secret_basic" + } + } + ] + } +} +``` From c2b8b22fb46975c4535966682e2c3b39c2ab4845 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Fri, 20 Mar 2026 09:22:18 -0700 Subject: [PATCH 051/113] Chore: Convert mail parser to plugin style (#12397) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactor(mail): rename paperless_mail/parsers.py → paperless/parsers/mail.py Preserve git history for MailDocumentParser by committing the rename separately before editing, following the project convention. Co-Authored-By: Claude Sonnet 4.6 * Refactor(mail): move mail parser tests to paperless/tests/parsers/ Move test_parsers.py → test_mail_parser.py and test_parsers_live.py → test_mail_parser_live.py alongside the other built-in parser tests, preserving git history before editing. Update MailDocumentParser import to the new canonical location. Co-Authored-By: Claude Sonnet 4.6 * Chore: move mail parser sample files to paperless/tests/samples/mail/ Relocate all mail test fixtures from src/paperless_mail/tests/samples/ to src/paperless/tests/samples/mail/ ahead of the parser plugin refactor. Add the new path to the codespell skip list to prevent false-positive spell corrections in binary/fixture email files. Co-Authored-By: Claude Sonnet 4.6 * Feat(tests): add mail parser fixtures to paperless/tests/parsers/conftest.py Add mail_samples_dir, per-file sample fixtures, and mail_parser (context-manager style) to mirror the old paperless_mail conftest but rooted at the new samples/mail/ location. Co-Authored-By: Claude Sonnet 4.6 * Feat(parsers): migrate MailDocumentParser to ParserProtocol Move the mail parser from paperless_mail/parsers.py to paperless/parsers/mail.py and refactor it to implement ParserProtocol: - Class-level name/version/author/url attributes - supported_mime_types() and score() classmethods (score=20) - can_produce_archive=False, requires_pdf_rendition=True - Context manager lifecycle (__enter__/__exit__) - New parse() signature without mailrule_id kwarg; consumer sets parser.mailrule_id before calling parse() instead - get_text()/get_date()/get_archive_path() accessor methods - extract_metadata() returning email headers and attachment info Register MailDocumentParser in the ParserRegistry alongside Text and Tika parsers. Update consumer, signals, and all import sites to use the new location. Update tests to use the new accessor API, patch paths, and context-manager fixture. Co-Authored-By: Claude Sonnet 4.6 * Fix(parsers): pop legacy constructor args in mail signal wrapper MailDocumentParser.__init__ takes no constructor args in the new protocol. Update the get_parser() signal wrapper to pop logging_group and progress_callback (passed by the legacy consumer dispatch path) before instantiating — the same pattern used by TextDocumentParser. Also update test_mail_parser_receives_mailrule to use the real signal wrapper (mail_get_parser) instead of MailDocumentParser directly, so the test exercises the actual dispatch path and matches the new parse() call signature (no mailrule kwarg). Co-Authored-By: Claude Sonnet 4.6 * Bumps this so we can run * Fixes location of the fixture * Removes fixtures which were duplicated * Feat(parsers): add ParserContext and configure() to ParserProtocol Replace the ad-hoc mailrule_id attribute assignment with a typed, immutable ParserContext dataclass and a configure() method on the Protocol: - ParserContext(frozen=True, slots=True) lives in paperless/parsers/ alongside ParserProtocol and MetadataEntry; currently carries only mailrule_id but is designed to grow with output_type, ocr_mode, and ocr_language in a future phase (decoupling parsers from settings.*) - ParserProtocol.configure(context: ParserContext) -> None is the extension point; no-op by default - MailDocumentParser.configure() reads mailrule_id into _mailrule_id - TextDocumentParser and TikaDocumentParser implement a no-op configure() - Consumer calls document_parser.configure(ParserContext(...)) before parse(), replacing the isinstance(parser, MailDocumentParser) guard and the direct attribute mutation Co-Authored-By: Claude Sonnet 4.6 * Feat(parsers): call configure(ParserContext()) in update_document task Apply the same new-style parser shim pattern as the consumer to update_document_content_maybe_archive_file: - Call __enter__ for Text/Tika parsers after instantiation - Call configure(ParserContext()) before parse() for all new-style parsers (mailrule_id is not available here — this is a re-process of an existing document, so the default empty context is correct) - Call parse(path, mime_type) with 2 args for new-style parsers - Call get_thumbnail(path, mime_type) with 2 args for new-style parsers - Call __exit__ instead of cleanup() in the finally block Co-Authored-By: Claude Sonnet 4.6 * Fix(tests): add configure() to DummyParser and missing-method parametrize ParserProtocol now requires configure(context: ParserContext) -> None. Update DummyParser in test_registry.py to implement it, and add 'missing-configure' to the test_partial_compliant_fails_isinstance parametrize list so the new method is covered by the negative test. Co-Authored-By: Claude Sonnet 4.6 * Cleans up the reprocess task and generally reduces duplicate of classes * Corrects the score return * Updates so we can report a page count for these parsers, assuming we do have an archive produced when called * Increases test coverage * One more coverage * Updates typing * Updates typing --------- Co-authored-by: Claude Sonnet 4.6 --- pyproject.toml | 2 +- src/documents/consumer.py | 50 +- src/documents/tasks.py | 60 +- src/documents/tests/test_consumer.py | 20 +- src/paperless/parsers/__init__.py | 55 ++ src/paperless/parsers/mail.py | 834 ++++++++++++++++++ src/paperless/parsers/registry.py | 2 + src/paperless/parsers/remote.py | 4 + src/paperless/parsers/text.py | 4 + src/paperless/parsers/tika.py | 14 +- src/paperless/tests/parsers/conftest.py | 164 ++++ .../tests/parsers/test_mail_parser.py} | 88 +- .../tests/parsers/test_mail_parser_live.py} | 8 +- .../tests/parsers/test_remote_parser.py | 2 + .../tests/parsers/test_text_parser.py | 5 + .../tests/parsers/test_tika_parser.py | 25 + .../tests/samples/mail}/broken.eml | 0 .../tests/samples/mail}/first.pdf | Bin .../tests/samples/mail}/html.eml | 0 .../tests/samples/mail}/html.eml.html | 0 .../tests/samples/mail}/html.eml.pdf | Bin .../tests/samples/mail}/html.eml.pdf.webp | Bin .../tests/samples/mail}/sample.html | 0 .../tests/samples/mail}/sample.html.pdf | Bin .../tests/samples/mail}/sample.html.pdf.webp | Bin .../tests/samples/mail}/sample.png | Bin .../tests/samples/mail}/second.pdf | Bin .../tests/samples/mail}/simple_text.eml | 0 .../tests/samples/mail}/simple_text.eml.pdf | Bin .../samples/mail}/simple_text.eml.pdf.webp | Bin src/paperless/tests/test_registry.py | 7 + src/paperless_mail/parsers.py | 481 ---------- src/paperless_mail/signals.py | 9 +- src/paperless_mail/tests/conftest.py | 70 -- 34 files changed, 1285 insertions(+), 619 deletions(-) create mode 100644 src/paperless/parsers/mail.py rename src/{paperless_mail/tests/test_parsers.py => paperless/tests/parsers/test_mail_parser.py} (89%) rename src/{paperless_mail/tests/test_parsers_live.py => paperless/tests/parsers/test_mail_parser_live.py} (97%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/broken.eml (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/first.pdf (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/html.eml (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/html.eml.html (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/html.eml.pdf (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/html.eml.pdf.webp (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/sample.html (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/sample.html.pdf (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/sample.html.pdf.webp (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/sample.png (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/second.pdf (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/simple_text.eml (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/simple_text.eml.pdf (100%) rename src/{paperless_mail/tests/samples => paperless/tests/samples/mail}/simple_text.eml.pdf.webp (100%) delete mode 100644 src/paperless_mail/parsers.py diff --git a/pyproject.toml b/pyproject.toml index 43ad1e1cc..d41a918c0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -256,7 +256,7 @@ lint.isort.force-single-line = true [tool.codespell] write-changes = true ignore-words-list = "criterias,afterall,valeu,ureue,equest,ure,assertIn,Oktober,commitish" -skip = "src-ui/src/locale/*,src-ui/pnpm-lock.yaml,src-ui/e2e/*,src/paperless_mail/tests/samples/*,src/documents/tests/samples/*,*.po,*.json" +skip = "src-ui/src/locale/*,src-ui/pnpm-lock.yaml,src-ui/e2e/*,src/paperless_mail/tests/samples/*,src/paperless/tests/samples/mail/*,src/documents/tests/samples/*,*.po,*.json" [tool.pytest] minversion = "9.0" diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 11abf46d4..ba2bba473 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -51,10 +51,11 @@ from documents.templating.workflows import parse_w_workflow_placeholders from documents.utils import copy_basic_file_stats from documents.utils import copy_file_with_basic_stats from documents.utils import run_subprocess +from paperless.parsers import ParserContext +from paperless.parsers.mail import MailDocumentParser from paperless.parsers.remote import RemoteDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser -from paperless_mail.parsers import MailDocumentParser LOGGING_NAME: Final[str] = "paperless.consumer" @@ -71,7 +72,12 @@ def _parser_cleanup(parser: DocumentParser) -> None: """ if isinstance( parser, - (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), + ( + MailDocumentParser, + RemoteDocumentParser, + TextDocumentParser, + TikaDocumentParser, + ), ): parser.__exit__(None, None, None) else: @@ -453,13 +459,20 @@ class ConsumerPlugin( progress_callback=progress_callback, ) + parser_is_new_style = isinstance( + document_parser, + ( + MailDocumentParser, + RemoteDocumentParser, + TextDocumentParser, + TikaDocumentParser, + ), + ) + # New-style parsers use __enter__/__exit__ for resource management. # _parser_cleanup (below) handles __exit__; call __enter__ here. # TODO(stumpylog): Remove me in the future - if isinstance( - document_parser, - (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), - ): + if parser_is_new_style: document_parser.__enter__() self.log.debug(f"Parser: {type(document_parser).__name__}") @@ -480,20 +493,12 @@ class ConsumerPlugin( ConsumerStatusShortMessage.PARSING_DOCUMENT, ) self.log.debug(f"Parsing {self.filename}...") - if ( - isinstance(document_parser, MailDocumentParser) - and self.input_doc.mailrule_id - ): - document_parser.parse( - self.working_copy, - mime_type, - self.filename, - self.input_doc.mailrule_id, + + # TODO(stumpylog): Remove me in the future when all parsers use new protocol + if parser_is_new_style: + document_parser.configure( + ParserContext(mailrule_id=self.input_doc.mailrule_id), ) - elif isinstance( - document_parser, - (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), - ): # TODO(stumpylog): Remove me in the future document_parser.parse(self.working_copy, mime_type) else: @@ -506,11 +511,8 @@ class ConsumerPlugin( ProgressStatusOptions.WORKING, ConsumerStatusShortMessage.GENERATING_THUMBNAIL, ) - if isinstance( - document_parser, - (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), - ): - # TODO(stumpylog): Remove me in the future + # TODO(stumpylog): Remove me in the future when all parsers use new protocol + if parser_is_new_style: thumbnail = document_parser.get_thumbnail(self.working_copy, mime_type) else: thumbnail = document_parser.get_thumbnail( diff --git a/src/documents/tasks.py b/src/documents/tasks.py index 378695731..947da878f 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -65,6 +65,11 @@ from documents.signals.handlers import run_workflows from documents.signals.handlers import send_websocket_document_updated from documents.workflows.utils import get_workflows_for_trigger from paperless.config import AIConfig +from paperless.parsers import ParserContext +from paperless.parsers.mail import MailDocumentParser +from paperless.parsers.remote import RemoteDocumentParser +from paperless.parsers.text import TextDocumentParser +from paperless.parsers.tika import TikaDocumentParser from paperless_ai.indexing import llm_index_add_or_update_document from paperless_ai.indexing import llm_index_remove_document from paperless_ai.indexing import update_llm_index @@ -304,7 +309,9 @@ def update_document_content_maybe_archive_file(document_id) -> None: mime_type = document.mime_type - parser_class: type[DocumentParser] = get_parser_class_for_mime_type(mime_type) + parser_class: type[DocumentParser] | None = get_parser_class_for_mime_type( + mime_type, + ) if not parser_class: logger.error( @@ -315,14 +322,41 @@ def update_document_content_maybe_archive_file(document_id) -> None: parser: DocumentParser = parser_class(logging_group=uuid.uuid4()) - try: - parser.parse(document.source_path, mime_type, document.get_public_filename()) + parser_is_new_style = isinstance( + parser, + ( + MailDocumentParser, + RemoteDocumentParser, + TextDocumentParser, + TikaDocumentParser, + ), + ) - thumbnail = parser.get_thumbnail( - document.source_path, - mime_type, - document.get_public_filename(), - ) + # TODO(stumpylog): Remove branch in the future when all parsers use new protocol + if parser_is_new_style: + parser.__enter__() + + try: + # TODO(stumpylog): Remove branch in the future when all parsers use new protocol + if parser_is_new_style: + parser.configure(ParserContext()) + parser.parse(document.source_path, mime_type) + else: + parser.parse( + document.source_path, + mime_type, + document.get_public_filename(), + ) + + # TODO(stumpylog): Remove branch in the future when all parsers use new protocol + if parser_is_new_style: + thumbnail = parser.get_thumbnail(document.source_path, mime_type) + else: + thumbnail = parser.get_thumbnail( + document.source_path, + mime_type, + document.get_public_filename(), + ) with transaction.atomic(): oldDocument = Document.objects.get(pk=document.pk) @@ -403,8 +437,14 @@ def update_document_content_maybe_archive_file(document_id) -> None: f"Error while parsing document {document} (ID: {document_id})", ) finally: - # TODO(stumpylog): Cleanup once all parsers are handled - parser.cleanup() + # TODO(stumpylog): Remove branch in the future when all parsers use new protocol + if isinstance( + parser, + (MailDocumentParser, TextDocumentParser, TikaDocumentParser), + ): + parser.__exit__(None, None, None) + else: + parser.cleanup() @shared_task diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index a59c7d676..a3574fdce 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -36,7 +36,6 @@ from documents.tests.utils import DummyProgressManager from documents.tests.utils import FileSystemAssertsMixin from documents.tests.utils import GetConsumerMixin from paperless_mail.models import MailRule -from paperless_mail.parsers import MailDocumentParser class _BaseTestParser(DocumentParser): @@ -1091,7 +1090,7 @@ class TestConsumer( self.assertEqual(command[1], "--replace-input") @mock.patch("paperless_mail.models.MailRule.objects.get") - @mock.patch("paperless_mail.parsers.MailDocumentParser.parse") + @mock.patch("paperless.parsers.mail.MailDocumentParser.parse") @mock.patch("documents.parsers.document_consumer_declaration.send") def test_mail_parser_receives_mailrule( self, @@ -1107,11 +1106,13 @@ class TestConsumer( THEN: - The mail parser should receive the mail rule """ + from paperless_mail.signals import get_parser as mail_get_parser + mock_consumer_declaration_send.return_value = [ ( None, { - "parser": MailDocumentParser, + "parser": mail_get_parser, "mime_types": {"message/rfc822": ".eml"}, "weight": 0, }, @@ -1123,9 +1124,10 @@ class TestConsumer( with self.get_consumer( filepath=( Path(__file__).parent.parent.parent - / Path("paperless_mail") + / Path("paperless") / Path("tests") / Path("samples") + / Path("mail") ).resolve() / "html.eml", source=DocumentSource.MailFetch, @@ -1136,12 +1138,10 @@ class TestConsumer( ConsumerError, ): consumer.run() - mock_mail_parser_parse.assert_called_once_with( - consumer.working_copy, - "message/rfc822", - file_name="sample.pdf", - mailrule=mock_mailrule_get.return_value, - ) + mock_mail_parser_parse.assert_called_once_with( + consumer.working_copy, + "message/rfc822", + ) @mock.patch("documents.consumer.magic.from_file", fake_magic_from_file) diff --git a/src/paperless/parsers/__init__.py b/src/paperless/parsers/__init__.py index ea67ade00..c9c1530a5 100644 --- a/src/paperless/parsers/__init__.py +++ b/src/paperless/parsers/__init__.py @@ -35,6 +35,7 @@ Usage example (third-party parser):: from __future__ import annotations +from dataclasses import dataclass from typing import TYPE_CHECKING from typing import Protocol from typing import Self @@ -48,6 +49,7 @@ if TYPE_CHECKING: __all__ = [ "MetadataEntry", + "ParserContext", "ParserProtocol", ] @@ -73,6 +75,44 @@ class MetadataEntry(TypedDict): """String representation of the field value.""" +@dataclass(frozen=True, slots=True) +class ParserContext: + """Immutable context passed to a parser before parse(). + + The consumer assembles this from the ingestion event and Django + settings, then calls ``parser.configure(context)`` before + ``parser.parse()``. Parsers read only the fields relevant to them; + unneeded fields are ignored. + + ``frozen=True`` prevents accidental mutation after the consumer + hands the context off. ``slots=True`` keeps instances lightweight. + + Fields + ------ + mailrule_id : int | None + Primary key of the ``MailRule`` that triggered this ingestion, + or ``None`` when the document did not arrive via a mail rule. + Used by ``MailDocumentParser`` to select the PDF layout. + + Notes + ----- + Future fields (not yet implemented): + + * ``output_type`` — PDF/A variant for archive generation + (replaces ``settings.OCR_OUTPUT_TYPE`` reads inside parsers). + * ``ocr_mode`` — skip-text, redo, force, etc. + (replaces ``settings.OCR_MODE`` reads inside parsers). + * ``ocr_language`` — Tesseract language string. + (replaces ``settings.OCR_LANGUAGE`` reads inside parsers). + + When those fields are added the consumer will read from Django + settings once and populate them here, decoupling parsers from + ``settings.*`` entirely. + """ + + mailrule_id: int | None = None + + @runtime_checkable class ParserProtocol(Protocol): """Structural contract for all Paperless-ngx document parsers. @@ -191,6 +231,21 @@ class ParserProtocol(Protocol): # Core parsing interface # ------------------------------------------------------------------ + def configure(self, context: ParserContext) -> None: + """Apply source context before parse(). + + Called by the consumer after instantiation and before parse(). + The default implementation is a no-op; parsers override only the + fields they need. + + Parameters + ---------- + context: + Immutable context assembled by the consumer for this + specific ingestion event. + """ + ... + def parse( self, document_path: Path, diff --git a/src/paperless/parsers/mail.py b/src/paperless/parsers/mail.py new file mode 100644 index 000000000..9914b2ec6 --- /dev/null +++ b/src/paperless/parsers/mail.py @@ -0,0 +1,834 @@ +""" +Built-in mail document parser. + +Handles message/rfc822 (EML) MIME type by: +- Parsing the email using imap_tools +- Generating a PDF via Gotenberg (for display and archive) +- Extracting text via Tika for HTML content +- Extracting metadata from email headers + +The parser always produces a PDF because EML files cannot be rendered +natively in a browser (requires_pdf_rendition=True). +""" + +from __future__ import annotations + +import logging +import re +import shutil +import tempfile +from html import escape +from pathlib import Path +from typing import TYPE_CHECKING +from typing import Self + +from bleach import clean +from bleach import linkify +from django.conf import settings +from django.utils import timezone +from django.utils.timezone import is_naive +from django.utils.timezone import make_aware +from gotenberg_client import GotenbergClient +from gotenberg_client.constants import A4 +from gotenberg_client.options import Measurement +from gotenberg_client.options import MeasurementUnitType +from gotenberg_client.options import PageMarginsType +from gotenberg_client.options import PdfAFormat +from humanize import naturalsize +from imap_tools import MailAttachment +from imap_tools import MailMessage +from tika_client import TikaClient + +from documents.parsers import ParseError +from documents.parsers import make_thumbnail_from_pdf +from paperless.models import OutputTypeChoices +from paperless.version import __full_version_str__ +from paperless_mail.models import MailRule + +if TYPE_CHECKING: + import datetime + from types import TracebackType + + from paperless.parsers import MetadataEntry + from paperless.parsers import ParserContext + +logger = logging.getLogger("paperless.parsing.mail") + +_SUPPORTED_MIME_TYPES: dict[str, str] = { + "message/rfc822": ".eml", +} + + +class MailDocumentParser: + """Parse .eml email files for Paperless-ngx. + + Uses imap_tools to parse .eml files, generates a PDF using Gotenberg, + and sends the HTML part to a Tika server for text extraction. Because + EML files cannot be rendered natively in a browser, the parser always + produces a PDF rendition (requires_pdf_rendition=True). + + Pass a ``ParserContext`` to ``configure()`` before ``parse()`` to + apply mail-rule-specific PDF layout options: + + parser.configure(ParserContext(mailrule_id=rule.pk)) + parser.parse(path, mime_type) + + Class attributes + ---------------- + name : str + Human-readable parser name. + version : str + Semantic version string, kept in sync with Paperless-ngx releases. + author : str + Maintainer name. + url : str + Issue tracker / source URL. + """ + + name: str = "Paperless-ngx Mail Parser" + version: str = __full_version_str__ + author: str = "Paperless-ngx Contributors" + url: str = "https://github.com/paperless-ngx/paperless-ngx" + + # ------------------------------------------------------------------ + # Class methods + # ------------------------------------------------------------------ + + @classmethod + def supported_mime_types(cls) -> dict[str, str]: + """Return the MIME types this parser handles. + + Returns + ------- + dict[str, str] + Mapping of MIME type to preferred file extension. + """ + return _SUPPORTED_MIME_TYPES + + @classmethod + def score( + cls, + mime_type: str, + filename: str, + path: Path | None = None, + ) -> int | None: + """Return the priority score for handling this file. + + Parameters + ---------- + mime_type: + Detected MIME type of the file. + filename: + Original filename including extension. + path: + Optional filesystem path. Not inspected by this parser. + + Returns + ------- + int | None + 10 if the MIME type is supported, otherwise None. + """ + if mime_type in _SUPPORTED_MIME_TYPES: + return 10 + return None + + # ------------------------------------------------------------------ + # Properties + # ------------------------------------------------------------------ + + @property + def can_produce_archive(self) -> bool: + """Whether this parser can produce a searchable PDF archive copy. + + Returns + ------- + bool + Always False — the mail parser produces a display PDF + (requires_pdf_rendition=True), not an optional OCR archive. + """ + return False + + @property + def requires_pdf_rendition(self) -> bool: + """Whether the parser must produce a PDF for the frontend to display. + + Returns + ------- + bool + Always True — EML files cannot be rendered natively in a browser, + so a PDF conversion is always required for display. + """ + return True + + # ------------------------------------------------------------------ + # Lifecycle + # ------------------------------------------------------------------ + + def __init__(self, logging_group: object = None) -> None: + settings.SCRATCH_DIR.mkdir(parents=True, exist_ok=True) + self._tempdir = Path( + tempfile.mkdtemp(prefix="paperless-", dir=settings.SCRATCH_DIR), + ) + self._text: str | None = None + self._date: datetime.datetime | None = None + self._archive_path: Path | None = None + self._mailrule_id: int | None = None + + def __enter__(self) -> Self: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + logger.debug("Cleaning up temporary directory %s", self._tempdir) + shutil.rmtree(self._tempdir, ignore_errors=True) + + # ------------------------------------------------------------------ + # Core parsing interface + # ------------------------------------------------------------------ + + def configure(self, context: ParserContext) -> None: + self._mailrule_id = context.mailrule_id + + def parse( + self, + document_path: Path, + mime_type: str, + *, + produce_archive: bool = True, + ) -> None: + """Parse the given .eml into formatted text and a PDF archive. + + Call ``configure(ParserContext(mailrule_id=...))`` before this method + to apply mail-rule-specific PDF layout options. The ``produce_archive`` + flag is accepted for protocol compatibility but is always honoured — + the mail parser always produces a PDF since EML files cannot be + displayed natively. + + Parameters + ---------- + document_path: + Absolute path to the .eml file. + mime_type: + Detected MIME type of the document (should be "message/rfc822"). + produce_archive: + Accepted for protocol compatibility. The PDF rendition is always + produced since EML files cannot be displayed natively in a browser. + + Raises + ------ + documents.parsers.ParseError + If the file cannot be parsed or PDF generation fails. + """ + + def strip_text(text: str) -> str: + """Reduces the spacing of the given text string.""" + text = re.sub(r"\s+", " ", text) + text = re.sub(r"(\n *)+", "\n", text) + return text.strip() + + def build_formatted_text(mail_message: MailMessage) -> str: + """Constructs a formatted string based on the given email.""" + fmt_text = f"Subject: {mail_message.subject}\n\n" + fmt_text += f"From: {mail_message.from_values.full if mail_message.from_values else ''}\n\n" + to_list = [address.full for address in mail_message.to_values] + fmt_text += f"To: {', '.join(to_list)}\n\n" + if mail_message.cc_values: + fmt_text += ( + f"CC: {', '.join(address.full for address in mail.cc_values)}\n\n" + ) + if mail_message.bcc_values: + fmt_text += ( + f"BCC: {', '.join(address.full for address in mail.bcc_values)}\n\n" + ) + if mail_message.attachments: + att = [] + for a in mail.attachments: + attachment_size = naturalsize(a.size, binary=True, format="%.2f") + att.append( + f"{a.filename} ({attachment_size})", + ) + fmt_text += f"Attachments: {', '.join(att)}\n\n" + + if mail.html: + fmt_text += "HTML content: " + strip_text(self.tika_parse(mail.html)) + + fmt_text += f"\n\n{strip_text(mail.text)}" + + return fmt_text + + logger.debug("Parsing file %s into an email", document_path.name) + mail = self.parse_file_to_message(document_path) + + logger.debug("Building formatted text from email") + self._text = build_formatted_text(mail) + + if is_naive(mail.date): + self._date = make_aware(mail.date) + else: + self._date = mail.date + + logger.debug("Creating a PDF from the email") + if self._mailrule_id: + rule = MailRule.objects.get(pk=self._mailrule_id) + self._archive_path = self.generate_pdf( + mail, + MailRule.PdfLayout(rule.pdf_layout), + ) + else: + self._archive_path = self.generate_pdf(mail) + + # ------------------------------------------------------------------ + # Result accessors + # ------------------------------------------------------------------ + + def get_text(self) -> str | None: + """Return the plain-text content extracted during parse. + + Returns + ------- + str | None + Extracted text, or None if parse has not been called yet. + """ + return self._text + + def get_date(self) -> datetime.datetime | None: + """Return the document date detected during parse. + + Returns + ------- + datetime.datetime | None + Date from the email headers, or None if not detected. + """ + return self._date + + def get_archive_path(self) -> Path | None: + """Return the path to the generated archive PDF, or None. + + Returns + ------- + Path | None + Path to the PDF produced by Gotenberg, or None if parse has not + been called yet. + """ + return self._archive_path + + # ------------------------------------------------------------------ + # Thumbnail and metadata + # ------------------------------------------------------------------ + + def get_thumbnail( + self, + document_path: Path, + mime_type: str, + file_name: str | None = None, + ) -> Path: + """Generate a thumbnail from the PDF rendition of the email. + + Converts the document to PDF first if not already done. + + Parameters + ---------- + document_path: + Absolute path to the source document. + mime_type: + Detected MIME type of the document. + file_name: + Kept for backward compatibility; not used. + + Returns + ------- + Path + Path to the generated WebP thumbnail inside the temporary directory. + """ + if not self._archive_path: + self._archive_path = self.generate_pdf( + self.parse_file_to_message(document_path), + ) + + return make_thumbnail_from_pdf( + self._archive_path, + self._tempdir, + ) + + def get_page_count( + self, + document_path: Path, + mime_type: str, + ) -> int | None: + """Return the number of pages in the document. + + Counts pages in the archive PDF produced by a preceding parse() + call. Returns ``None`` if parse() has not been called yet or if + no archive was produced. + + Returns + ------- + int | None + Page count of the archive PDF, or ``None``. + """ + if self._archive_path is not None: + from paperless.parsers.utils import get_page_count_for_pdf + + return get_page_count_for_pdf(self._archive_path, log=logger) + return None + + def extract_metadata( + self, + document_path: Path, + mime_type: str, + ) -> list[MetadataEntry]: + """Extract metadata from the email headers. + + Returns email headers as metadata entries with prefix "header", + plus summary entries for attachments and date. + + Returns + ------- + list[MetadataEntry] + Sorted list of metadata entries, or ``[]`` on parse failure. + """ + result: list[MetadataEntry] = [] + + try: + mail = self.parse_file_to_message(document_path) + except ParseError as e: + logger.warning( + "Error while fetching document metadata for %s: %s", + document_path, + e, + ) + return result + + for key, header_values in mail.headers.items(): + value = ", ".join(header_values) + try: + value.encode("utf-8") + except UnicodeEncodeError as e: # pragma: no cover + logger.debug("Skipping header %s: %s", key, e) + continue + + result.append( + { + "namespace": "", + "prefix": "header", + "key": key, + "value": value, + }, + ) + + result.append( + { + "namespace": "", + "prefix": "", + "key": "attachments", + "value": ", ".join( + f"{attachment.filename}" + f"({naturalsize(attachment.size, binary=True, format='%.2f')})" + for attachment in mail.attachments + ), + }, + ) + + result.append( + { + "namespace": "", + "prefix": "", + "key": "date", + "value": mail.date.strftime("%Y-%m-%d %H:%M:%S %Z"), + }, + ) + + result.sort(key=lambda item: (item["prefix"], item["key"])) + return result + + # ------------------------------------------------------------------ + # Email-specific methods + # ------------------------------------------------------------------ + + def _settings_to_gotenberg_pdfa(self) -> PdfAFormat | None: + """Convert the OCR output type setting to a Gotenberg PdfAFormat.""" + if settings.OCR_OUTPUT_TYPE in { + OutputTypeChoices.PDF_A, + OutputTypeChoices.PDF_A2, + }: + return PdfAFormat.A2b + elif settings.OCR_OUTPUT_TYPE == OutputTypeChoices.PDF_A1: # pragma: no cover + logger.warning( + "Gotenberg does not support PDF/A-1a, choosing PDF/A-2b instead", + ) + return PdfAFormat.A2b + elif settings.OCR_OUTPUT_TYPE == OutputTypeChoices.PDF_A3: # pragma: no cover + return PdfAFormat.A3b + return None + + @staticmethod + def parse_file_to_message(filepath: Path) -> MailMessage: + """Parse the given .eml file into a MailMessage object. + + Parameters + ---------- + filepath: + Path to the .eml file. + + Returns + ------- + MailMessage + Parsed mail message. + + Raises + ------ + documents.parsers.ParseError + If the file cannot be parsed or is missing required fields. + """ + try: + with filepath.open("rb") as eml: + parsed = MailMessage.from_bytes(eml.read()) + if parsed.from_values is None: + raise ParseError( + f"Could not parse {filepath}: Missing 'from'", + ) + except Exception as err: + raise ParseError( + f"Could not parse {filepath}: {err}", + ) from err + + return parsed + + def tika_parse(self, html: str) -> str: + """Send HTML content to the Tika server for text extraction. + + Parameters + ---------- + html: + HTML string to parse. + + Returns + ------- + str + Extracted plain text. + + Raises + ------ + documents.parsers.ParseError + If the Tika server cannot be reached or returns an error. + """ + logger.info("Sending content to Tika server") + + try: + with TikaClient(tika_url=settings.TIKA_ENDPOINT) as client: + parsed = client.tika.as_text.from_buffer(html, "text/html") + + if parsed.content is not None: + return parsed.content.strip() + return "" + except Exception as err: + raise ParseError( + f"Could not parse content with tika server at " + f"{settings.TIKA_ENDPOINT}: {err}", + ) from err + + def generate_pdf( + self, + mail_message: MailMessage, + pdf_layout: MailRule.PdfLayout | None = None, + ) -> Path: + """Generate a PDF from the email message. + + Creates separate PDFs for the email body and HTML content, then + merges them according to the requested layout. + + Parameters + ---------- + mail_message: + Parsed email message. + pdf_layout: + Layout option for the PDF. Falls back to the + EMAIL_PARSE_DEFAULT_LAYOUT setting if not provided. + + Returns + ------- + Path + Path to the generated PDF inside the temporary directory. + """ + archive_path = Path(self._tempdir) / "merged.pdf" + + mail_pdf_file = self.generate_pdf_from_mail(mail_message) + + if pdf_layout is None: + pdf_layout = MailRule.PdfLayout(settings.EMAIL_PARSE_DEFAULT_LAYOUT) + + # If no HTML content, create the PDF from the message. + # Otherwise, create 2 PDFs and merge them with Gotenberg. + if not mail_message.html: + archive_path.write_bytes(mail_pdf_file.read_bytes()) + else: + pdf_of_html_content = self.generate_pdf_from_html( + mail_message.html, + mail_message.attachments, + ) + + logger.debug("Merging email text and HTML content into single PDF") + + with ( + GotenbergClient( + host=settings.TIKA_GOTENBERG_ENDPOINT, + timeout=settings.CELERY_TASK_TIME_LIMIT, + ) as client, + client.merge.merge() as route, + ): + # Configure requested PDF/A formatting, if any + pdf_a_format = self._settings_to_gotenberg_pdfa() + if pdf_a_format is not None: + route.pdf_format(pdf_a_format) + + match pdf_layout: + case MailRule.PdfLayout.HTML_TEXT: + route.merge([pdf_of_html_content, mail_pdf_file]) + case MailRule.PdfLayout.HTML_ONLY: + route.merge([pdf_of_html_content]) + case MailRule.PdfLayout.TEXT_ONLY: + route.merge([mail_pdf_file]) + case MailRule.PdfLayout.TEXT_HTML | _: + route.merge([mail_pdf_file, pdf_of_html_content]) + + try: + response = route.run() + archive_path.write_bytes(response.content) + except Exception as err: + raise ParseError( + f"Error while merging email HTML into PDF: {err}", + ) from err + + return archive_path + + def mail_to_html(self, mail: MailMessage) -> Path: + """Convert the given email into an HTML file using a template. + + Parameters + ---------- + mail: + Parsed mail message. + + Returns + ------- + Path + Path to the rendered HTML file inside the temporary directory. + """ + + def clean_html(text: str) -> str: + """Attempt to clean, escape, and linkify the given HTML string.""" + if isinstance(text, list): + text = "\n".join([str(e) for e in text]) + if not isinstance(text, str): + text = str(text) + text = escape(text) + text = clean(text) + text = linkify(text, parse_email=True) + text = text.replace("\n", "
") + return text + + data = {} + + data["subject"] = clean_html(mail.subject) + if data["subject"]: + data["subject_label"] = "Subject" + data["from"] = clean_html(mail.from_values.full if mail.from_values else "") + if data["from"]: + data["from_label"] = "From" + data["to"] = clean_html(", ".join(address.full for address in mail.to_values)) + if data["to"]: + data["to_label"] = "To" + data["cc"] = clean_html(", ".join(address.full for address in mail.cc_values)) + if data["cc"]: + data["cc_label"] = "CC" + data["bcc"] = clean_html(", ".join(address.full for address in mail.bcc_values)) + if data["bcc"]: + data["bcc_label"] = "BCC" + + att = [] + for a in mail.attachments: + att.append( + f"{a.filename} ({naturalsize(a.size, binary=True, format='%.2f')})", + ) + data["attachments"] = clean_html(", ".join(att)) + if data["attachments"]: + data["attachments_label"] = "Attachments" + + data["date"] = clean_html( + timezone.localtime(mail.date).strftime("%Y-%m-%d %H:%M"), + ) + data["content"] = clean_html(mail.text.strip()) + + from django.template.loader import render_to_string + + html_file = Path(self._tempdir) / "email_as_html.html" + html_file.write_text(render_to_string("email_msg_template.html", context=data)) + + return html_file + + def generate_pdf_from_mail(self, mail: MailMessage) -> Path: + """Create a PDF from the email body using an HTML template and Gotenberg. + + Parameters + ---------- + mail: + Parsed mail message. + + Returns + ------- + Path + Path to the generated PDF inside the temporary directory. + + Raises + ------ + documents.parsers.ParseError + If Gotenberg returns an error. + """ + logger.info("Converting mail to PDF") + + css_file = ( + Path(__file__).parent.parent.parent + / "paperless_mail" + / "templates" + / "output.css" + ) + email_html_file = self.mail_to_html(mail) + + with ( + GotenbergClient( + host=settings.TIKA_GOTENBERG_ENDPOINT, + timeout=settings.CELERY_TASK_TIME_LIMIT, + ) as client, + client.chromium.html_to_pdf() as route, + ): + # Configure requested PDF/A formatting, if any + pdf_a_format = self._settings_to_gotenberg_pdfa() + if pdf_a_format is not None: + route.pdf_format(pdf_a_format) + + try: + response = ( + route.index(email_html_file) + .resource(css_file) + .margins( + PageMarginsType( + top=Measurement(0.1, MeasurementUnitType.Inches), + bottom=Measurement(0.1, MeasurementUnitType.Inches), + left=Measurement(0.1, MeasurementUnitType.Inches), + right=Measurement(0.1, MeasurementUnitType.Inches), + ), + ) + .size(A4) + .scale(1.0) + .run() + ) + except Exception as err: + raise ParseError( + f"Error while converting email to PDF: {err}", + ) from err + + email_as_pdf_file = Path(self._tempdir) / "email_as_pdf.pdf" + email_as_pdf_file.write_bytes(response.content) + + return email_as_pdf_file + + def generate_pdf_from_html( + self, + orig_html: str, + attachments: list[MailAttachment], + ) -> Path: + """Generate a PDF from the HTML content of the email. + + Parameters + ---------- + orig_html: + Raw HTML string from the email body. + attachments: + List of email attachments (used as inline resources). + + Returns + ------- + Path + Path to the generated PDF inside the temporary directory. + + Raises + ------ + documents.parsers.ParseError + If Gotenberg returns an error. + """ + + def clean_html_script(text: str) -> str: + compiled_open = re.compile(re.escape(" None: + pass + def parse( self, document_path: Path, diff --git a/src/paperless/parsers/text.py b/src/paperless/parsers/text.py index 99d9dab08..00d738995 100644 --- a/src/paperless/parsers/text.py +++ b/src/paperless/parsers/text.py @@ -27,6 +27,7 @@ if TYPE_CHECKING: from types import TracebackType from paperless.parsers import MetadataEntry + from paperless.parsers import ParserContext logger = logging.getLogger("paperless.parsing.text") @@ -156,6 +157,9 @@ class TextDocumentParser: # Core parsing interface # ------------------------------------------------------------------ + def configure(self, context: ParserContext) -> None: + pass + def parse( self, document_path: Path, diff --git a/src/paperless/parsers/tika.py b/src/paperless/parsers/tika.py index b9307858a..674d74fe2 100644 --- a/src/paperless/parsers/tika.py +++ b/src/paperless/parsers/tika.py @@ -35,6 +35,7 @@ if TYPE_CHECKING: from types import TracebackType from paperless.parsers import MetadataEntry + from paperless.parsers import ParserContext logger = logging.getLogger("paperless.parsing.tika") @@ -205,6 +206,9 @@ class TikaDocumentParser: # Core parsing interface # ------------------------------------------------------------------ + def configure(self, context: ParserContext) -> None: + pass + def parse( self, document_path: Path, @@ -340,11 +344,19 @@ class TikaDocumentParser: ) -> int | None: """Return the number of pages in the document. + Counts pages in the archive PDF produced by a preceding parse() + call. Returns ``None`` if parse() has not been called yet or if + no archive was produced. + Returns ------- int | None - Always None — page count is not available from Tika. + Page count of the archive PDF, or ``None``. """ + if self._archive_path is not None: + from paperless.parsers.utils import get_page_count_for_pdf + + return get_page_count_for_pdf(self._archive_path, log=logger) return None def extract_metadata( diff --git a/src/paperless/tests/parsers/conftest.py b/src/paperless/tests/parsers/conftest.py index 19603db83..5a22f24ab 100644 --- a/src/paperless/tests/parsers/conftest.py +++ b/src/paperless/tests/parsers/conftest.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING import pytest +from paperless.parsers.mail import MailDocumentParser from paperless.parsers.remote import RemoteDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser @@ -247,3 +248,166 @@ def tika_parser() -> Generator[TikaDocumentParser, None, None]: """ with TikaDocumentParser() as parser: yield parser + + +# ------------------------------------------------------------------ +# Mail parser sample files +# ------------------------------------------------------------------ + + +@pytest.fixture(scope="session") +def mail_samples_dir(samples_dir: Path) -> Path: + """Absolute path to the mail parser sample files directory. + + Returns + ------- + Path + ``/mail/`` + """ + return samples_dir / "mail" + + +@pytest.fixture(scope="session") +def broken_email_file(mail_samples_dir: Path) -> Path: + """Path to a broken/malformed EML sample file. + + Returns + ------- + Path + Absolute path to ``mail/broken.eml``. + """ + return mail_samples_dir / "broken.eml" + + +@pytest.fixture(scope="session") +def simple_txt_email_file(mail_samples_dir: Path) -> Path: + """Path to a plain-text email sample file. + + Returns + ------- + Path + Absolute path to ``mail/simple_text.eml``. + """ + return mail_samples_dir / "simple_text.eml" + + +@pytest.fixture(scope="session") +def simple_txt_email_pdf_file(mail_samples_dir: Path) -> Path: + """Path to the expected PDF rendition of the plain-text email. + + Returns + ------- + Path + Absolute path to ``mail/simple_text.eml.pdf``. + """ + return mail_samples_dir / "simple_text.eml.pdf" + + +@pytest.fixture(scope="session") +def simple_txt_email_thumbnail_file(mail_samples_dir: Path) -> Path: + """Path to the expected thumbnail for the plain-text email. + + Returns + ------- + Path + Absolute path to ``mail/simple_text.eml.pdf.webp``. + """ + return mail_samples_dir / "simple_text.eml.pdf.webp" + + +@pytest.fixture(scope="session") +def html_email_file(mail_samples_dir: Path) -> Path: + """Path to an HTML email sample file. + + Returns + ------- + Path + Absolute path to ``mail/html.eml``. + """ + return mail_samples_dir / "html.eml" + + +@pytest.fixture(scope="session") +def html_email_pdf_file(mail_samples_dir: Path) -> Path: + """Path to the expected PDF rendition of the HTML email. + + Returns + ------- + Path + Absolute path to ``mail/html.eml.pdf``. + """ + return mail_samples_dir / "html.eml.pdf" + + +@pytest.fixture(scope="session") +def html_email_thumbnail_file(mail_samples_dir: Path) -> Path: + """Path to the expected thumbnail for the HTML email. + + Returns + ------- + Path + Absolute path to ``mail/html.eml.pdf.webp``. + """ + return mail_samples_dir / "html.eml.pdf.webp" + + +@pytest.fixture(scope="session") +def html_email_html_file(mail_samples_dir: Path) -> Path: + """Path to the HTML body of the HTML email sample. + + Returns + ------- + Path + Absolute path to ``mail/html.eml.html``. + """ + return mail_samples_dir / "html.eml.html" + + +@pytest.fixture(scope="session") +def merged_pdf_first(mail_samples_dir: Path) -> Path: + """Path to the first PDF used in PDF-merge tests. + + Returns + ------- + Path + Absolute path to ``mail/first.pdf``. + """ + return mail_samples_dir / "first.pdf" + + +@pytest.fixture(scope="session") +def merged_pdf_second(mail_samples_dir: Path) -> Path: + """Path to the second PDF used in PDF-merge tests. + + Returns + ------- + Path + Absolute path to ``mail/second.pdf``. + """ + return mail_samples_dir / "second.pdf" + + +# ------------------------------------------------------------------ +# Mail parser instance +# ------------------------------------------------------------------ + + +@pytest.fixture() +def mail_parser() -> Generator[MailDocumentParser, None, None]: + """Yield a MailDocumentParser and clean up its temporary directory afterwards. + + Yields + ------ + MailDocumentParser + A ready-to-use parser instance. + """ + with MailDocumentParser() as parser: + yield parser + + +@pytest.fixture(scope="session") +def nginx_base_url() -> Generator[str, None, None]: + """ + The base URL for the nginx HTTP server we expect to be alive + """ + yield "http://localhost:8080" diff --git a/src/paperless_mail/tests/test_parsers.py b/src/paperless/tests/parsers/test_mail_parser.py similarity index 89% rename from src/paperless_mail/tests/test_parsers.py rename to src/paperless/tests/parsers/test_mail_parser.py index 9746731f8..83d81409c 100644 --- a/src/paperless_mail/tests/test_parsers.py +++ b/src/paperless/tests/parsers/test_mail_parser.py @@ -12,7 +12,64 @@ from pytest_httpx import HTTPXMock from pytest_mock import MockerFixture from documents.parsers import ParseError -from paperless_mail.parsers import MailDocumentParser +from paperless.parsers import ParserContext +from paperless.parsers import ParserProtocol +from paperless.parsers.mail import MailDocumentParser + + +class TestMailParserProtocol: + """Verify that MailDocumentParser satisfies the ParserProtocol contract.""" + + def test_isinstance_satisfies_protocol( + self, + mail_parser: MailDocumentParser, + ) -> None: + assert isinstance(mail_parser, ParserProtocol) + + def test_supported_mime_types(self) -> None: + mime_types = MailDocumentParser.supported_mime_types() + assert isinstance(mime_types, dict) + assert "message/rfc822" in mime_types + + @pytest.mark.parametrize( + ("mime_type", "expected"), + [ + ("message/rfc822", 10), + ("application/pdf", None), + ("text/plain", None), + ], + ) + def test_score(self, mime_type: str, expected: int | None) -> None: + assert MailDocumentParser.score(mime_type, "email.eml") == expected + + def test_can_produce_archive_is_false( + self, + mail_parser: MailDocumentParser, + ) -> None: + assert mail_parser.can_produce_archive is False + + def test_requires_pdf_rendition_is_true( + self, + mail_parser: MailDocumentParser, + ) -> None: + assert mail_parser.requires_pdf_rendition is True + + def test_get_page_count_returns_none_without_archive( + self, + mail_parser: MailDocumentParser, + html_email_file: Path, + ) -> None: + assert mail_parser.get_page_count(html_email_file, "message/rfc822") is None + + def test_get_page_count_returns_int_with_pdf_archive( + self, + mail_parser: MailDocumentParser, + simple_txt_email_pdf_file: Path, + ) -> None: + mail_parser._archive_path = simple_txt_email_pdf_file + count = mail_parser.get_page_count(simple_txt_email_pdf_file, "message/rfc822") + assert isinstance(count, int) + assert count > 0 class TestEmailFileParsing: @@ -24,7 +81,7 @@ class TestEmailFileParsing: def test_parse_error_missing_file( self, mail_parser: MailDocumentParser, - sample_dir: Path, + mail_samples_dir: Path, ) -> None: """ GIVEN: @@ -35,7 +92,7 @@ class TestEmailFileParsing: - An Exception is thrown """ # Check if exception is raised when parsing fails. - test_file = sample_dir / "doesntexist.eml" + test_file = mail_samples_dir / "doesntexist.eml" assert not test_file.exists() @@ -246,12 +303,12 @@ class TestEmailThumbnailGenerate: """ mocked_return = "Passing the return value through.." mock_make_thumbnail_from_pdf = mocker.patch( - "paperless_mail.parsers.make_thumbnail_from_pdf", + "paperless.parsers.mail.make_thumbnail_from_pdf", ) mock_make_thumbnail_from_pdf.return_value = mocked_return mock_generate_pdf = mocker.patch( - "paperless_mail.parsers.MailDocumentParser.generate_pdf", + "paperless.parsers.mail.MailDocumentParser.generate_pdf", ) mock_generate_pdf.return_value = "Mocked return value.." @@ -260,8 +317,7 @@ class TestEmailThumbnailGenerate: mock_generate_pdf.assert_called_once() mock_make_thumbnail_from_pdf.assert_called_once_with( "Mocked return value..", - mail_parser.tempdir, - None, + mail_parser._tempdir, ) assert mocked_return == thumb @@ -373,7 +429,7 @@ class TestParser: """ # Validate parsing returns the expected results mock_generate_pdf = mocker.patch( - "paperless_mail.parsers.MailDocumentParser.generate_pdf", + "paperless.parsers.mail.MailDocumentParser.generate_pdf", ) mail_parser.parse(simple_txt_email_file, "message/rfc822") @@ -385,7 +441,7 @@ class TestParser: "BCC: fdf@fvf.de\n\n" "\n\nThis is just a simple Text Mail." ) - assert text_expected == mail_parser.text + assert text_expected == mail_parser.get_text() assert ( datetime.datetime( 2022, @@ -396,7 +452,7 @@ class TestParser: 43, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200)), ) - == mail_parser.date + == mail_parser.get_date() ) # Just check if tried to generate archive, the unittest for generate_pdf() goes deeper. @@ -419,7 +475,7 @@ class TestParser: """ mock_generate_pdf = mocker.patch( - "paperless_mail.parsers.MailDocumentParser.generate_pdf", + "paperless.parsers.mail.MailDocumentParser.generate_pdf", ) # Validate parsing returns the expected results @@ -443,7 +499,7 @@ class TestParser: mail_parser.parse(html_email_file, "message/rfc822") mock_generate_pdf.assert_called_once() - assert text_expected == mail_parser.text + assert text_expected == mail_parser.get_text() assert ( datetime.datetime( 2022, @@ -454,7 +510,7 @@ class TestParser: 19, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200)), ) - == mail_parser.date + == mail_parser.get_date() ) def test_generate_pdf_parse_error( @@ -501,7 +557,7 @@ class TestParser: mail_parser.parse(simple_txt_email_file, "message/rfc822") - assert mail_parser.archive_path is not None + assert mail_parser.get_archive_path() is not None @pytest.mark.httpx_mock(can_send_already_matched_responses=True) def test_generate_pdf_html_email( @@ -542,7 +598,7 @@ class TestParser: ) mail_parser.parse(html_email_file, "message/rfc822") - assert mail_parser.archive_path is not None + assert mail_parser.get_archive_path() is not None def test_generate_pdf_html_email_html_to_pdf_failure( self, @@ -712,10 +768,10 @@ class TestParser: def test_layout_option(layout_option, expected_calls, expected_pdf_names): mock_mailrule_get.return_value = mock.Mock(pdf_layout=layout_option) + mail_parser.configure(ParserContext(mailrule_id=1)) mail_parser.parse( document_path=html_email_file, mime_type="message/rfc822", - mailrule_id=1, ) args, _ = mock_merge_route.call_args assert len(args[0]) == expected_calls diff --git a/src/paperless_mail/tests/test_parsers_live.py b/src/paperless/tests/parsers/test_mail_parser_live.py similarity index 97% rename from src/paperless_mail/tests/test_parsers_live.py rename to src/paperless/tests/parsers/test_mail_parser_live.py index 8a9487c16..dd17af314 100644 --- a/src/paperless_mail/tests/test_parsers_live.py +++ b/src/paperless/tests/parsers/test_mail_parser_live.py @@ -11,7 +11,7 @@ from PIL import Image from pytest_mock import MockerFixture from documents.tests.utils import util_call_with_backoff -from paperless_mail.parsers import MailDocumentParser +from paperless.parsers.mail import MailDocumentParser def extract_text(pdf_path: Path) -> str: @@ -159,7 +159,7 @@ class TestParserLive: - The returned thumbnail image file shall match the expected hash """ mock_generate_pdf = mocker.patch( - "paperless_mail.parsers.MailDocumentParser.generate_pdf", + "paperless.parsers.mail.MailDocumentParser.generate_pdf", ) mock_generate_pdf.return_value = simple_txt_email_pdf_file @@ -216,10 +216,10 @@ class TestParserLive: - The merged PDF shall contain text from both source PDFs """ mock_generate_pdf_from_html = mocker.patch( - "paperless_mail.parsers.MailDocumentParser.generate_pdf_from_html", + "paperless.parsers.mail.MailDocumentParser.generate_pdf_from_html", ) mock_generate_pdf_from_mail = mocker.patch( - "paperless_mail.parsers.MailDocumentParser.generate_pdf_from_mail", + "paperless.parsers.mail.MailDocumentParser.generate_pdf_from_mail", ) mock_generate_pdf_from_mail.return_value = merged_pdf_first mock_generate_pdf_from_html.return_value = merged_pdf_second diff --git a/src/paperless/tests/parsers/test_remote_parser.py b/src/paperless/tests/parsers/test_remote_parser.py index 3e58498c1..d0b9effba 100644 --- a/src/paperless/tests/parsers/test_remote_parser.py +++ b/src/paperless/tests/parsers/test_remote_parser.py @@ -20,6 +20,7 @@ from unittest.mock import Mock import pytest +from paperless.parsers import ParserContext from paperless.parsers import ParserProtocol from paperless.parsers.remote import RemoteDocumentParser @@ -302,6 +303,7 @@ class TestRemoteParserParse: sample_pdf_file: Path, azure_client: Mock, ) -> None: + remote_parser.configure(ParserContext()) remote_parser.parse(sample_pdf_file, "application/pdf") azure_client.close.assert_called_once() diff --git a/src/paperless/tests/parsers/test_text_parser.py b/src/paperless/tests/parsers/test_text_parser.py index d2f095f5c..091d8287e 100644 --- a/src/paperless/tests/parsers/test_text_parser.py +++ b/src/paperless/tests/parsers/test_text_parser.py @@ -12,6 +12,7 @@ from pathlib import Path import pytest +from paperless.parsers import ParserContext from paperless.parsers import ParserProtocol from paperless.parsers.text import TextDocumentParser @@ -93,6 +94,7 @@ class TestTextParserParse: text_parser: TextDocumentParser, sample_txt_file: Path, ) -> None: + text_parser.configure(ParserContext()) text_parser.parse(sample_txt_file, "text/plain") assert text_parser.get_text() == "This is a test file.\n" @@ -102,6 +104,7 @@ class TestTextParserParse: text_parser: TextDocumentParser, sample_txt_file: Path, ) -> None: + text_parser.configure(ParserContext()) text_parser.parse(sample_txt_file, "text/plain") assert text_parser.get_archive_path() is None @@ -111,6 +114,7 @@ class TestTextParserParse: text_parser: TextDocumentParser, sample_txt_file: Path, ) -> None: + text_parser.configure(ParserContext()) text_parser.parse(sample_txt_file, "text/plain") assert text_parser.get_date() is None @@ -129,6 +133,7 @@ class TestTextParserParse: - Parsing succeeds - Invalid bytes are replaced with the Unicode replacement character """ + text_parser.configure(ParserContext()) text_parser.parse(malformed_txt_file, "text/plain") assert text_parser.get_text() == "Pantothens\ufffdure\n" diff --git a/src/paperless/tests/parsers/test_tika_parser.py b/src/paperless/tests/parsers/test_tika_parser.py index d18d178e6..010969259 100644 --- a/src/paperless/tests/parsers/test_tika_parser.py +++ b/src/paperless/tests/parsers/test_tika_parser.py @@ -9,6 +9,7 @@ from pytest_django.fixtures import SettingsWrapper from pytest_httpx import HTTPXMock from documents.parsers import ParseError +from paperless.parsers import ParserContext from paperless.parsers import ParserProtocol from paperless.parsers.tika import TikaDocumentParser @@ -60,6 +61,29 @@ class TestTikaParserRegistryInterface: def test_requires_pdf_rendition_is_true(self) -> None: assert TikaDocumentParser().requires_pdf_rendition is True + def test_get_page_count_returns_none_without_archive( + self, + tika_parser: TikaDocumentParser, + sample_odt_file: Path, + ) -> None: + assert ( + tika_parser.get_page_count( + sample_odt_file, + "application/vnd.oasis.opendocument.text", + ) + is None + ) + + def test_get_page_count_returns_int_with_pdf_archive( + self, + tika_parser: TikaDocumentParser, + sample_pdf_file: Path, + ) -> None: + tika_parser._archive_path = sample_pdf_file + count = tika_parser.get_page_count(sample_pdf_file, "application/pdf") + assert isinstance(count, int) + assert count > 0 + @pytest.mark.django_db() class TestTikaParser: @@ -83,6 +107,7 @@ class TestTikaParser: # Pretend convert to PDF response httpx_mock.add_response(content=b"PDF document") + tika_parser.configure(ParserContext()) tika_parser.parse(sample_odt_file, "application/vnd.oasis.opendocument.text") assert tika_parser.get_text() == "the content" diff --git a/src/paperless_mail/tests/samples/broken.eml b/src/paperless/tests/samples/mail/broken.eml similarity index 100% rename from src/paperless_mail/tests/samples/broken.eml rename to src/paperless/tests/samples/mail/broken.eml diff --git a/src/paperless_mail/tests/samples/first.pdf b/src/paperless/tests/samples/mail/first.pdf similarity index 100% rename from src/paperless_mail/tests/samples/first.pdf rename to src/paperless/tests/samples/mail/first.pdf diff --git a/src/paperless_mail/tests/samples/html.eml b/src/paperless/tests/samples/mail/html.eml similarity index 100% rename from src/paperless_mail/tests/samples/html.eml rename to src/paperless/tests/samples/mail/html.eml diff --git a/src/paperless_mail/tests/samples/html.eml.html b/src/paperless/tests/samples/mail/html.eml.html similarity index 100% rename from src/paperless_mail/tests/samples/html.eml.html rename to src/paperless/tests/samples/mail/html.eml.html diff --git a/src/paperless_mail/tests/samples/html.eml.pdf b/src/paperless/tests/samples/mail/html.eml.pdf similarity index 100% rename from src/paperless_mail/tests/samples/html.eml.pdf rename to src/paperless/tests/samples/mail/html.eml.pdf diff --git a/src/paperless_mail/tests/samples/html.eml.pdf.webp b/src/paperless/tests/samples/mail/html.eml.pdf.webp similarity index 100% rename from src/paperless_mail/tests/samples/html.eml.pdf.webp rename to src/paperless/tests/samples/mail/html.eml.pdf.webp diff --git a/src/paperless_mail/tests/samples/sample.html b/src/paperless/tests/samples/mail/sample.html similarity index 100% rename from src/paperless_mail/tests/samples/sample.html rename to src/paperless/tests/samples/mail/sample.html diff --git a/src/paperless_mail/tests/samples/sample.html.pdf b/src/paperless/tests/samples/mail/sample.html.pdf similarity index 100% rename from src/paperless_mail/tests/samples/sample.html.pdf rename to src/paperless/tests/samples/mail/sample.html.pdf diff --git a/src/paperless_mail/tests/samples/sample.html.pdf.webp b/src/paperless/tests/samples/mail/sample.html.pdf.webp similarity index 100% rename from src/paperless_mail/tests/samples/sample.html.pdf.webp rename to src/paperless/tests/samples/mail/sample.html.pdf.webp diff --git a/src/paperless_mail/tests/samples/sample.png b/src/paperless/tests/samples/mail/sample.png similarity index 100% rename from src/paperless_mail/tests/samples/sample.png rename to src/paperless/tests/samples/mail/sample.png diff --git a/src/paperless_mail/tests/samples/second.pdf b/src/paperless/tests/samples/mail/second.pdf similarity index 100% rename from src/paperless_mail/tests/samples/second.pdf rename to src/paperless/tests/samples/mail/second.pdf diff --git a/src/paperless_mail/tests/samples/simple_text.eml b/src/paperless/tests/samples/mail/simple_text.eml similarity index 100% rename from src/paperless_mail/tests/samples/simple_text.eml rename to src/paperless/tests/samples/mail/simple_text.eml diff --git a/src/paperless_mail/tests/samples/simple_text.eml.pdf b/src/paperless/tests/samples/mail/simple_text.eml.pdf similarity index 100% rename from src/paperless_mail/tests/samples/simple_text.eml.pdf rename to src/paperless/tests/samples/mail/simple_text.eml.pdf diff --git a/src/paperless_mail/tests/samples/simple_text.eml.pdf.webp b/src/paperless/tests/samples/mail/simple_text.eml.pdf.webp similarity index 100% rename from src/paperless_mail/tests/samples/simple_text.eml.pdf.webp rename to src/paperless/tests/samples/mail/simple_text.eml.pdf.webp diff --git a/src/paperless/tests/test_registry.py b/src/paperless/tests/test_registry.py index 80c686bc4..5c2d20d50 100644 --- a/src/paperless/tests/test_registry.py +++ b/src/paperless/tests/test_registry.py @@ -18,6 +18,7 @@ from unittest.mock import patch import pytest +from paperless.parsers import ParserContext from paperless.parsers import ParserProtocol from paperless.parsers.registry import ParserRegistry from paperless.parsers.registry import get_parser_registry @@ -103,6 +104,11 @@ def dummy_parser_cls() -> type: ) -> list: return [] + def configure(self, context: ParserContext) -> None: + """ + Required to exist, but doesn't need to do anything + """ + def __enter__(self) -> Self: return self @@ -144,6 +150,7 @@ class TestParserProtocol: @pytest.mark.parametrize( "missing_method", [ + pytest.param("configure", id="missing-configure"), pytest.param("parse", id="missing-parse"), pytest.param("get_text", id="missing-get_text"), pytest.param("get_thumbnail", id="missing-get_thumbnail"), diff --git a/src/paperless_mail/parsers.py b/src/paperless_mail/parsers.py deleted file mode 100644 index 86cba23ab..000000000 --- a/src/paperless_mail/parsers.py +++ /dev/null @@ -1,481 +0,0 @@ -import re -from html import escape -from pathlib import Path - -from bleach import clean -from bleach import linkify -from django.conf import settings -from django.utils import timezone -from django.utils.timezone import is_naive -from django.utils.timezone import make_aware -from gotenberg_client import GotenbergClient -from gotenberg_client.constants import A4 -from gotenberg_client.options import Measurement -from gotenberg_client.options import MeasurementUnitType -from gotenberg_client.options import PageMarginsType -from gotenberg_client.options import PdfAFormat -from humanize import naturalsize -from imap_tools import MailAttachment -from imap_tools import MailMessage -from tika_client import TikaClient - -from documents.parsers import DocumentParser -from documents.parsers import ParseError -from documents.parsers import make_thumbnail_from_pdf -from paperless.models import OutputTypeChoices -from paperless_mail.models import MailRule - - -class MailDocumentParser(DocumentParser): - """ - This parser uses imap_tools to parse .eml files, generates pdf using - Gotenberg and sends the html part to a Tika server for text extraction. - """ - - logging_name = "paperless.parsing.mail" - - def _settings_to_gotenberg_pdfa(self) -> PdfAFormat | None: - """ - Converts our requested PDF/A output into the Gotenberg API - format - """ - if settings.OCR_OUTPUT_TYPE in { - OutputTypeChoices.PDF_A, - OutputTypeChoices.PDF_A2, - }: - return PdfAFormat.A2b - elif settings.OCR_OUTPUT_TYPE == OutputTypeChoices.PDF_A1: # pragma: no cover - self.log.warning( - "Gotenberg does not support PDF/A-1a, choosing PDF/A-2b instead", - ) - return PdfAFormat.A2b - elif settings.OCR_OUTPUT_TYPE == OutputTypeChoices.PDF_A3: # pragma: no cover - return PdfAFormat.A3b - return None - - def get_thumbnail( - self, - document_path: Path, - mime_type: str, - file_name=None, - ) -> Path: - if not self.archive_path: - self.archive_path = self.generate_pdf( - self.parse_file_to_message(document_path), - ) - - return make_thumbnail_from_pdf( - self.archive_path, - self.tempdir, - self.logging_group, - ) - - def extract_metadata(self, document_path: Path, mime_type: str): - result = [] - - try: - mail = self.parse_file_to_message(document_path) - except ParseError as e: - self.log.warning( - f"Error while fetching document metadata for {document_path}: {e}", - ) - return result - - for key, value in mail.headers.items(): - value = ", ".join(i for i in value) - try: - value.encode("utf-8") - except UnicodeEncodeError as e: # pragma: no cover - self.log.debug(f"Skipping header {key}: {e}") - continue - - result.append( - { - "namespace": "", - "prefix": "header", - "key": key, - "value": value, - }, - ) - - result.append( - { - "namespace": "", - "prefix": "", - "key": "attachments", - "value": ", ".join( - f"{attachment.filename}" - f"({naturalsize(attachment.size, binary=True, format='%.2f')})" - for attachment in mail.attachments - ), - }, - ) - - result.append( - { - "namespace": "", - "prefix": "", - "key": "date", - "value": mail.date.strftime("%Y-%m-%d %H:%M:%S %Z"), - }, - ) - - result.sort(key=lambda item: (item["prefix"], item["key"])) - return result - - def parse( - self, - document_path: Path, - mime_type: str, - file_name=None, - mailrule_id: int | None = None, - ) -> None: - """ - Parses the given .eml into formatted text, based on the decoded email. - - """ - - def strip_text(text: str): - """ - Reduces the spacing of the given text string - """ - text = re.sub(r"\s+", " ", text) - text = re.sub(r"(\n *)+", "\n", text) - return text.strip() - - def build_formatted_text(mail_message: MailMessage) -> str: - """ - Constructs a formatted string, based on the given email. Basically tries - to get most of the email content, included front matter, into a nice string - """ - fmt_text = f"Subject: {mail_message.subject}\n\n" - fmt_text += f"From: {mail_message.from_values.full}\n\n" - to_list = [address.full for address in mail_message.to_values] - fmt_text += f"To: {', '.join(to_list)}\n\n" - if mail_message.cc_values: - fmt_text += ( - f"CC: {', '.join(address.full for address in mail.cc_values)}\n\n" - ) - if mail_message.bcc_values: - fmt_text += ( - f"BCC: {', '.join(address.full for address in mail.bcc_values)}\n\n" - ) - if mail_message.attachments: - att = [] - for a in mail.attachments: - attachment_size = naturalsize(a.size, binary=True, format="%.2f") - att.append( - f"{a.filename} ({attachment_size})", - ) - fmt_text += f"Attachments: {', '.join(att)}\n\n" - - if mail.html: - fmt_text += "HTML content: " + strip_text(self.tika_parse(mail.html)) - - fmt_text += f"\n\n{strip_text(mail.text)}" - - return fmt_text - - self.log.debug(f"Parsing file {document_path.name} into an email") - mail = self.parse_file_to_message(document_path) - - self.log.debug("Building formatted text from email") - self.text = build_formatted_text(mail) - - if is_naive(mail.date): - self.date = make_aware(mail.date) - else: - self.date = mail.date - - self.log.debug("Creating a PDF from the email") - if mailrule_id: - rule = MailRule.objects.get(pk=mailrule_id) - self.archive_path = self.generate_pdf(mail, rule.pdf_layout) - else: - self.archive_path = self.generate_pdf(mail) - - @staticmethod - def parse_file_to_message(filepath: Path) -> MailMessage: - """ - Parses the given .eml file into a MailMessage object - """ - try: - with filepath.open("rb") as eml: - parsed = MailMessage.from_bytes(eml.read()) - if parsed.from_values is None: - raise ParseError( - f"Could not parse {filepath}: Missing 'from'", - ) - except Exception as err: - raise ParseError( - f"Could not parse {filepath}: {err}", - ) from err - - return parsed - - def tika_parse(self, html: str): - self.log.info("Sending content to Tika server") - - try: - with TikaClient(tika_url=settings.TIKA_ENDPOINT) as client: - parsed = client.tika.as_text.from_buffer(html, "text/html") - - if parsed.content is not None: - return parsed.content.strip() - return "" - except Exception as err: - raise ParseError( - f"Could not parse content with tika server at " - f"{settings.TIKA_ENDPOINT}: {err}", - ) from err - - def generate_pdf( - self, - mail_message: MailMessage, - pdf_layout: MailRule.PdfLayout | None = None, - ) -> Path: - archive_path = Path(self.tempdir) / "merged.pdf" - - mail_pdf_file = self.generate_pdf_from_mail(mail_message) - - pdf_layout = ( - pdf_layout or settings.EMAIL_PARSE_DEFAULT_LAYOUT - ) # EMAIL_PARSE_DEFAULT_LAYOUT is a MailRule.PdfLayout - - # If no HTML content, create the PDF from the message - # Otherwise, create 2 PDFs and merge them with Gotenberg - if not mail_message.html: - archive_path.write_bytes(mail_pdf_file.read_bytes()) - else: - pdf_of_html_content = self.generate_pdf_from_html( - mail_message.html, - mail_message.attachments, - ) - - self.log.debug("Merging email text and HTML content into single PDF") - - with ( - GotenbergClient( - host=settings.TIKA_GOTENBERG_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client, - client.merge.merge() as route, - ): - # Configure requested PDF/A formatting, if any - pdf_a_format = self._settings_to_gotenberg_pdfa() - if pdf_a_format is not None: - route.pdf_format(pdf_a_format) - - match pdf_layout: - case MailRule.PdfLayout.HTML_TEXT: - route.merge([pdf_of_html_content, mail_pdf_file]) - case MailRule.PdfLayout.HTML_ONLY: - route.merge([pdf_of_html_content]) - case MailRule.PdfLayout.TEXT_ONLY: - route.merge([mail_pdf_file]) - case MailRule.PdfLayout.TEXT_HTML | _: - route.merge([mail_pdf_file, pdf_of_html_content]) - - try: - response = route.run() - archive_path.write_bytes(response.content) - except Exception as err: - raise ParseError( - f"Error while merging email HTML into PDF: {err}", - ) from err - - return archive_path - - def mail_to_html(self, mail: MailMessage) -> Path: - """ - Converts the given email into an HTML file, formatted - based on the given template - """ - - def clean_html(text: str) -> str: - """ - Attempts to clean, escape and linkify the given HTML string - """ - if isinstance(text, list): - text = "\n".join([str(e) for e in text]) - if not isinstance(text, str): - text = str(text) - text = escape(text) - text = clean(text) - text = linkify(text, parse_email=True) - text = text.replace("\n", "
") - return text - - data = {} - - data["subject"] = clean_html(mail.subject) - if data["subject"]: - data["subject_label"] = "Subject" - data["from"] = clean_html(mail.from_values.full) - if data["from"]: - data["from_label"] = "From" - data["to"] = clean_html(", ".join(address.full for address in mail.to_values)) - if data["to"]: - data["to_label"] = "To" - data["cc"] = clean_html(", ".join(address.full for address in mail.cc_values)) - if data["cc"]: - data["cc_label"] = "CC" - data["bcc"] = clean_html(", ".join(address.full for address in mail.bcc_values)) - if data["bcc"]: - data["bcc_label"] = "BCC" - - att = [] - for a in mail.attachments: - att.append( - f"{a.filename} ({naturalsize(a.size, binary=True, format='%.2f')})", - ) - data["attachments"] = clean_html(", ".join(att)) - if data["attachments"]: - data["attachments_label"] = "Attachments" - - data["date"] = clean_html( - timezone.localtime(mail.date).strftime("%Y-%m-%d %H:%M"), - ) - data["content"] = clean_html(mail.text.strip()) - - from django.template.loader import render_to_string - - html_file = Path(self.tempdir) / "email_as_html.html" - html_file.write_text(render_to_string("email_msg_template.html", context=data)) - - return html_file - - def generate_pdf_from_mail(self, mail: MailMessage) -> Path: - """ - Creates a PDF based on the given email, using the email's values in a - an HTML template - """ - self.log.info("Converting mail to PDF") - - css_file = Path(__file__).parent / "templates" / "output.css" - email_html_file = self.mail_to_html(mail) - - with ( - GotenbergClient( - host=settings.TIKA_GOTENBERG_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client, - client.chromium.html_to_pdf() as route, - ): - # Configure requested PDF/A formatting, if any - pdf_a_format = self._settings_to_gotenberg_pdfa() - if pdf_a_format is not None: - route.pdf_format(pdf_a_format) - - try: - response = ( - route.index(email_html_file) - .resource(css_file) - .margins( - PageMarginsType( - top=Measurement(0.1, MeasurementUnitType.Inches), - bottom=Measurement(0.1, MeasurementUnitType.Inches), - left=Measurement(0.1, MeasurementUnitType.Inches), - right=Measurement(0.1, MeasurementUnitType.Inches), - ), - ) - .size(A4) - .scale(1.0) - .run() - ) - except Exception as err: - raise ParseError( - f"Error while converting email to PDF: {err}", - ) from err - - email_as_pdf_file = Path(self.tempdir) / "email_as_pdf.pdf" - email_as_pdf_file.write_bytes(response.content) - - return email_as_pdf_file - - def generate_pdf_from_html( - self, - orig_html: str, - attachments: list[MailAttachment], - ) -> Path: - """ - Generates a PDF file based on the HTML and attachments of the email - """ - - def clean_html_script(text: str): - compiled_open = re.compile(re.escape(" None: - """ - This parser does not implement additional settings yet - """ - return None diff --git a/src/paperless_mail/signals.py b/src/paperless_mail/signals.py index 4a1d82df6..8fe046393 100644 --- a/src/paperless_mail/signals.py +++ b/src/paperless_mail/signals.py @@ -1,7 +1,12 @@ def get_parser(*args, **kwargs): - from paperless_mail.parsers import MailDocumentParser + from paperless.parsers.mail import MailDocumentParser - return MailDocumentParser(*args, **kwargs) + # MailDocumentParser accepts no constructor args in the new-style protocol. + # Pop legacy args that arrive from the signal-based consumer path. + # Phase 4 will replace this signal path with the ParserRegistry. + kwargs.pop("logging_group", None) + kwargs.pop("progress_callback", None) + return MailDocumentParser() def mail_consumer_declaration(sender, **kwargs): diff --git a/src/paperless_mail/tests/conftest.py b/src/paperless_mail/tests/conftest.py index 0742edfa3..b662d46f3 100644 --- a/src/paperless_mail/tests/conftest.py +++ b/src/paperless_mail/tests/conftest.py @@ -1,71 +1,9 @@ from collections.abc import Generator -from pathlib import Path import pytest from paperless_mail.mail import MailAccountHandler from paperless_mail.models import MailAccount -from paperless_mail.parsers import MailDocumentParser - - -@pytest.fixture(scope="session") -def sample_dir() -> Path: - return (Path(__file__).parent / Path("samples")).resolve() - - -@pytest.fixture(scope="session") -def broken_email_file(sample_dir: Path) -> Path: - return sample_dir / "broken.eml" - - -@pytest.fixture(scope="session") -def simple_txt_email_file(sample_dir: Path) -> Path: - return sample_dir / "simple_text.eml" - - -@pytest.fixture(scope="session") -def simple_txt_email_pdf_file(sample_dir: Path) -> Path: - return sample_dir / "simple_text.eml.pdf" - - -@pytest.fixture(scope="session") -def simple_txt_email_thumbnail_file(sample_dir: Path) -> Path: - return sample_dir / "simple_text.eml.pdf.webp" - - -@pytest.fixture(scope="session") -def html_email_file(sample_dir: Path) -> Path: - return sample_dir / "html.eml" - - -@pytest.fixture(scope="session") -def html_email_pdf_file(sample_dir: Path) -> Path: - return sample_dir / "html.eml.pdf" - - -@pytest.fixture(scope="session") -def html_email_thumbnail_file(sample_dir: Path) -> Path: - return sample_dir / "html.eml.pdf.webp" - - -@pytest.fixture(scope="session") -def html_email_html_file(sample_dir: Path) -> Path: - return sample_dir / "html.eml.html" - - -@pytest.fixture(scope="session") -def merged_pdf_first(sample_dir: Path) -> Path: - return sample_dir / "first.pdf" - - -@pytest.fixture(scope="session") -def merged_pdf_second(sample_dir: Path) -> Path: - return sample_dir / "second.pdf" - - -@pytest.fixture() -def mail_parser() -> MailDocumentParser: - return MailDocumentParser(logging_group=None) @pytest.fixture() @@ -89,11 +27,3 @@ def greenmail_mail_account(db: None) -> Generator[MailAccount, None, None]: @pytest.fixture() def mail_account_handler() -> MailAccountHandler: return MailAccountHandler() - - -@pytest.fixture(scope="session") -def nginx_base_url() -> Generator[str, None, None]: - """ - The base URL for the nginx HTTP server we expect to be alive - """ - yield "http://localhost:8080" From a9756f94626a8b770aa9622553c262a2fd047919 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Fri, 20 Mar 2026 12:46:07 -0700 Subject: [PATCH 052/113] Chore: Convert Tesseract parser to plugin style (#12403) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Move tesseract parser, tests, and samples to paperless.parsers Relocates files in preparation for the Phase 3 Protocol-based parser refactor, preserving full git history via rename. - src/paperless_tesseract/parsers.py -> src/paperless/parsers/tesseract.py - src/paperless_tesseract/tests/test_parser.py -> src/paperless/tests/parsers/test_tesseract_parser.py - src/paperless_tesseract/tests/test_parser_custom_settings.py -> src/paperless/tests/parsers/test_tesseract_custom_settings.py - src/paperless_tesseract/tests/samples/* -> src/paperless/tests/samples/tesseract/ - Moves RUF001 suppression from broad per-file pyproject.toml ignore to inline noqa comments on the two affected lines Co-Authored-By: Claude Sonnet 4.6 * Refactor RasterisedDocumentParser to ParserProtocol interface - Add RasterisedDocumentParser to registry.register_defaults() - Update parser class: remove DocumentParser inheritance, add Protocol class attrs/classmethods/properties, context-manager lifecycle - Add read_file_handle_unicode_errors() to shared parsers/utils.py - Replace inline unicode-error-handling with shared utility call Co-Authored-By: Claude Sonnet 4.6 * Update tesseract signals.py to import from new parser location RasterisedDocumentParser moved to paperless.parsers.tesseract; update the lazy import in signals.get_parser so the signal-based consumer declaration continues to work during the registry transition. Pop logging_group and progress_callback kwargs for constructor compatibility. Co-Authored-By: Claude Sonnet 4.6 * tests: rewrite test_tesseract_parser to pytest style with typed fixtures - Converts all tests from Django TestCase to pytest-style classes - Adds tesseract_samples_dir, null_app_config, tesseract_parser, and make_tesseract_parser fixtures in conftest.py; all DB-free except TestOcrmypdfParameters which uses @pytest.mark.django_db - Defines MakeTesseractParser type alias in conftest.py for autocomplete - Fixes FBT001 (boolean positional args) by making bool params keyword-only with * separator in parametrize test signatures - Adds type annotations to all fixture parameters for IDE support - Uses pytest.param(..., id="...") throughout; pytest-mock for patching Co-Authored-By: Claude Sonnet 4.6 * fix(types): fully annotate paperless/parsers/tesseract.py Fixes all mypy and pyrefly errors in the new parser file: - Add missing type annotations to is_image, has_alpha, get_dpi, calculate_a4_dpi, construct_ocrmypdf_parameters, post_process_text - Narrow Path-only (no str) for image helper args; convert to str when building list[str] args for run_subprocess - Annotate ocrmypdf_args as dict[str, Any] so operator expressions on its values type-check and ocrmypdf.ocr(**args) resolves cleanly - Declare text: str | None = None at top of extract_text to unify all assignments to the same type across both branches - Import Any from typing Co-Authored-By: Claude Sonnet 4.6 * Fixes isort * fix: add RasterisedDocumentParser to new-style parser shim checks The new RasterisedDocumentParser uses __enter__/__exit__ for resource management instead of cleanup(). Update all existing new-style shims to include it in the isinstance checks: - documents/consumer.py: _parser_cleanup(), parser_is_new_style - documents/tasks.py: parser_is_new_style, finally cleanup branch (also adds RemoteDocumentParser which was missing from the latter) - documents/management/commands/document_thumbnails.py: adds new-style handling from scratch (enter/exit + 2-arg get_thumbnail signature) Fix stale import paths in three test files that were still importing from paperless_tesseract.parsers instead of paperless.parsers.tesseract. Fix two registry tests that used application/pdf as a proxy for "no handler" — now that RasterisedDocumentParser is registered, PDF always has a handler, so switch to a truly unsupported MIME type. Signal infrastructure and shims remain intact; this is plumbing only. Co-Authored-By: Claude Sonnet 4.6 * One missed import (cherry pick?) * Adds a no cover for a special case of handling unicode errors in PDF metadata --------- Co-authored-by: Claude Sonnet 4.6 --- pyproject.toml | 4 +- src/documents/consumer.py | 3 + .../commands/document_thumbnails.py | 39 +- src/documents/tasks.py | 10 +- src/documents/tests/test_parsers.py | 2 +- src/paperless/parsers/registry.py | 2 + .../parsers/tesseract.py} | 236 ++-- src/paperless/parsers/utils.py | 30 +- src/paperless/tests/parsers/conftest.py | 387 ++++++ .../tests/parsers/test_remote_parser.py | 11 +- .../test_tesseract_custom_settings.py} | 2 +- .../tests/parsers/test_tesseract_parser.py | 1174 +++++++++++++++++ .../tests/parsers/test_text_parser.py | 5 +- .../tests/samples/tesseract}/document.webp | Bin .../tests/samples/tesseract}/encrypted.pdf | Bin .../samples/tesseract}/multi-page-digital.pdf | Bin .../multi-page-images-alpha-rgb.tiff | Bin .../tesseract}/multi-page-images-alpha.tiff | Bin .../samples/tesseract}/multi-page-images.pdf | Bin .../samples/tesseract}/multi-page-images.tiff | Bin .../samples/tesseract}/multi-page-mixed.pdf | Bin .../samples/tesseract}/no-text-alpha.png | Bin .../tests/samples/tesseract}/rotated.pdf | Bin .../tests/samples/tesseract}/rtl-test.pdf | Bin .../tests/samples/tesseract}/signed.pdf | Bin .../tests/samples/tesseract}/simple-alpha.png | Bin .../samples/tesseract}/simple-digital.pdf | Bin .../samples/tesseract}/simple-no-dpi.png | Bin .../tests/samples/tesseract}/simple.bmp | Bin .../tests/samples/tesseract}/simple.gif | Bin .../tests/samples/tesseract}/simple.heic | Bin .../tests/samples/tesseract}/simple.jpg | Bin .../tests/samples/tesseract}/simple.png | Bin .../tests/samples/tesseract}/simple.tif | Bin .../samples/tesseract}/single-page-mixed.pdf | Bin .../tests/samples/tesseract}/with-form.pdf | Bin src/paperless_tesseract/signals.py | 19 +- src/paperless_tesseract/tests/test_parser.py | 924 ------------- 38 files changed, 1824 insertions(+), 1024 deletions(-) rename src/{paperless_tesseract/parsers.py => paperless/parsers/tesseract.py} (72%) rename src/{paperless_tesseract/tests/test_parser_custom_settings.py => paperless/tests/parsers/test_tesseract_custom_settings.py} (99%) create mode 100644 src/paperless/tests/parsers/test_tesseract_parser.py rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/document.webp (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/encrypted.pdf (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/multi-page-digital.pdf (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/multi-page-images-alpha-rgb.tiff (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/multi-page-images-alpha.tiff (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/multi-page-images.pdf (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/multi-page-images.tiff (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/multi-page-mixed.pdf (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/no-text-alpha.png (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/rotated.pdf (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/rtl-test.pdf (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/signed.pdf (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/simple-alpha.png (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/simple-digital.pdf (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/simple-no-dpi.png (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/simple.bmp (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/simple.gif (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/simple.heic (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/simple.jpg (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/simple.png (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/simple.tif (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/single-page-mixed.pdf (100%) rename src/{paperless_tesseract/tests/samples => paperless/tests/samples/tesseract}/with-form.pdf (100%) delete mode 100644 src/paperless_tesseract/tests/test_parser.py diff --git a/pyproject.toml b/pyproject.toml index d41a918c0..6bbdf0f48 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -248,9 +248,7 @@ lint.per-file-ignores."docker/wait-for-redis.py" = [ lint.per-file-ignores."src/documents/models.py" = [ "SIM115", ] -lint.per-file-ignores."src/paperless_tesseract/tests/test_parser.py" = [ - "RUF001", -] + lint.isort.force-single-line = true [tool.codespell] diff --git a/src/documents/consumer.py b/src/documents/consumer.py index ba2bba473..81d9eb456 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -54,6 +54,7 @@ from documents.utils import run_subprocess from paperless.parsers import ParserContext from paperless.parsers.mail import MailDocumentParser from paperless.parsers.remote import RemoteDocumentParser +from paperless.parsers.tesseract import RasterisedDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser @@ -74,6 +75,7 @@ def _parser_cleanup(parser: DocumentParser) -> None: parser, ( MailDocumentParser, + RasterisedDocumentParser, RemoteDocumentParser, TextDocumentParser, TikaDocumentParser, @@ -463,6 +465,7 @@ class ConsumerPlugin( document_parser, ( MailDocumentParser, + RasterisedDocumentParser, RemoteDocumentParser, TextDocumentParser, TikaDocumentParser, diff --git a/src/documents/management/commands/document_thumbnails.py b/src/documents/management/commands/document_thumbnails.py index e4ae88766..1756f8754 100644 --- a/src/documents/management/commands/document_thumbnails.py +++ b/src/documents/management/commands/document_thumbnails.py @@ -4,6 +4,11 @@ import shutil from documents.management.commands.base import PaperlessCommand from documents.models import Document from documents.parsers import get_parser_class_for_mime_type +from paperless.parsers.mail import MailDocumentParser +from paperless.parsers.remote import RemoteDocumentParser +from paperless.parsers.tesseract import RasterisedDocumentParser +from paperless.parsers.text import TextDocumentParser +from paperless.parsers.tika import TikaDocumentParser logger = logging.getLogger("paperless.management.thumbnails") @@ -22,16 +27,38 @@ def _process_document(doc_id: int) -> None: parser = parser_class(logging_group=None) + parser_is_new_style = isinstance( + parser, + ( + MailDocumentParser, + RasterisedDocumentParser, + RemoteDocumentParser, + TextDocumentParser, + TikaDocumentParser, + ), + ) + + # TODO(stumpylog): Remove branch in the future when all parsers use new protocol + if parser_is_new_style: + parser.__enter__() + try: - thumb = parser.get_thumbnail( - document.source_path, - document.mime_type, - document.get_public_filename(), - ) + # TODO(stumpylog): Remove branch in the future when all parsers use new protocol + if parser_is_new_style: + thumb = parser.get_thumbnail(document.source_path, document.mime_type) + else: + thumb = parser.get_thumbnail( + document.source_path, + document.mime_type, + document.get_public_filename(), + ) shutil.move(thumb, document.thumbnail_path) finally: # TODO(stumpylog): Cleanup once all parsers are handled - parser.cleanup() + if parser_is_new_style: + parser.__exit__(None, None, None) + else: + parser.cleanup() class Command(PaperlessCommand): diff --git a/src/documents/tasks.py b/src/documents/tasks.py index 947da878f..a8ca0cc5f 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -68,6 +68,7 @@ from paperless.config import AIConfig from paperless.parsers import ParserContext from paperless.parsers.mail import MailDocumentParser from paperless.parsers.remote import RemoteDocumentParser +from paperless.parsers.tesseract import RasterisedDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser from paperless_ai.indexing import llm_index_add_or_update_document @@ -326,6 +327,7 @@ def update_document_content_maybe_archive_file(document_id) -> None: parser, ( MailDocumentParser, + RasterisedDocumentParser, RemoteDocumentParser, TextDocumentParser, TikaDocumentParser, @@ -440,7 +442,13 @@ def update_document_content_maybe_archive_file(document_id) -> None: # TODO(stumpylog): Remove branch in the future when all parsers use new protocol if isinstance( parser, - (MailDocumentParser, TextDocumentParser, TikaDocumentParser), + ( + MailDocumentParser, + RasterisedDocumentParser, + RemoteDocumentParser, + TextDocumentParser, + TikaDocumentParser, + ), ): parser.__exit__(None, None, None) else: diff --git a/src/documents/tests/test_parsers.py b/src/documents/tests/test_parsers.py index 7be6ad20d..5ea1b361e 100644 --- a/src/documents/tests/test_parsers.py +++ b/src/documents/tests/test_parsers.py @@ -9,9 +9,9 @@ from documents.parsers import get_default_file_extension from documents.parsers import get_parser_class_for_mime_type from documents.parsers import get_supported_file_extensions from documents.parsers import is_file_ext_supported +from paperless.parsers.tesseract import RasterisedDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser -from paperless_tesseract.parsers import RasterisedDocumentParser class TestParserDiscovery(TestCase): diff --git a/src/paperless/parsers/registry.py b/src/paperless/parsers/registry.py index dc227ce7a..7effe554f 100644 --- a/src/paperless/parsers/registry.py +++ b/src/paperless/parsers/registry.py @@ -195,6 +195,7 @@ class ParserRegistry: """ from paperless.parsers.mail import MailDocumentParser from paperless.parsers.remote import RemoteDocumentParser + from paperless.parsers.tesseract import RasterisedDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser @@ -202,6 +203,7 @@ class ParserRegistry: self.register_builtin(RemoteDocumentParser) self.register_builtin(TikaDocumentParser) self.register_builtin(MailDocumentParser) + self.register_builtin(RasterisedDocumentParser) # ------------------------------------------------------------------ # Discovery diff --git a/src/paperless_tesseract/parsers.py b/src/paperless/parsers/tesseract.py similarity index 72% rename from src/paperless_tesseract/parsers.py rename to src/paperless/parsers/tesseract.py index 73532caa0..99cff36aa 100644 --- a/src/paperless_tesseract/parsers.py +++ b/src/paperless/parsers/tesseract.py @@ -1,13 +1,18 @@ +from __future__ import annotations + +import logging import os import re +import shutil import tempfile from pathlib import Path from typing import TYPE_CHECKING +from typing import Any +from typing import Self from django.conf import settings from PIL import Image -from documents.parsers import DocumentParser from documents.parsers import ParseError from documents.parsers import make_thumbnail_from_pdf from documents.utils import maybe_override_pixel_limit @@ -16,6 +21,28 @@ from paperless.config import OcrConfig from paperless.models import ArchiveFileChoices from paperless.models import CleanChoices from paperless.models import ModeChoices +from paperless.parsers.utils import read_file_handle_unicode_errors +from paperless.version import __full_version_str__ + +if TYPE_CHECKING: + import datetime + from types import TracebackType + + from paperless.parsers import MetadataEntry + from paperless.parsers import ParserContext + +logger = logging.getLogger("paperless.parsing.tesseract") + +_SUPPORTED_MIME_TYPES: dict[str, str] = { + "application/pdf": ".pdf", + "image/jpeg": ".jpg", + "image/png": ".png", + "image/tiff": ".tif", + "image/gif": ".gif", + "image/bmp": ".bmp", + "image/webp": ".webp", + "image/heic": ".heic", +} class NoTextFoundException(Exception): @@ -26,81 +53,125 @@ class RtlLanguageException(Exception): pass -class RasterisedDocumentParser(DocumentParser): +class RasterisedDocumentParser: """ This parser uses Tesseract to try and get some text out of a rasterised image, whether it's a PDF, or other graphical format (JPEG, TIFF, etc.) """ - logging_name = "paperless.parsing.tesseract" + name: str = "Paperless-ngx Tesseract OCR Parser" + version: str = __full_version_str__ + author: str = "Paperless-ngx Contributors" + url: str = "https://github.com/paperless-ngx/paperless-ngx" - def get_settings(self) -> OcrConfig: - """ - This parser uses the OCR configuration settings to parse documents - """ - return OcrConfig() + # ------------------------------------------------------------------ + # Class methods + # ------------------------------------------------------------------ - def get_page_count(self, document_path, mime_type): - page_count = None - if mime_type == "application/pdf": - try: - import pikepdf + @classmethod + def supported_mime_types(cls) -> dict[str, str]: + return _SUPPORTED_MIME_TYPES - with pikepdf.Pdf.open(document_path) as pdf: - page_count = len(pdf.pages) - except Exception as e: - self.log.warning( - f"Unable to determine PDF page count {document_path}: {e}", - ) - return page_count + @classmethod + def score( + cls, + mime_type: str, + filename: str, + path: Path | None = None, + ) -> int | None: + if mime_type in _SUPPORTED_MIME_TYPES: + return 10 + return None - def extract_metadata(self, document_path, mime_type): - result = [] - if mime_type == "application/pdf": - import pikepdf + # ------------------------------------------------------------------ + # Properties + # ------------------------------------------------------------------ - namespace_pattern = re.compile(r"\{(.*)\}(.*)") + @property + def can_produce_archive(self) -> bool: + return True - pdf = pikepdf.open(document_path) - meta = pdf.open_metadata() - for key, value in meta.items(): - if isinstance(value, list): - value = " ".join([str(e) for e in value]) - value = str(value) - try: - m = namespace_pattern.match(key) - if m is None: # pragma: no cover - continue - namespace = m.group(1) - key_value = m.group(2) - try: - namespace.encode("utf-8") - key_value.encode("utf-8") - except UnicodeEncodeError as e: # pragma: no cover - self.log.debug(f"Skipping metadata key {key}: {e}") - continue - result.append( - { - "namespace": namespace, - "prefix": meta.REVERSE_NS[namespace], - "key": key_value, - "value": value, - }, - ) - except Exception as e: - self.log.warning( - f"Error while reading metadata {key}: {value}. Error: {e}", - ) - return result + @property + def requires_pdf_rendition(self) -> bool: + return False - def get_thumbnail(self, document_path, mime_type, file_name=None): + # ------------------------------------------------------------------ + # Lifecycle + # ------------------------------------------------------------------ + + def __init__(self, logging_group: object = None) -> None: + settings.SCRATCH_DIR.mkdir(parents=True, exist_ok=True) + self.tempdir = Path( + tempfile.mkdtemp(prefix="paperless-", dir=settings.SCRATCH_DIR), + ) + self.settings = OcrConfig() + self.archive_path: Path | None = None + self.text: str | None = None + self.date: datetime.datetime | None = None + self.log = logger + + def __enter__(self) -> Self: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + logger.debug("Cleaning up temporary directory %s", self.tempdir) + shutil.rmtree(self.tempdir, ignore_errors=True) + + # ------------------------------------------------------------------ + # Core parsing interface + # ------------------------------------------------------------------ + + def configure(self, context: ParserContext) -> None: + pass + + # ------------------------------------------------------------------ + # Result accessors + # ------------------------------------------------------------------ + + def get_text(self) -> str | None: + return self.text + + def get_date(self) -> datetime.datetime | None: + return self.date + + def get_archive_path(self) -> Path | None: + return self.archive_path + + # ------------------------------------------------------------------ + # Thumbnail, page count, and metadata + # ------------------------------------------------------------------ + + def get_thumbnail(self, document_path: Path, mime_type: str) -> Path: return make_thumbnail_from_pdf( - self.archive_path or document_path, + self.archive_path or Path(document_path), self.tempdir, - self.logging_group, ) - def is_image(self, mime_type) -> bool: + def get_page_count(self, document_path: Path, mime_type: str) -> int | None: + if mime_type == "application/pdf": + from paperless.parsers.utils import get_page_count_for_pdf + + return get_page_count_for_pdf(Path(document_path), log=self.log) + return None + + def extract_metadata( + self, + document_path: Path, + mime_type: str, + ) -> list[MetadataEntry]: + if mime_type != "application/pdf": + return [] + + from paperless.parsers.utils import extract_pdf_metadata + + return extract_pdf_metadata(Path(document_path), log=self.log) + + def is_image(self, mime_type: str) -> bool: return mime_type in [ "image/png", "image/jpeg", @@ -111,25 +182,25 @@ class RasterisedDocumentParser(DocumentParser): "image/heic", ] - def has_alpha(self, image) -> bool: + def has_alpha(self, image: Path) -> bool: with Image.open(image) as im: return im.mode in ("RGBA", "LA") - def remove_alpha(self, image_path: str) -> Path: + def remove_alpha(self, image_path: Path) -> Path: no_alpha_image = Path(self.tempdir) / "image-no-alpha" run_subprocess( [ settings.CONVERT_BINARY, "-alpha", "off", - image_path, - no_alpha_image, + str(image_path), + str(no_alpha_image), ], logger=self.log, ) return no_alpha_image - def get_dpi(self, image) -> int | None: + def get_dpi(self, image: Path) -> int | None: try: with Image.open(image) as im: x, _ = im.info["dpi"] @@ -138,7 +209,7 @@ class RasterisedDocumentParser(DocumentParser): self.log.warning(f"Error while getting DPI from image {image}: {e}") return None - def calculate_a4_dpi(self, image) -> int | None: + def calculate_a4_dpi(self, image: Path) -> int | None: try: with Image.open(image) as im: width, _ = im.size @@ -156,6 +227,7 @@ class RasterisedDocumentParser(DocumentParser): sidecar_file: Path | None, pdf_file: Path, ) -> str | None: + text: str | None = None # When re-doing OCR, the sidecar contains ONLY the new text, not # the whole text, so do not utilize it in that case if ( @@ -163,7 +235,7 @@ class RasterisedDocumentParser(DocumentParser): and sidecar_file.is_file() and self.settings.mode != "redo" ): - text = self.read_file_handle_unicode_errors(sidecar_file) + text = read_file_handle_unicode_errors(sidecar_file) if "[OCR skipped on page" not in text: # This happens when there's already text in the input file. @@ -191,12 +263,12 @@ class RasterisedDocumentParser(DocumentParser): "-layout", "-enc", "UTF-8", - pdf_file, + str(pdf_file), tmp.name, ], logger=self.log, ) - text = self.read_file_handle_unicode_errors(Path(tmp.name)) + text = read_file_handle_unicode_errors(Path(tmp.name)) return post_process_text(text) @@ -211,16 +283,14 @@ class RasterisedDocumentParser(DocumentParser): def construct_ocrmypdf_parameters( self, - input_file, - mime_type, - output_file, - sidecar_file, + input_file: Path, + mime_type: str, + output_file: Path, + sidecar_file: Path, *, - safe_fallback=False, - ): - if TYPE_CHECKING: - assert isinstance(self.settings, OcrConfig) - ocrmypdf_args = { + safe_fallback: bool = False, + ) -> dict[str, Any]: + ocrmypdf_args: dict[str, Any] = { "input_file_or_options": input_file, "output_file": output_file, # need to use threads, since this will be run in daemonized @@ -330,7 +400,13 @@ class RasterisedDocumentParser(DocumentParser): return ocrmypdf_args - def parse(self, document_path: Path, mime_type, file_name=None) -> None: + def parse( + self, + document_path: Path, + mime_type: str, + *, + produce_archive: bool = True, + ) -> None: # This forces tesseract to use one core per page. os.environ["OMP_THREAD_LIMIT"] = "1" VALID_TEXT_LENGTH = 50 @@ -458,7 +534,7 @@ class RasterisedDocumentParser(DocumentParser): self.text = "" -def post_process_text(text): +def post_process_text(text: str | None) -> str | None: if not text: return None diff --git a/src/paperless/parsers/utils.py b/src/paperless/parsers/utils.py index b72f31a28..2e6ce7061 100644 --- a/src/paperless/parsers/utils.py +++ b/src/paperless/parsers/utils.py @@ -20,6 +20,34 @@ if TYPE_CHECKING: logger = logging.getLogger("paperless.parsers.utils") +def read_file_handle_unicode_errors( + filepath: Path, + log: logging.Logger | None = None, +) -> str: + """Read a file as UTF-8 text, replacing invalid bytes rather than raising. + + Parameters + ---------- + filepath: + Absolute path to the file to read. + log: + Logger to use for warnings. Falls back to the module-level logger + when omitted. + + Returns + ------- + str + File content as a string, with any invalid UTF-8 sequences replaced + by the Unicode replacement character. + """ + _log = log or logger + try: + return filepath.read_text(encoding="utf-8") + except UnicodeDecodeError as e: + _log.warning("Unicode error during text reading, continuing: %s", e) + return filepath.read_bytes().decode("utf-8", errors="replace") + + def get_page_count_for_pdf( document_path: Path, log: logging.Logger | None = None, @@ -107,7 +135,7 @@ def extract_pdf_metadata( try: namespace.encode("utf-8") key_value.encode("utf-8") - except UnicodeEncodeError as enc_err: + except UnicodeEncodeError as enc_err: # pragma: no cover _log.debug("Skipping metadata key %s: %s", key, enc_err) continue diff --git a/src/paperless/tests/parsers/conftest.py b/src/paperless/tests/parsers/conftest.py index 5a22f24ab..a484f02c8 100644 --- a/src/paperless/tests/parsers/conftest.py +++ b/src/paperless/tests/parsers/conftest.py @@ -6,20 +6,29 @@ so it is easy to see which files belong to which test module. from __future__ import annotations +from contextlib import contextmanager from typing import TYPE_CHECKING import pytest +from django.test import override_settings from paperless.parsers.mail import MailDocumentParser from paperless.parsers.remote import RemoteDocumentParser +from paperless.parsers.tesseract import RasterisedDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser if TYPE_CHECKING: + from collections.abc import Callable from collections.abc import Generator from pathlib import Path + from unittest.mock import MagicMock from pytest_django.fixtures import SettingsWrapper + from pytest_mock import MockerFixture + + #: Type for the ``make_tesseract_parser`` fixture factory. + MakeTesseractParser = Callable[..., Generator[RasterisedDocumentParser, None, None]] # ------------------------------------------------------------------ @@ -411,3 +420,381 @@ def nginx_base_url() -> Generator[str, None, None]: The base URL for the nginx HTTP server we expect to be alive """ yield "http://localhost:8080" + + +# ------------------------------------------------------------------ +# Tesseract parser sample files +# ------------------------------------------------------------------ + + +@pytest.fixture(scope="session") +def tesseract_samples_dir(samples_dir: Path) -> Path: + """Absolute path to the tesseract parser sample files directory. + + Returns + ------- + Path + ``/tesseract/`` + """ + return samples_dir / "tesseract" + + +@pytest.fixture(scope="session") +def document_webp_file(tesseract_samples_dir: Path) -> Path: + """Path to a WebP document sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/document.webp``. + """ + return tesseract_samples_dir / "document.webp" + + +@pytest.fixture(scope="session") +def encrypted_pdf_file(tesseract_samples_dir: Path) -> Path: + """Path to an encrypted PDF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/encrypted.pdf``. + """ + return tesseract_samples_dir / "encrypted.pdf" + + +@pytest.fixture(scope="session") +def multi_page_digital_pdf_file(tesseract_samples_dir: Path) -> Path: + """Path to a multi-page digital PDF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/multi-page-digital.pdf``. + """ + return tesseract_samples_dir / "multi-page-digital.pdf" + + +@pytest.fixture(scope="session") +def multi_page_images_alpha_rgb_tiff_file(tesseract_samples_dir: Path) -> Path: + """Path to a multi-page TIFF with alpha channel in RGB. + + Returns + ------- + Path + Absolute path to ``tesseract/multi-page-images-alpha-rgb.tiff``. + """ + return tesseract_samples_dir / "multi-page-images-alpha-rgb.tiff" + + +@pytest.fixture(scope="session") +def multi_page_images_alpha_tiff_file(tesseract_samples_dir: Path) -> Path: + """Path to a multi-page TIFF with alpha channel. + + Returns + ------- + Path + Absolute path to ``tesseract/multi-page-images-alpha.tiff``. + """ + return tesseract_samples_dir / "multi-page-images-alpha.tiff" + + +@pytest.fixture(scope="session") +def multi_page_images_pdf_file(tesseract_samples_dir: Path) -> Path: + """Path to a multi-page PDF with images. + + Returns + ------- + Path + Absolute path to ``tesseract/multi-page-images.pdf``. + """ + return tesseract_samples_dir / "multi-page-images.pdf" + + +@pytest.fixture(scope="session") +def multi_page_images_tiff_file(tesseract_samples_dir: Path) -> Path: + """Path to a multi-page TIFF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/multi-page-images.tiff``. + """ + return tesseract_samples_dir / "multi-page-images.tiff" + + +@pytest.fixture(scope="session") +def multi_page_mixed_pdf_file(tesseract_samples_dir: Path) -> Path: + """Path to a multi-page mixed PDF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/multi-page-mixed.pdf``. + """ + return tesseract_samples_dir / "multi-page-mixed.pdf" + + +@pytest.fixture(scope="session") +def no_text_alpha_png_file(tesseract_samples_dir: Path) -> Path: + """Path to a PNG with alpha channel and no text. + + Returns + ------- + Path + Absolute path to ``tesseract/no-text-alpha.png``. + """ + return tesseract_samples_dir / "no-text-alpha.png" + + +@pytest.fixture(scope="session") +def rotated_pdf_file(tesseract_samples_dir: Path) -> Path: + """Path to a rotated PDF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/rotated.pdf``. + """ + return tesseract_samples_dir / "rotated.pdf" + + +@pytest.fixture(scope="session") +def rtl_test_pdf_file(tesseract_samples_dir: Path) -> Path: + """Path to an RTL test PDF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/rtl-test.pdf``. + """ + return tesseract_samples_dir / "rtl-test.pdf" + + +@pytest.fixture(scope="session") +def signed_pdf_file(tesseract_samples_dir: Path) -> Path: + """Path to a signed PDF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/signed.pdf``. + """ + return tesseract_samples_dir / "signed.pdf" + + +@pytest.fixture(scope="session") +def simple_alpha_png_file(tesseract_samples_dir: Path) -> Path: + """Path to a simple PNG with alpha channel. + + Returns + ------- + Path + Absolute path to ``tesseract/simple-alpha.png``. + """ + return tesseract_samples_dir / "simple-alpha.png" + + +@pytest.fixture(scope="session") +def simple_digital_pdf_file(tesseract_samples_dir: Path) -> Path: + """Path to a simple digital PDF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/simple-digital.pdf``. + """ + return tesseract_samples_dir / "simple-digital.pdf" + + +@pytest.fixture(scope="session") +def simple_no_dpi_png_file(tesseract_samples_dir: Path) -> Path: + """Path to a simple PNG without DPI information. + + Returns + ------- + Path + Absolute path to ``tesseract/simple-no-dpi.png``. + """ + return tesseract_samples_dir / "simple-no-dpi.png" + + +@pytest.fixture(scope="session") +def simple_bmp_file(tesseract_samples_dir: Path) -> Path: + """Path to a simple BMP sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/simple.bmp``. + """ + return tesseract_samples_dir / "simple.bmp" + + +@pytest.fixture(scope="session") +def simple_gif_file(tesseract_samples_dir: Path) -> Path: + """Path to a simple GIF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/simple.gif``. + """ + return tesseract_samples_dir / "simple.gif" + + +@pytest.fixture(scope="session") +def simple_heic_file(tesseract_samples_dir: Path) -> Path: + """Path to a simple HEIC sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/simple.heic``. + """ + return tesseract_samples_dir / "simple.heic" + + +@pytest.fixture(scope="session") +def simple_jpg_file(tesseract_samples_dir: Path) -> Path: + """Path to a simple JPG sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/simple.jpg``. + """ + return tesseract_samples_dir / "simple.jpg" + + +@pytest.fixture(scope="session") +def simple_png_file(tesseract_samples_dir: Path) -> Path: + """Path to a simple PNG sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/simple.png``. + """ + return tesseract_samples_dir / "simple.png" + + +@pytest.fixture(scope="session") +def simple_tif_file(tesseract_samples_dir: Path) -> Path: + """Path to a simple TIF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/simple.tif``. + """ + return tesseract_samples_dir / "simple.tif" + + +@pytest.fixture(scope="session") +def single_page_mixed_pdf_file(tesseract_samples_dir: Path) -> Path: + """Path to a single-page mixed PDF sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/single-page-mixed.pdf``. + """ + return tesseract_samples_dir / "single-page-mixed.pdf" + + +@pytest.fixture(scope="session") +def with_form_pdf_file(tesseract_samples_dir: Path) -> Path: + """Path to a PDF with form sample file. + + Returns + ------- + Path + Absolute path to ``tesseract/with-form.pdf``. + """ + return tesseract_samples_dir / "with-form.pdf" + + +# ------------------------------------------------------------------ +# Tesseract parser instance and settings helpers +# ------------------------------------------------------------------ + + +@pytest.fixture() +def null_app_config(mocker: MockerFixture) -> MagicMock: + """Return a MagicMock with all OcrConfig fields set to None. + + This allows the parser to fall back to Django settings instead of + hitting the database. + + Returns + ------- + MagicMock + Mock config with all fields as None + """ + return mocker.MagicMock( + output_type=None, + pages=None, + language=None, + mode=None, + skip_archive_file=None, + image_dpi=None, + unpaper_clean=None, + deskew=None, + rotate_pages=None, + rotate_pages_threshold=None, + max_image_pixels=None, + color_conversion_strategy=None, + user_args=None, + ) + + +@pytest.fixture() +def tesseract_parser( + mocker: MockerFixture, + null_app_config: MagicMock, +) -> Generator[RasterisedDocumentParser, None, None]: + """Yield a RasterisedDocumentParser and clean up its temporary directory afterwards. + + Patches the config system to avoid database access. + + Yields + ------ + RasterisedDocumentParser + A ready-to-use parser instance. + """ + mocker.patch( + "paperless.config.BaseConfig._get_config_instance", + return_value=null_app_config, + ) + with RasterisedDocumentParser() as parser: + yield parser + + +@pytest.fixture() +def make_tesseract_parser( + mocker: MockerFixture, + null_app_config: MagicMock, +) -> MakeTesseractParser: + """Return a factory for creating RasterisedDocumentParser with Django settings overrides. + + This fixture is useful for tests that need to create parsers with different + settings configurations. + + Returns + ------- + Callable[..., contextmanager[RasterisedDocumentParser]] + A context manager factory that accepts Django settings overrides + """ + mocker.patch( + "paperless.config.BaseConfig._get_config_instance", + return_value=null_app_config, + ) + + @contextmanager + def _make_parser(**django_settings_overrides): + with override_settings(**django_settings_overrides): + with RasterisedDocumentParser() as parser: + yield parser + + return _make_parser diff --git a/src/paperless/tests/parsers/test_remote_parser.py b/src/paperless/tests/parsers/test_remote_parser.py index d0b9effba..69199a6e8 100644 --- a/src/paperless/tests/parsers/test_remote_parser.py +++ b/src/paperless/tests/parsers/test_remote_parser.py @@ -481,12 +481,17 @@ class TestRemoteParserRegistry: assert parser_cls is RemoteDocumentParser @pytest.mark.usefixtures("no_engine_settings") - def test_get_parser_returns_none_for_pdf_when_not_configured(self) -> None: - """With no tesseract parser registered yet, PDF has no handler if remote is off.""" + def test_get_parser_returns_none_for_unsupported_type_when_not_configured( + self, + ) -> None: + """With remote off and a truly unsupported MIME type, registry returns None.""" from paperless.parsers.registry import ParserRegistry registry = ParserRegistry() registry.register_defaults() - parser_cls = registry.get_parser_for_file("application/pdf", "doc.pdf") + parser_cls = registry.get_parser_for_file( + "application/x-unknown-format", + "doc.xyz", + ) assert parser_cls is None diff --git a/src/paperless_tesseract/tests/test_parser_custom_settings.py b/src/paperless/tests/parsers/test_tesseract_custom_settings.py similarity index 99% rename from src/paperless_tesseract/tests/test_parser_custom_settings.py rename to src/paperless/tests/parsers/test_tesseract_custom_settings.py index a4db8a2aa..60d1486f4 100644 --- a/src/paperless_tesseract/tests/test_parser_custom_settings.py +++ b/src/paperless/tests/parsers/test_tesseract_custom_settings.py @@ -10,7 +10,7 @@ from paperless.models import CleanChoices from paperless.models import ColorConvertChoices from paperless.models import ModeChoices from paperless.models import OutputTypeChoices -from paperless_tesseract.parsers import RasterisedDocumentParser +from paperless.parsers.tesseract import RasterisedDocumentParser class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCase): diff --git a/src/paperless/tests/parsers/test_tesseract_parser.py b/src/paperless/tests/parsers/test_tesseract_parser.py new file mode 100644 index 000000000..daa7020c7 --- /dev/null +++ b/src/paperless/tests/parsers/test_tesseract_parser.py @@ -0,0 +1,1174 @@ +""" +Tests for paperless.parsers.tesseract.RasterisedDocumentParser. + +All tests use fixtures defined in conftest.py for parser lifecycle and +sample-file access. Settings-dependent tests mutate parser.settings +directly rather than going through the database. +""" + +from __future__ import annotations + +import re +import shutil +import unicodedata +from typing import TYPE_CHECKING + +import pytest +from ocrmypdf import SubprocessOutputError + +from documents.parsers import ParseError +from documents.parsers import run_convert +from paperless.parsers import ParserProtocol +from paperless.parsers.tesseract import RasterisedDocumentParser +from paperless.parsers.tesseract import post_process_text + +if TYPE_CHECKING: + from pathlib import Path + from unittest.mock import MagicMock + + from pytest_mock import MockerFixture + + from paperless.tests.parsers.conftest import MakeTesseractParser + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def assert_ordered_substrings(content: str, strings: list[str]) -> None: + """Assert all *strings* appear in *content* in the given order.""" + indices: list[int] = [] + for s in strings: + assert s in content, f"{s!r} not found in content" + indices.append(content.index(s)) + assert indices == sorted(indices), f"Strings out of order in content: {strings}" + + +# --------------------------------------------------------------------------- +# Protocol compliance +# --------------------------------------------------------------------------- + + +class TestRasterisedDocumentParserProtocol: + """Verify class-level protocol attributes and classmethods — no DB, no parser.""" + + def test_class_attributes_present(self) -> None: + assert RasterisedDocumentParser.name + assert RasterisedDocumentParser.version + assert RasterisedDocumentParser.author + assert RasterisedDocumentParser.url + + def test_supported_mime_types_returns_dict(self) -> None: + mime_types = RasterisedDocumentParser.supported_mime_types() + assert isinstance(mime_types, dict) + for mime in ( + "application/pdf", + "image/jpeg", + "image/png", + "image/tiff", + "image/gif", + "image/bmp", + "image/webp", + "image/heic", + ): + assert mime in mime_types + + @pytest.mark.parametrize( + ("mime_type", "expected"), + [ + pytest.param("application/pdf", 10, id="pdf"), + pytest.param("image/jpeg", 10, id="jpeg"), + pytest.param("image/png", 10, id="png"), + pytest.param("image/tiff", 10, id="tiff"), + pytest.param("image/gif", 10, id="gif"), + pytest.param("image/bmp", 10, id="bmp"), + pytest.param("image/webp", 10, id="webp"), + pytest.param("image/heic", 10, id="heic"), + pytest.param("text/plain", None, id="text-unsupported"), + pytest.param("application/msword", None, id="word-unsupported"), + ], + ) + def test_score(self, mime_type: str, expected: int | None) -> None: + assert RasterisedDocumentParser.score(mime_type, "file.pdf") == expected + + def test_isinstance_satisfies_protocol( + self, + tesseract_parser: RasterisedDocumentParser, + ) -> None: + assert isinstance(tesseract_parser, ParserProtocol) + + def test_can_produce_archive_is_true( + self, + tesseract_parser: RasterisedDocumentParser, + ) -> None: + assert tesseract_parser.can_produce_archive is True + + def test_requires_pdf_rendition_is_false( + self, + tesseract_parser: RasterisedDocumentParser, + ) -> None: + assert tesseract_parser.requires_pdf_rendition is False + + +# --------------------------------------------------------------------------- +# Lifecycle +# --------------------------------------------------------------------------- + + +class TestRasterisedDocumentParserLifecycle: + """Context-manager cleanup — no DB.""" + + def test_tempdir_cleaned_up_on_exit( + self, + mocker: MockerFixture, + null_app_config: MagicMock, + ) -> None: + mocker.patch( + "paperless.config.BaseConfig._get_config_instance", + return_value=null_app_config, + ) + with RasterisedDocumentParser() as parser: + tempdir = parser.tempdir + assert tempdir.exists() + assert not tempdir.exists() + + def test_tempdir_cleaned_up_after_exception( + self, + mocker: MockerFixture, + null_app_config: MagicMock, + ) -> None: + mocker.patch( + "paperless.config.BaseConfig._get_config_instance", + return_value=null_app_config, + ) + tempdir: Path | None = None + with pytest.raises(RuntimeError): + with RasterisedDocumentParser() as parser: + tempdir = parser.tempdir + raise RuntimeError("boom") + assert tempdir is not None and not tempdir.exists() + + +# --------------------------------------------------------------------------- +# post_process_text +# --------------------------------------------------------------------------- + + +class TestPostProcessText: + @pytest.mark.parametrize( + ("source", "expected"), + [ + pytest.param( + "simple string", + "simple string", + id="collapse-spaces", + ), + pytest.param( + "simple newline\n testing string", + "simple newline\ntesting string", + id="preserve-newline", + ), + pytest.param( + "utf-8 строка с пробелами в конце ", # noqa: RUF001 + "utf-8 строка с пробелами в конце", # noqa: RUF001 + id="utf8-trailing-spaces", + ), + ], + ) + def test_post_process_text(self, source: str, expected: str) -> None: + assert post_process_text(source) == expected + + +# --------------------------------------------------------------------------- +# Page count +# --------------------------------------------------------------------------- + + +class TestGetPageCount: + def test_single_page_pdf( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + assert ( + tesseract_parser.get_page_count( + tesseract_samples_dir / "simple-digital.pdf", + "application/pdf", + ) + == 1 + ) + + def test_multi_page_pdf( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + assert ( + tesseract_parser.get_page_count( + tesseract_samples_dir / "multi-page-mixed.pdf", + "application/pdf", + ) + == 6 + ) + + def test_password_protected_returns_none( + self, + mocker: MockerFixture, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + caplog, + ) -> None: + """ + GIVEN: + - pikepdf raises when opening a protected PDF + WHEN: + - Page count is requested + THEN: + - Returns None and logs a warning + """ + mocker.patch("pikepdf.Pdf.open", side_effect=Exception("password required")) + import logging + + with caplog.at_level(logging.WARNING): + page_count = tesseract_parser.get_page_count( + tesseract_samples_dir / "simple-digital.pdf", + "application/pdf", + ) + assert page_count is None + assert any( + "Unable to determine PDF page count" in r.message for r in caplog.records + ) + + def test_non_pdf_returns_none( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + assert ( + tesseract_parser.get_page_count( + tesseract_samples_dir / "simple.png", + "image/png", + ) + is None + ) + + +# --------------------------------------------------------------------------- +# DPI helpers +# --------------------------------------------------------------------------- + + +class TestDpiHelpers: + @pytest.mark.parametrize( + ("filename", "expected_dpi"), + [ + pytest.param("simple-no-dpi.png", None, id="no-dpi"), + pytest.param("simple.png", 72, id="with-dpi"), + ], + ) + def test_get_dpi( + self, + filename: str, + expected_dpi: int | None, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + assert ( + tesseract_parser.get_dpi(str(tesseract_samples_dir / filename)) + == expected_dpi + ) + + def test_calculate_a4_dpi( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + assert ( + tesseract_parser.calculate_a4_dpi( + str(tesseract_samples_dir / "simple-no-dpi.png"), + ) + == 62 + ) + + +# --------------------------------------------------------------------------- +# Thumbnail +# --------------------------------------------------------------------------- + + +class TestGetThumbnail: + def test_thumbnail_is_file( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + thumb = tesseract_parser.get_thumbnail( + tesseract_samples_dir / "simple-digital.pdf", + "application/pdf", + ) + assert thumb.is_file() + + def test_thumbnail_fallback_on_convert_error( + self, + mocker: MockerFixture, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + def _raise_on_pdf(input_file, output_file, **kwargs) -> None: + if ".pdf" in str(input_file): + raise ParseError("Does not compute.") + run_convert(input_file=input_file, output_file=output_file, **kwargs) + + mocker.patch("documents.parsers.run_convert", side_effect=_raise_on_pdf) + + thumb = tesseract_parser.get_thumbnail( + tesseract_samples_dir / "simple-digital.pdf", + "application/pdf", + ) + assert thumb.is_file() + + def test_thumbnail_encrypted_pdf( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + thumb = tesseract_parser.get_thumbnail( + tesseract_samples_dir / "encrypted.pdf", + "application/pdf", + ) + assert thumb.is_file() + + +# --------------------------------------------------------------------------- +# extract_text +# --------------------------------------------------------------------------- + + +class TestExtractText: + def test_extract_text_from_digital_pdf( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + text = tesseract_parser.extract_text( + None, + tesseract_samples_dir / "simple-digital.pdf", + ) + assert text is not None + assert "This is a test document." in text.strip() + + +# --------------------------------------------------------------------------- +# Parse — PDF modes +# --------------------------------------------------------------------------- + + +class TestParsePdf: + def test_simple_digital_creates_archive( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.parse( + tesseract_samples_dir / "simple-digital.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is not None + assert tesseract_parser.archive_path.is_file() + assert_ordered_substrings( + tesseract_parser.get_text(), + ["This is a test document."], + ) + + def test_with_form_default( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.parse( + tesseract_samples_dir / "with-form.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is not None + assert tesseract_parser.archive_path.is_file() + assert_ordered_substrings( + tesseract_parser.get_text(), + ["Please enter your name in here:", "This is a PDF document with a form."], + ) + + def test_with_form_redo_produces_no_archive( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.mode = "redo" + tesseract_parser.parse( + tesseract_samples_dir / "with-form.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is None + assert_ordered_substrings( + tesseract_parser.get_text(), + ["Please enter your name in here:", "This is a PDF document with a form."], + ) + + def test_with_form_force( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.mode = "force" + tesseract_parser.parse( + tesseract_samples_dir / "with-form.pdf", + "application/pdf", + ) + assert_ordered_substrings( + tesseract_parser.get_text(), + ["Please enter your name in here:", "This is a PDF document with a form."], + ) + + def test_signed_skip_mode_no_archive( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.mode = "skip" + tesseract_parser.parse(tesseract_samples_dir / "signed.pdf", "application/pdf") + assert tesseract_parser.archive_path is None + assert_ordered_substrings( + tesseract_parser.get_text(), + [ + "This is a digitally signed PDF, created with Acrobat Pro for the Paperless project to enable", + "automated testing of signed/encrypted PDFs", + ], + ) + + def test_encrypted_skip_mode_empty_text( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.mode = "skip" + tesseract_parser.parse( + tesseract_samples_dir / "encrypted.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is None + assert tesseract_parser.get_text() == "" + + def test_gs_rendering_error_raises_parse_error( + self, + mocker: MockerFixture, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + mocker.patch( + "ocrmypdf.ocr", + side_effect=SubprocessOutputError("Ghostscript PDF/A rendering failed"), + ) + with pytest.raises(ParseError): + tesseract_parser.parse( + tesseract_samples_dir / "simple-digital.pdf", + "application/pdf", + ) + + +# --------------------------------------------------------------------------- +# Parse — images +# --------------------------------------------------------------------------- + + +class TestParseImages: + def test_simple_png( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.parse(tesseract_samples_dir / "simple.png", "image/png") + assert tesseract_parser.archive_path is not None + assert tesseract_parser.archive_path.is_file() + assert_ordered_substrings( + tesseract_parser.get_text(), + ["This is a test document."], + ) + + def test_simple_alpha_png( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + tmp_path: Path, + ) -> None: + dest = tmp_path / "simple-alpha.png" + shutil.copy(tesseract_samples_dir / "simple-alpha.png", dest) + tesseract_parser.parse(dest, "image/png") + assert tesseract_parser.archive_path is not None + assert tesseract_parser.archive_path.is_file() + assert_ordered_substrings( + tesseract_parser.get_text(), + ["This is a test document."], + ) + + def test_no_dpi_with_default_dpi( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.image_dpi = 72 + tesseract_parser.parse(tesseract_samples_dir / "simple-no-dpi.png", "image/png") + assert tesseract_parser.archive_path is not None + assert tesseract_parser.archive_path.is_file() + assert "this is a test document." in tesseract_parser.get_text().lower() + + def test_no_dpi_no_fallback_raises( + self, + mocker: MockerFixture, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + mocker.patch.object(tesseract_parser, "calculate_a4_dpi", return_value=None) + with pytest.raises(ParseError): + tesseract_parser.parse( + tesseract_samples_dir / "simple-no-dpi.png", + "image/png", + ) + + +# --------------------------------------------------------------------------- +# Parse — multi-page PDF +# --------------------------------------------------------------------------- + + +class TestParseMultiPage: + def test_multi_page_digital( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.parse( + tesseract_samples_dir / "multi-page-digital.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is not None + assert tesseract_parser.archive_path.is_file() + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + ["page 1", "page 2", "page 3"], + ) + + @pytest.mark.parametrize( + "mode", + [ + pytest.param("skip", id="skip"), + pytest.param("redo", id="redo"), + pytest.param("force", id="force"), + ], + ) + def test_multi_page_digital_pages_2( + self, + mode: str, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.pages = 2 + tesseract_parser.settings.mode = mode + tesseract_parser.parse( + tesseract_samples_dir / "multi-page-digital.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is not None + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + ["page 1", "page 2", "page 3"], + ) + + def test_multi_page_images_skip( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.mode = "skip" + tesseract_parser.parse( + tesseract_samples_dir / "multi-page-images.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is not None + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + ["page 1", "page 2", "page 3"], + ) + + def test_multi_page_images_redo_pages_2( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + """ + GIVEN: + - File with image-only pages + - OCR of only pages 1 and 2 requested + - Mode: redo + WHEN: + - Document is parsed + THEN: + - Pages 1 and 2 extracted; page 3 absent + """ + tesseract_parser.settings.pages = 2 + tesseract_parser.settings.mode = "redo" + tesseract_parser.parse( + tesseract_samples_dir / "multi-page-images.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is not None + text = tesseract_parser.get_text().lower() + assert_ordered_substrings(text, ["page 1", "page 2"]) + assert "page 3" not in text + + def test_multi_page_images_force_page_1( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + """ + GIVEN: + - File with image-only pages + - Only page 1 requested + - Mode: force + WHEN: + - Document is parsed + THEN: + - Only page 1 extracted + """ + tesseract_parser.settings.pages = 1 + tesseract_parser.settings.mode = "force" + tesseract_parser.parse( + tesseract_samples_dir / "multi-page-images.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is not None + text = tesseract_parser.get_text().lower() + assert "page 1" in text + assert "page 2" not in text + assert "page 3" not in text + + def test_multi_page_tiff( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + """ + GIVEN: + - Multi-page TIFF image + WHEN: + - Image is parsed + THEN: + - Text from all pages extracted + """ + tesseract_parser.parse( + tesseract_samples_dir / "multi-page-images.tiff", + "image/tiff", + ) + assert tesseract_parser.archive_path is not None + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + ["page 1", "page 2", "page 3"], + ) + + def test_multi_page_tiff_alpha( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + tmp_path: Path, + ) -> None: + """ + GIVEN: + - Multi-page TIFF with alpha channel + WHEN: + - Image is parsed + THEN: + - Text from all pages extracted + """ + dest = tmp_path / "alpha.tiff" + shutil.copy(tesseract_samples_dir / "multi-page-images-alpha.tiff", dest) + tesseract_parser.parse(dest, "image/tiff") + assert tesseract_parser.archive_path is not None + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + ["page 1", "page 2", "page 3"], + ) + + def test_multi_page_tiff_alpha_srgb( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + tmp_path: Path, + ) -> None: + """ + GIVEN: + - Multi-page TIFF with alpha channel and sRGB colorspace + WHEN: + - Image is parsed + THEN: + - Text from all pages extracted + """ + dest = tmp_path / "alpha-rgb.tiff" + shutil.copy(tesseract_samples_dir / "multi-page-images-alpha-rgb.tiff", dest) + tesseract_parser.parse(dest, "image/tiff") + assert tesseract_parser.archive_path is not None + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + ["page 1", "page 2", "page 3"], + ) + + +# --------------------------------------------------------------------------- +# Parse — skip_noarchive / skip_archive_file +# --------------------------------------------------------------------------- + + +class TestSkipArchive: + def test_skip_noarchive_with_text_layer( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + """ + GIVEN: + - File with existing text layer + - Mode: skip_noarchive + WHEN: + - Document is parsed + THEN: + - Text extracted; no archive created + """ + tesseract_parser.settings.mode = "skip_noarchive" + tesseract_parser.parse( + tesseract_samples_dir / "multi-page-digital.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is None + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + ["page 1", "page 2", "page 3"], + ) + + def test_skip_noarchive_image_only_creates_archive( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + """ + GIVEN: + - File with image-only pages (no text layer) + - Mode: skip_noarchive + WHEN: + - Document is parsed + THEN: + - Text extracted; archive created (OCR needed) + """ + tesseract_parser.settings.mode = "skip_noarchive" + tesseract_parser.parse( + tesseract_samples_dir / "multi-page-images.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is not None + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + ["page 1", "page 2", "page 3"], + ) + + @pytest.mark.parametrize( + ("skip_archive_file", "filename", "expect_archive"), + [ + pytest.param("never", "multi-page-digital.pdf", True, id="never-with-text"), + pytest.param("never", "multi-page-images.pdf", True, id="never-no-text"), + pytest.param( + "with_text", + "multi-page-digital.pdf", + False, + id="with-text-layer", + ), + pytest.param( + "with_text", + "multi-page-images.pdf", + True, + id="with-text-no-layer", + ), + pytest.param( + "always", + "multi-page-digital.pdf", + False, + id="always-with-text", + ), + pytest.param("always", "multi-page-images.pdf", False, id="always-no-text"), + ], + ) + def test_skip_archive_file_setting( + self, + skip_archive_file: str, + filename: str, + expect_archive: str, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.skip_archive_file = skip_archive_file + tesseract_parser.parse(tesseract_samples_dir / filename, "application/pdf") + text = tesseract_parser.get_text().lower() + assert_ordered_substrings(text, ["page 1", "page 2", "page 3"]) + if expect_archive: + assert tesseract_parser.archive_path is not None + else: + assert tesseract_parser.archive_path is None + + +# --------------------------------------------------------------------------- +# Parse — mixed pages / sidecar +# --------------------------------------------------------------------------- + + +class TestParseMixed: + def test_multi_page_mixed_skip_mode( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + """ + GIVEN: + - File with text in some pages (image) and some pages (digital) + - Mode: skip + WHEN: + - Document is parsed + THEN: + - All pages extracted; archive created; sidecar notes skipped pages + """ + tesseract_parser.settings.mode = "skip" + tesseract_parser.parse( + tesseract_samples_dir / "multi-page-mixed.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is not None + assert tesseract_parser.archive_path.is_file() + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + ["page 1", "page 2", "page 3", "page 4", "page 5", "page 6"], + ) + sidecar = (tesseract_parser.tempdir / "sidecar.txt").read_text() + assert "[OCR skipped on page(s) 4-6]" in sidecar + + def test_single_page_mixed_redo_mode( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + """ + GIVEN: + - Single page with both text and image content + - Mode: redo + WHEN: + - Document is parsed + THEN: + - Both text layer and image text extracted; archive created + """ + tesseract_parser.settings.mode = "redo" + tesseract_parser.parse( + tesseract_samples_dir / "single-page-mixed.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is not None + assert tesseract_parser.archive_path.is_file() + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + [ + "this is some normal text, present on page 1 of the document.", + "this is some text, but in an image, also on page 1.", + "this is further text on page 1.", + ], + ) + sidecar = (tesseract_parser.tempdir / "sidecar.txt").read_text().lower() + assert "this is some text, but in an image, also on page 1." in sidecar + assert ( + "this is some normal text, present on page 1 of the document." + not in sidecar + ) + + def test_multi_page_mixed_skip_noarchive( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + """ + GIVEN: + - File with mixed pages + - Mode: skip_noarchive + WHEN: + - Document is parsed + THEN: + - No archive created (file has text layer); later-page text present + """ + tesseract_parser.settings.mode = "skip_noarchive" + tesseract_parser.parse( + tesseract_samples_dir / "multi-page-mixed.pdf", + "application/pdf", + ) + assert tesseract_parser.archive_path is None + assert_ordered_substrings( + tesseract_parser.get_text().lower(), + ["page 4", "page 5", "page 6"], + ) + + +# --------------------------------------------------------------------------- +# Parse — rotation +# --------------------------------------------------------------------------- + + +class TestParseRotate: + def test_rotate_skip_mode( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.mode = "skip" + tesseract_parser.settings.rotate = True + tesseract_parser.parse(tesseract_samples_dir / "rotated.pdf", "application/pdf") + assert_ordered_substrings( + tesseract_parser.get_text(), + [ + "This is the text that appears on the first page. It\u2019s a lot of text.", + "Even if the pages are rotated, OCRmyPDF still gets the job done.", + "This is a really weird file with lots of nonsense text.", + "If you read this, it\u2019s your own fault. Also check your screen orientation.", + ], + ) + + +# --------------------------------------------------------------------------- +# Parse — RTL +# --------------------------------------------------------------------------- + + +class TestParseRtl: + def test_rtl_language_detected( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + """ + GIVEN: + - PDF with RTL Arabic text + WHEN: + - Document is parsed + THEN: + - Arabic content is extracted (normalised for bidi) + """ + tesseract_parser.parse( + tesseract_samples_dir / "rtl-test.pdf", + "application/pdf", + ) + normalised = "".join( + ch + for ch in unicodedata.normalize("NFKC", tesseract_parser.get_text()) + if unicodedata.category(ch) != "Cf" and not ch.isspace() + ) + assert "ةرازو" in normalised + assert any(token in normalised for token in ("ةیلخادلا", "الاخليد")) + + +# --------------------------------------------------------------------------- +# Parse — OCRmyPDF parameters +# --------------------------------------------------------------------------- + + +@pytest.mark.django_db +class TestOcrmypdfParameters: + """Tests that inspect the dict passed to ocrmypdf. + + These create parsers inline via make_tesseract_parser with specific + Django settings overrides so OcrConfig picks them up at construction time. + """ + + def test_basic_parameter_mapping( + self, + make_tesseract_parser: MakeTesseractParser, + ) -> None: + with make_tesseract_parser() as parser: + params = parser.construct_ocrmypdf_parameters( + input_file="input.pdf", + output_file="output.pdf", + sidecar_file="sidecar.txt", + mime_type="application/pdf", + safe_fallback=False, + ) + assert params["input_file_or_options"] == "input.pdf" + assert params["output_file"] == "output.pdf" + assert params["sidecar"] == "sidecar.txt" + + @pytest.mark.parametrize( + ("ocr_clean", "expected_clean", "expected_clean_final"), + [ + pytest.param("none", False, False, id="clean-none"), + pytest.param("clean", True, False, id="clean-clean"), + ], + ) + def test_clean_option( + self, + ocr_clean: str, + *, + expected_clean: bool, + expected_clean_final: bool, + make_tesseract_parser: MakeTesseractParser, + ) -> None: + with make_tesseract_parser(OCR_CLEAN=ocr_clean) as parser: + params = parser.construct_ocrmypdf_parameters("", "", "", "") + assert ("clean" in params) == expected_clean + assert ("clean_final" in params) == expected_clean_final + + def test_clean_final_skip_mode( + self, + make_tesseract_parser: MakeTesseractParser, + ) -> None: + with make_tesseract_parser(OCR_CLEAN="clean-final", OCR_MODE="skip") as parser: + params = parser.construct_ocrmypdf_parameters("", "", "", "") + assert params["clean_final"] is True + assert "clean" not in params + + def test_clean_final_redo_mode_falls_back_to_clean( + self, + make_tesseract_parser: MakeTesseractParser, + ) -> None: + with make_tesseract_parser(OCR_CLEAN="clean-final", OCR_MODE="redo") as parser: + params = parser.construct_ocrmypdf_parameters("", "", "", "") + assert params["clean"] is True + assert "clean_final" not in params + + @pytest.mark.parametrize( + ("ocr_mode", "ocr_deskew", "expect_deskew"), + [ + pytest.param("skip", True, True, id="skip-deskew-on"), + pytest.param("redo", True, False, id="redo-deskew-off"), + pytest.param("skip", False, False, id="skip-no-deskew"), + ], + ) + def test_deskew_option( + self, + ocr_mode: str, + *, + ocr_deskew: bool, + expect_deskew: bool, + make_tesseract_parser: MakeTesseractParser, + ) -> None: + with make_tesseract_parser(OCR_MODE=ocr_mode, OCR_DESKEW=ocr_deskew) as parser: + params = parser.construct_ocrmypdf_parameters("", "", "", "") + assert ("deskew" in params) == expect_deskew + + def test_max_image_pixels_positive( + self, + make_tesseract_parser: MakeTesseractParser, + ) -> None: + with make_tesseract_parser(OCR_MAX_IMAGE_PIXELS=1_000_001.0) as parser: + params = parser.construct_ocrmypdf_parameters("", "", "", "") + assert "max_image_mpixels" in params + assert abs(params["max_image_mpixels"] - 1.0) < 1e-4 + + def test_max_image_pixels_negative_omitted( + self, + make_tesseract_parser: MakeTesseractParser, + ) -> None: + with make_tesseract_parser(OCR_MAX_IMAGE_PIXELS=-1_000_001.0) as parser: + params = parser.construct_ocrmypdf_parameters("", "", "", "") + assert "max_image_mpixels" not in params + + +# --------------------------------------------------------------------------- +# Parse — file type matrix +# --------------------------------------------------------------------------- + + +class TestParserFileTypes: + @pytest.mark.parametrize( + ("filename", "mime_type"), + [ + pytest.param("simple.bmp", "image/bmp", id="bmp"), + pytest.param("simple.jpg", "image/jpeg", id="jpeg"), + pytest.param("simple.tif", "image/tiff", id="tiff"), + ], + ) + def test_simple_image_contains_test_text( + self, + filename: str, + mime_type: str, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.parse(tesseract_samples_dir / filename, mime_type) + assert tesseract_parser.archive_path is not None + assert tesseract_parser.archive_path.is_file() + assert "this is a test document" in tesseract_parser.get_text().lower() + + def test_heic( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.parse(tesseract_samples_dir / "simple.heic", "image/heic") + assert tesseract_parser.archive_path is not None + assert "pizza" in tesseract_parser.get_text().lower() + + def test_gif_with_explicit_dpi( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.image_dpi = 200 + tesseract_parser.parse(tesseract_samples_dir / "simple.gif", "image/gif") + assert tesseract_parser.archive_path is not None + assert "this is a test document" in tesseract_parser.get_text().lower() + + def test_webp_with_explicit_dpi( + self, + tesseract_parser: RasterisedDocumentParser, + tesseract_samples_dir: Path, + ) -> None: + tesseract_parser.settings.image_dpi = 72 + tesseract_parser.parse(tesseract_samples_dir / "document.webp", "image/webp") + assert tesseract_parser.archive_path is not None + assert re.search( + r"this is a ?webp document, created 11/14/2022\.", + tesseract_parser.get_text().lower(), + ) + + +# --------------------------------------------------------------------------- +# Registry +# --------------------------------------------------------------------------- + + +class TestRasterisedDocumentParserRegistry: + def test_registered_in_defaults(self) -> None: + from paperless.parsers.registry import ParserRegistry + + registry = ParserRegistry() + registry.register_defaults() + assert RasterisedDocumentParser in registry._builtins + + @pytest.mark.parametrize( + ("mime_type", "filename"), + [ + pytest.param("application/pdf", "doc.pdf", id="pdf"), + pytest.param("image/png", "image.png", id="png"), + pytest.param("image/jpeg", "photo.jpg", id="jpeg"), + pytest.param("image/tiff", "scan.tif", id="tiff"), + ], + ) + def test_get_parser_for_supported_mime( + self, + mime_type: str, + filename: str, + ) -> None: + from paperless.parsers.registry import get_parser_registry + + registry = get_parser_registry() + assert ( + registry.get_parser_for_file(mime_type, filename) + is RasterisedDocumentParser + ) diff --git a/src/paperless/tests/parsers/test_text_parser.py b/src/paperless/tests/parsers/test_text_parser.py index 091d8287e..fd2a57857 100644 --- a/src/paperless/tests/parsers/test_text_parser.py +++ b/src/paperless/tests/parsers/test_text_parser.py @@ -256,6 +256,9 @@ class TestTextParserRegistry: from paperless.parsers.registry import get_parser_registry registry = get_parser_registry() - parser_cls = registry.get_parser_for_file("application/pdf", "doc.pdf") + parser_cls = registry.get_parser_for_file( + "application/x-unknown-format", + "doc.xyz", + ) assert parser_cls is None diff --git a/src/paperless_tesseract/tests/samples/document.webp b/src/paperless/tests/samples/tesseract/document.webp similarity index 100% rename from src/paperless_tesseract/tests/samples/document.webp rename to src/paperless/tests/samples/tesseract/document.webp diff --git a/src/paperless_tesseract/tests/samples/encrypted.pdf b/src/paperless/tests/samples/tesseract/encrypted.pdf similarity index 100% rename from src/paperless_tesseract/tests/samples/encrypted.pdf rename to src/paperless/tests/samples/tesseract/encrypted.pdf diff --git a/src/paperless_tesseract/tests/samples/multi-page-digital.pdf b/src/paperless/tests/samples/tesseract/multi-page-digital.pdf similarity index 100% rename from src/paperless_tesseract/tests/samples/multi-page-digital.pdf rename to src/paperless/tests/samples/tesseract/multi-page-digital.pdf diff --git a/src/paperless_tesseract/tests/samples/multi-page-images-alpha-rgb.tiff b/src/paperless/tests/samples/tesseract/multi-page-images-alpha-rgb.tiff similarity index 100% rename from src/paperless_tesseract/tests/samples/multi-page-images-alpha-rgb.tiff rename to src/paperless/tests/samples/tesseract/multi-page-images-alpha-rgb.tiff diff --git a/src/paperless_tesseract/tests/samples/multi-page-images-alpha.tiff b/src/paperless/tests/samples/tesseract/multi-page-images-alpha.tiff similarity index 100% rename from src/paperless_tesseract/tests/samples/multi-page-images-alpha.tiff rename to src/paperless/tests/samples/tesseract/multi-page-images-alpha.tiff diff --git a/src/paperless_tesseract/tests/samples/multi-page-images.pdf b/src/paperless/tests/samples/tesseract/multi-page-images.pdf similarity index 100% rename from src/paperless_tesseract/tests/samples/multi-page-images.pdf rename to src/paperless/tests/samples/tesseract/multi-page-images.pdf diff --git a/src/paperless_tesseract/tests/samples/multi-page-images.tiff b/src/paperless/tests/samples/tesseract/multi-page-images.tiff similarity index 100% rename from src/paperless_tesseract/tests/samples/multi-page-images.tiff rename to src/paperless/tests/samples/tesseract/multi-page-images.tiff diff --git a/src/paperless_tesseract/tests/samples/multi-page-mixed.pdf b/src/paperless/tests/samples/tesseract/multi-page-mixed.pdf similarity index 100% rename from src/paperless_tesseract/tests/samples/multi-page-mixed.pdf rename to src/paperless/tests/samples/tesseract/multi-page-mixed.pdf diff --git a/src/paperless_tesseract/tests/samples/no-text-alpha.png b/src/paperless/tests/samples/tesseract/no-text-alpha.png similarity index 100% rename from src/paperless_tesseract/tests/samples/no-text-alpha.png rename to src/paperless/tests/samples/tesseract/no-text-alpha.png diff --git a/src/paperless_tesseract/tests/samples/rotated.pdf b/src/paperless/tests/samples/tesseract/rotated.pdf similarity index 100% rename from src/paperless_tesseract/tests/samples/rotated.pdf rename to src/paperless/tests/samples/tesseract/rotated.pdf diff --git a/src/paperless_tesseract/tests/samples/rtl-test.pdf b/src/paperless/tests/samples/tesseract/rtl-test.pdf similarity index 100% rename from src/paperless_tesseract/tests/samples/rtl-test.pdf rename to src/paperless/tests/samples/tesseract/rtl-test.pdf diff --git a/src/paperless_tesseract/tests/samples/signed.pdf b/src/paperless/tests/samples/tesseract/signed.pdf similarity index 100% rename from src/paperless_tesseract/tests/samples/signed.pdf rename to src/paperless/tests/samples/tesseract/signed.pdf diff --git a/src/paperless_tesseract/tests/samples/simple-alpha.png b/src/paperless/tests/samples/tesseract/simple-alpha.png similarity index 100% rename from src/paperless_tesseract/tests/samples/simple-alpha.png rename to src/paperless/tests/samples/tesseract/simple-alpha.png diff --git a/src/paperless_tesseract/tests/samples/simple-digital.pdf b/src/paperless/tests/samples/tesseract/simple-digital.pdf similarity index 100% rename from src/paperless_tesseract/tests/samples/simple-digital.pdf rename to src/paperless/tests/samples/tesseract/simple-digital.pdf diff --git a/src/paperless_tesseract/tests/samples/simple-no-dpi.png b/src/paperless/tests/samples/tesseract/simple-no-dpi.png similarity index 100% rename from src/paperless_tesseract/tests/samples/simple-no-dpi.png rename to src/paperless/tests/samples/tesseract/simple-no-dpi.png diff --git a/src/paperless_tesseract/tests/samples/simple.bmp b/src/paperless/tests/samples/tesseract/simple.bmp similarity index 100% rename from src/paperless_tesseract/tests/samples/simple.bmp rename to src/paperless/tests/samples/tesseract/simple.bmp diff --git a/src/paperless_tesseract/tests/samples/simple.gif b/src/paperless/tests/samples/tesseract/simple.gif similarity index 100% rename from src/paperless_tesseract/tests/samples/simple.gif rename to src/paperless/tests/samples/tesseract/simple.gif diff --git a/src/paperless_tesseract/tests/samples/simple.heic b/src/paperless/tests/samples/tesseract/simple.heic similarity index 100% rename from src/paperless_tesseract/tests/samples/simple.heic rename to src/paperless/tests/samples/tesseract/simple.heic diff --git a/src/paperless_tesseract/tests/samples/simple.jpg b/src/paperless/tests/samples/tesseract/simple.jpg similarity index 100% rename from src/paperless_tesseract/tests/samples/simple.jpg rename to src/paperless/tests/samples/tesseract/simple.jpg diff --git a/src/paperless_tesseract/tests/samples/simple.png b/src/paperless/tests/samples/tesseract/simple.png similarity index 100% rename from src/paperless_tesseract/tests/samples/simple.png rename to src/paperless/tests/samples/tesseract/simple.png diff --git a/src/paperless_tesseract/tests/samples/simple.tif b/src/paperless/tests/samples/tesseract/simple.tif similarity index 100% rename from src/paperless_tesseract/tests/samples/simple.tif rename to src/paperless/tests/samples/tesseract/simple.tif diff --git a/src/paperless_tesseract/tests/samples/single-page-mixed.pdf b/src/paperless/tests/samples/tesseract/single-page-mixed.pdf similarity index 100% rename from src/paperless_tesseract/tests/samples/single-page-mixed.pdf rename to src/paperless/tests/samples/tesseract/single-page-mixed.pdf diff --git a/src/paperless_tesseract/tests/samples/with-form.pdf b/src/paperless/tests/samples/tesseract/with-form.pdf similarity index 100% rename from src/paperless_tesseract/tests/samples/with-form.pdf rename to src/paperless/tests/samples/tesseract/with-form.pdf diff --git a/src/paperless_tesseract/signals.py b/src/paperless_tesseract/signals.py index e4d8449ed..d80d13614 100644 --- a/src/paperless_tesseract/signals.py +++ b/src/paperless_tesseract/signals.py @@ -1,10 +1,23 @@ -def get_parser(*args, **kwargs): - from paperless_tesseract.parsers import RasterisedDocumentParser +from __future__ import annotations +from typing import Any + + +def get_parser(*args: Any, **kwargs: Any) -> Any: + from paperless.parsers.tesseract import RasterisedDocumentParser + + # RasterisedDocumentParser accepts logging_group for constructor compatibility but + # does not store or use it (no legacy DocumentParser base class). + # progress_callback is also not used. Both may arrive as a positional arg + # (consumer) or a keyword arg (views); *args absorbs the positional form, + # kwargs.pop handles the keyword form. Phase 4 will replace this signal + # path with the new ParserRegistry so the shim can be removed at that point. + kwargs.pop("logging_group", None) + kwargs.pop("progress_callback", None) return RasterisedDocumentParser(*args, **kwargs) -def tesseract_consumer_declaration(sender, **kwargs): +def tesseract_consumer_declaration(sender: Any, **kwargs: Any) -> dict[str, Any]: return { "parser": get_parser, "weight": 0, diff --git a/src/paperless_tesseract/tests/test_parser.py b/src/paperless_tesseract/tests/test_parser.py deleted file mode 100644 index 2703f30dd..000000000 --- a/src/paperless_tesseract/tests/test_parser.py +++ /dev/null @@ -1,924 +0,0 @@ -import shutil -import tempfile -import unicodedata -import uuid -from pathlib import Path -from unittest import mock - -from django.test import TestCase -from django.test import override_settings -from ocrmypdf import SubprocessOutputError - -from documents.parsers import ParseError -from documents.parsers import run_convert -from documents.tests.utils import DirectoriesMixin -from documents.tests.utils import FileSystemAssertsMixin -from paperless_tesseract.parsers import RasterisedDocumentParser -from paperless_tesseract.parsers import post_process_text - - -class TestParser(DirectoriesMixin, FileSystemAssertsMixin, TestCase): - SAMPLE_FILES = Path(__file__).resolve().parent / "samples" - - def assertContainsStrings(self, content, strings) -> None: - # Asserts that all strings appear in content, in the given order. - indices = [] - for s in strings: - if s in content: - indices.append(content.index(s)) - else: - self.fail(f"'{s}' is not in '{content}'") - self.assertListEqual(indices, sorted(indices)) - - def test_post_process_text(self) -> None: - text_cases = [ - ("simple string", "simple string"), - ("simple newline\n testing string", "simple newline\ntesting string"), - ( - "utf-8 строка с пробелами в конце ", - "utf-8 строка с пробелами в конце", - ), - ] - - for source, result in text_cases: - actual_result = post_process_text(source) - self.assertEqual( - result, - actual_result, - f"strip_exceess_whitespace({source}) != '{result}', but '{actual_result}'", - ) - - def test_get_text_from_pdf(self) -> None: - parser = RasterisedDocumentParser(uuid.uuid4()) - text = parser.extract_text( - None, - self.SAMPLE_FILES / "simple-digital.pdf", - ) - - self.assertContainsStrings(text.strip(), ["This is a test document."]) - - def test_get_page_count(self) -> None: - """ - GIVEN: - - PDF file with a single page - - PDF file with multiple pages - WHEN: - - The number of pages is requested - THEN: - - The method returns 1 as the expected number of pages - - The method returns the correct number of pages (6) - """ - parser = RasterisedDocumentParser(uuid.uuid4()) - page_count = parser.get_page_count( - str(self.SAMPLE_FILES / "simple-digital.pdf"), - "application/pdf", - ) - self.assertEqual(page_count, 1) - - page_count = parser.get_page_count( - str(self.SAMPLE_FILES / "multi-page-mixed.pdf"), - "application/pdf", - ) - self.assertEqual(page_count, 6) - - def test_get_page_count_password_protected(self) -> None: - """ - GIVEN: - - Password protected PDF file - WHEN: - - The number of pages is requested - THEN: - - The method returns None - """ - parser = RasterisedDocumentParser(uuid.uuid4()) - with self.assertLogs("paperless.parsing.tesseract", level="WARNING") as cm: - page_count = parser.get_page_count( - str(self.SAMPLE_FILES / "password-protected.pdf"), - "application/pdf", - ) - self.assertEqual(page_count, None) - self.assertIn("Unable to determine PDF page count", cm.output[0]) - - def test_thumbnail(self) -> None: - parser = RasterisedDocumentParser(uuid.uuid4()) - thumb = parser.get_thumbnail( - str(self.SAMPLE_FILES / "simple-digital.pdf"), - "application/pdf", - ) - self.assertIsFile(thumb) - - @mock.patch("documents.parsers.run_convert") - def test_thumbnail_fallback(self, m) -> None: - def call_convert(input_file, output_file, **kwargs) -> None: - if ".pdf" in str(input_file): - raise ParseError("Does not compute.") - else: - run_convert(input_file=input_file, output_file=output_file, **kwargs) - - m.side_effect = call_convert - - parser = RasterisedDocumentParser(uuid.uuid4()) - thumb = parser.get_thumbnail( - str(self.SAMPLE_FILES / "simple-digital.pdf"), - "application/pdf", - ) - self.assertIsFile(thumb) - - def test_thumbnail_encrypted(self) -> None: - parser = RasterisedDocumentParser(uuid.uuid4()) - thumb = parser.get_thumbnail( - str(self.SAMPLE_FILES / "encrypted.pdf"), - "application/pdf", - ) - self.assertIsFile(thumb) - - def test_get_dpi(self) -> None: - parser = RasterisedDocumentParser(None) - - dpi = parser.get_dpi(str(self.SAMPLE_FILES / "simple-no-dpi.png")) - self.assertEqual(dpi, None) - - dpi = parser.get_dpi(str(self.SAMPLE_FILES / "simple.png")) - self.assertEqual(dpi, 72) - - def test_simple_digital(self) -> None: - parser = RasterisedDocumentParser(None) - - parser.parse( - str(self.SAMPLE_FILES / "simple-digital.pdf"), - "application/pdf", - ) - - self.assertIsFile(parser.archive_path) - - self.assertContainsStrings(parser.get_text(), ["This is a test document."]) - - def test_with_form(self) -> None: - parser = RasterisedDocumentParser(None) - - parser.parse( - str(self.SAMPLE_FILES / "with-form.pdf"), - "application/pdf", - ) - - self.assertIsFile(parser.archive_path) - - self.assertContainsStrings( - parser.get_text(), - ["Please enter your name in here:", "This is a PDF document with a form."], - ) - - @override_settings(OCR_MODE="redo") - def test_with_form_error(self) -> None: - parser = RasterisedDocumentParser(None) - - parser.parse( - str(self.SAMPLE_FILES / "with-form.pdf"), - "application/pdf", - ) - - self.assertIsNone(parser.archive_path) - self.assertContainsStrings( - parser.get_text(), - ["Please enter your name in here:", "This is a PDF document with a form."], - ) - - @override_settings(OCR_MODE="skip") - def test_signed(self) -> None: - parser = RasterisedDocumentParser(None) - - parser.parse(str(self.SAMPLE_FILES / "signed.pdf"), "application/pdf") - - self.assertIsNone(parser.archive_path) - self.assertContainsStrings( - parser.get_text(), - [ - "This is a digitally signed PDF, created with Acrobat Pro for the Paperless project to enable", - "automated testing of signed/encrypted PDFs", - ], - ) - - @override_settings(OCR_MODE="skip") - def test_encrypted(self) -> None: - parser = RasterisedDocumentParser(None) - - parser.parse( - str(self.SAMPLE_FILES / "encrypted.pdf"), - "application/pdf", - ) - - self.assertIsNone(parser.archive_path) - self.assertEqual(parser.get_text(), "") - - @override_settings(OCR_MODE="redo") - def test_with_form_error_notext(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "with-form.pdf"), - "application/pdf", - ) - - self.assertContainsStrings( - parser.get_text(), - ["Please enter your name in here:", "This is a PDF document with a form."], - ) - - @override_settings(OCR_MODE="force") - def test_with_form_force(self) -> None: - parser = RasterisedDocumentParser(None) - - parser.parse( - str(self.SAMPLE_FILES / "with-form.pdf"), - "application/pdf", - ) - - self.assertContainsStrings( - parser.get_text(), - ["Please enter your name in here:", "This is a PDF document with a form."], - ) - - def test_image_simple(self) -> None: - parser = RasterisedDocumentParser(None) - - parser.parse(str(self.SAMPLE_FILES / "simple.png"), "image/png") - - self.assertIsFile(parser.archive_path) - - self.assertContainsStrings(parser.get_text(), ["This is a test document."]) - - def test_image_simple_alpha(self) -> None: - parser = RasterisedDocumentParser(None) - - with tempfile.TemporaryDirectory() as tempdir: - # Copy sample file to temp directory, as the parsing changes the file - # and this makes it modified to Git - sample_file = self.SAMPLE_FILES / "simple-alpha.png" - dest_file = Path(tempdir) / "simple-alpha.png" - shutil.copy(sample_file, dest_file) - - parser.parse(str(dest_file), "image/png") - - self.assertIsFile(parser.archive_path) - - self.assertContainsStrings(parser.get_text(), ["This is a test document."]) - - def test_image_calc_a4_dpi(self) -> None: - parser = RasterisedDocumentParser(None) - - dpi = parser.calculate_a4_dpi( - str(self.SAMPLE_FILES / "simple-no-dpi.png"), - ) - - self.assertEqual(dpi, 62) - - @mock.patch("paperless_tesseract.parsers.RasterisedDocumentParser.calculate_a4_dpi") - def test_image_dpi_fail(self, m) -> None: - m.return_value = None - parser = RasterisedDocumentParser(None) - - def f() -> None: - parser.parse( - str(self.SAMPLE_FILES / "simple-no-dpi.png"), - "image/png", - ) - - self.assertRaises(ParseError, f) - - @override_settings(OCR_IMAGE_DPI=72, MAX_IMAGE_PIXELS=0) - def test_image_no_dpi_default(self) -> None: - parser = RasterisedDocumentParser(None) - - parser.parse(str(self.SAMPLE_FILES / "simple-no-dpi.png"), "image/png") - - self.assertIsFile(parser.archive_path) - - self.assertContainsStrings( - parser.get_text().lower(), - ["this is a test document."], - ) - - def test_multi_page(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-digital.pdf"), - "application/pdf", - ) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_PAGES=2, OCR_MODE="skip") - def test_multi_page_pages_skip(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-digital.pdf"), - "application/pdf", - ) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_PAGES=2, OCR_MODE="redo") - def test_multi_page_pages_redo(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-digital.pdf"), - "application/pdf", - ) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_PAGES=2, OCR_MODE="force") - def test_multi_page_pages_force(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-digital.pdf"), - "application/pdf", - ) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_MODE="skip") - def test_multi_page_analog_pages_skip(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-images.pdf"), - "application/pdf", - ) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_PAGES=2, OCR_MODE="redo") - def test_multi_page_analog_pages_redo(self) -> None: - """ - GIVEN: - - File with text contained in images but no text layer - - OCR of only pages 1 and 2 requested - - OCR mode set to redo - WHEN: - - Document is parsed - THEN: - - Text of page 1 and 2 extracted - - An archive file is created - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-images.pdf"), - "application/pdf", - ) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings(parser.get_text().lower(), ["page 1", "page 2"]) - self.assertNotIn("page 3", parser.get_text().lower()) - - @override_settings(OCR_PAGES=1, OCR_MODE="force") - def test_multi_page_analog_pages_force(self) -> None: - """ - GIVEN: - - File with text contained in images but no text layer - - OCR of only page 1 requested - - OCR mode set to force - WHEN: - - Document is parsed - THEN: - - Only text of page 1 is extracted - - An archive file is created - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-images.pdf"), - "application/pdf", - ) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings(parser.get_text().lower(), ["page 1"]) - self.assertNotIn("page 2", parser.get_text().lower()) - self.assertNotIn("page 3", parser.get_text().lower()) - - @override_settings(OCR_MODE="skip_noarchive") - def test_skip_noarchive_withtext(self) -> None: - """ - GIVEN: - - File with existing text layer - - OCR mode set to skip_noarchive - WHEN: - - Document is parsed - THEN: - - Text from images is extracted - - No archive file is created - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-digital.pdf"), - "application/pdf", - ) - self.assertIsNone(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_MODE="skip_noarchive") - def test_skip_noarchive_notext(self) -> None: - """ - GIVEN: - - File with text contained in images but no text layer - - OCR mode set to skip_noarchive - WHEN: - - Document is parsed - THEN: - - Text from images is extracted - - An archive file is created with the OCRd text - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-images.pdf"), - "application/pdf", - ) - - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - self.assertIsNotNone(parser.archive_path) - - @override_settings(OCR_SKIP_ARCHIVE_FILE="never") - def test_skip_archive_never_withtext(self) -> None: - """ - GIVEN: - - File with existing text layer - - OCR_SKIP_ARCHIVE_FILE set to never - WHEN: - - Document is parsed - THEN: - - Text from text layer is extracted - - Archive file is created - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-digital.pdf"), - "application/pdf", - ) - self.assertIsNotNone(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_SKIP_ARCHIVE_FILE="never") - def test_skip_archive_never_withimages(self) -> None: - """ - GIVEN: - - File with text contained in images but no text layer - - OCR_SKIP_ARCHIVE_FILE set to never - WHEN: - - Document is parsed - THEN: - - Text from images is extracted - - Archive file is created - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-images.pdf"), - "application/pdf", - ) - self.assertIsNotNone(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_SKIP_ARCHIVE_FILE="with_text") - def test_skip_archive_withtext_withtext(self) -> None: - """ - GIVEN: - - File with existing text layer - - OCR_SKIP_ARCHIVE_FILE set to with_text - WHEN: - - Document is parsed - THEN: - - Text from text layer is extracted - - No archive file is created - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-digital.pdf"), - "application/pdf", - ) - self.assertIsNone(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_SKIP_ARCHIVE_FILE="with_text") - def test_skip_archive_withtext_withimages(self) -> None: - """ - GIVEN: - - File with text contained in images but no text layer - - OCR_SKIP_ARCHIVE_FILE set to with_text - WHEN: - - Document is parsed - THEN: - - Text from images is extracted - - Archive file is created - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-images.pdf"), - "application/pdf", - ) - self.assertIsNotNone(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_SKIP_ARCHIVE_FILE="always") - def test_skip_archive_always_withtext(self) -> None: - """ - GIVEN: - - File with existing text layer - - OCR_SKIP_ARCHIVE_FILE set to always - WHEN: - - Document is parsed - THEN: - - Text from text layer is extracted - - No archive file is created - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-digital.pdf"), - "application/pdf", - ) - self.assertIsNone(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_SKIP_ARCHIVE_FILE="always") - def test_skip_archive_always_withimages(self) -> None: - """ - GIVEN: - - File with text contained in images but no text layer - - OCR_SKIP_ARCHIVE_FILE set to always - WHEN: - - Document is parsed - THEN: - - Text from images is extracted - - No archive file is created - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-images.pdf"), - "application/pdf", - ) - self.assertIsNone(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - @override_settings(OCR_MODE="skip") - def test_multi_page_mixed(self) -> None: - """ - GIVEN: - - File with some text contained in images and some in text layer - - OCR mode set to skip - WHEN: - - Document is parsed - THEN: - - Text from images is extracted - - An archive file is created with the OCRd text and the original text - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-mixed.pdf"), - "application/pdf", - ) - self.assertIsNotNone(parser.archive_path) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3", "page 4", "page 5", "page 6"], - ) - - with (parser.tempdir / "sidecar.txt").open() as f: - sidecar = f.read() - - self.assertIn("[OCR skipped on page(s) 4-6]", sidecar) - - @override_settings(OCR_MODE="redo") - def test_single_page_mixed(self) -> None: - """ - GIVEN: - - File with some text contained in images and some in text layer - - Text and images are mixed on the same page - - OCR mode set to redo - WHEN: - - Document is parsed - THEN: - - Text from images is extracted - - Full content of the file is parsed (not just the image text) - - An archive file is created with the OCRd text and the original text - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "single-page-mixed.pdf"), - "application/pdf", - ) - self.assertIsNotNone(parser.archive_path) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - [ - "this is some normal text, present on page 1 of the document.", - "this is some text, but in an image, also on page 1.", - "this is further text on page 1.", - ], - ) - - with (parser.tempdir / "sidecar.txt").open() as f: - sidecar = f.read().lower() - - self.assertIn("this is some text, but in an image, also on page 1.", sidecar) - self.assertNotIn( - "this is some normal text, present on page 1 of the document.", - sidecar, - ) - - @override_settings(OCR_MODE="skip_noarchive") - def test_multi_page_mixed_no_archive(self) -> None: - """ - GIVEN: - - File with some text contained in images and some in text layer - - OCR mode set to skip_noarchive - WHEN: - - Document is parsed - THEN: - - Text from images is extracted - - No archive file is created as original file contains text - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-mixed.pdf"), - "application/pdf", - ) - self.assertIsNone(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 4", "page 5", "page 6"], - ) - - @override_settings(OCR_MODE="skip", OCR_ROTATE_PAGES=True) - def test_rotate(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse(str(self.SAMPLE_FILES / "rotated.pdf"), "application/pdf") - self.assertContainsStrings( - parser.get_text(), - [ - "This is the text that appears on the first page. It’s a lot of text.", - "Even if the pages are rotated, OCRmyPDF still gets the job done.", - "This is a really weird file with lots of nonsense text.", - "If you read this, it’s your own fault. Also check your screen orientation.", - ], - ) - - def test_multi_page_tiff(self) -> None: - """ - GIVEN: - - Multi-page TIFF image - WHEN: - - Image is parsed - THEN: - - Text from all pages extracted - """ - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "multi-page-images.tiff"), - "image/tiff", - ) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - def test_multi_page_tiff_alpha(self) -> None: - """ - GIVEN: - - Multi-page TIFF image - - Image include an alpha channel - WHEN: - - Image is parsed - THEN: - - Text from all pages extracted - """ - parser = RasterisedDocumentParser(None) - sample_file = self.SAMPLE_FILES / "multi-page-images-alpha.tiff" - with tempfile.NamedTemporaryFile() as tmp_file: - shutil.copy(sample_file, tmp_file.name) - parser.parse( - tmp_file.name, - "image/tiff", - ) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - def test_multi_page_tiff_alpha_srgb(self) -> None: - """ - GIVEN: - - Multi-page TIFF image - - Image include an alpha channel - - Image is srgb colorspace - WHEN: - - Image is parsed - THEN: - - Text from all pages extracted - """ - parser = RasterisedDocumentParser(None) - sample_file = str( - self.SAMPLE_FILES / "multi-page-images-alpha-rgb.tiff", - ) - with tempfile.NamedTemporaryFile() as tmp_file: - shutil.copy(sample_file, tmp_file.name) - parser.parse( - tmp_file.name, - "image/tiff", - ) - self.assertIsFile(parser.archive_path) - self.assertContainsStrings( - parser.get_text().lower(), - ["page 1", "page 2", "page 3"], - ) - - def test_ocrmypdf_parameters(self) -> None: - parser = RasterisedDocumentParser(None) - params = parser.construct_ocrmypdf_parameters( - input_file="input.pdf", - output_file="output.pdf", - sidecar_file="sidecar.txt", - mime_type="application/pdf", - safe_fallback=False, - ) - - self.assertEqual(params["input_file_or_options"], "input.pdf") - self.assertEqual(params["output_file"], "output.pdf") - self.assertEqual(params["sidecar"], "sidecar.txt") - - with override_settings(OCR_CLEAN="none"): - parser = RasterisedDocumentParser(None) - params = parser.construct_ocrmypdf_parameters("", "", "", "") - self.assertNotIn("clean", params) - self.assertNotIn("clean_final", params) - - with override_settings(OCR_CLEAN="clean"): - parser = RasterisedDocumentParser(None) - params = parser.construct_ocrmypdf_parameters("", "", "", "") - self.assertTrue(params["clean"]) - self.assertNotIn("clean_final", params) - - with override_settings(OCR_CLEAN="clean-final", OCR_MODE="skip"): - parser = RasterisedDocumentParser(None) - params = parser.construct_ocrmypdf_parameters("", "", "", "") - self.assertTrue(params["clean_final"]) - self.assertNotIn("clean", params) - - with override_settings(OCR_CLEAN="clean-final", OCR_MODE="redo"): - parser = RasterisedDocumentParser(None) - params = parser.construct_ocrmypdf_parameters("", "", "", "") - self.assertTrue(params["clean"]) - self.assertNotIn("clean_final", params) - - with override_settings(OCR_DESKEW=True, OCR_MODE="skip"): - parser = RasterisedDocumentParser(None) - params = parser.construct_ocrmypdf_parameters("", "", "", "") - self.assertTrue(params["deskew"]) - - with override_settings(OCR_DESKEW=True, OCR_MODE="redo"): - parser = RasterisedDocumentParser(None) - params = parser.construct_ocrmypdf_parameters("", "", "", "") - self.assertNotIn("deskew", params) - - with override_settings(OCR_DESKEW=False, OCR_MODE="skip"): - parser = RasterisedDocumentParser(None) - params = parser.construct_ocrmypdf_parameters("", "", "", "") - self.assertNotIn("deskew", params) - - with override_settings(OCR_MAX_IMAGE_PIXELS=1_000_001.0): - parser = RasterisedDocumentParser(None) - params = parser.construct_ocrmypdf_parameters("", "", "", "") - self.assertIn("max_image_mpixels", params) - self.assertAlmostEqual(params["max_image_mpixels"], 1, places=4) - - with override_settings(OCR_MAX_IMAGE_PIXELS=-1_000_001.0): - parser = RasterisedDocumentParser(None) - params = parser.construct_ocrmypdf_parameters("", "", "", "") - self.assertNotIn("max_image_mpixels", params) - - def test_rtl_language_detection(self) -> None: - """ - GIVEN: - - File with text in an RTL language - WHEN: - - Document is parsed - THEN: - - Text from the document is extracted - """ - parser = RasterisedDocumentParser(None) - - parser.parse( - str(self.SAMPLE_FILES / "rtl-test.pdf"), - "application/pdf", - ) - - # OCR output for RTL text varies across platforms/versions due to - # bidi controls and presentation forms; normalize before assertion. - normalized_text = "".join( - char - for char in unicodedata.normalize("NFKC", parser.get_text()) - if unicodedata.category(char) != "Cf" and not char.isspace() - ) - - self.assertIn("ةرازو", normalized_text) - self.assertTrue( - any(token in normalized_text for token in ("ةیلخادلا", "الاخليد")), - ) - - @mock.patch("ocrmypdf.ocr") - def test_gs_rendering_error(self, m) -> None: - m.side_effect = SubprocessOutputError("Ghostscript PDF/A rendering failed") - parser = RasterisedDocumentParser(None) - - self.assertRaises( - ParseError, - parser.parse, - str(self.SAMPLE_FILES / "simple-digital.pdf"), - "application/pdf", - ) - - -class TestParserFileTypes(DirectoriesMixin, FileSystemAssertsMixin, TestCase): - SAMPLE_FILES = Path(__file__).parent / "samples" - - def test_bmp(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse(str(self.SAMPLE_FILES / "simple.bmp"), "image/bmp") - self.assertIsFile(parser.archive_path) - self.assertIn("this is a test document", parser.get_text().lower()) - - def test_jpg(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse(str(self.SAMPLE_FILES / "simple.jpg"), "image/jpeg") - self.assertIsFile(parser.archive_path) - self.assertIn("this is a test document", parser.get_text().lower()) - - def test_heic(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse(str(self.SAMPLE_FILES / "simple.heic"), "image/heic") - self.assertIsFile(parser.archive_path) - self.assertIn("pizza", parser.get_text().lower()) - - @override_settings(OCR_IMAGE_DPI=200) - def test_gif(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse(str(self.SAMPLE_FILES / "simple.gif"), "image/gif") - self.assertIsFile(parser.archive_path) - self.assertIn("this is a test document", parser.get_text().lower()) - - def test_tiff(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse(str(self.SAMPLE_FILES / "simple.tif"), "image/tiff") - self.assertIsFile(parser.archive_path) - self.assertIn("this is a test document", parser.get_text().lower()) - - @override_settings(OCR_IMAGE_DPI=72) - def test_webp(self) -> None: - parser = RasterisedDocumentParser(None) - parser.parse( - str(self.SAMPLE_FILES / "document.webp"), - "image/webp", - ) - self.assertIsFile(parser.archive_path) - # Older tesseracts consistently mangle the space between "a webp", - # tesseract 5.3.0 seems to do a better job, so we're accepting both - self.assertRegex( - parser.get_text().lower(), - r"this is a ?webp document, created 11/14/2022.", - ) From 9e9fc6213c6374779fa8bc3025422fa5a129a14f Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 20 Mar 2026 15:39:15 -0700 Subject: [PATCH 053/113] Resolve GHSA-96jx-fj7m-qh6x --- src/documents/tests/test_api_search.py | 77 ++++++++++++++++++++++++++ src/documents/views.py | 12 +++- 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/documents/tests/test_api_search.py b/src/documents/tests/test_api_search.py index 191381721..d671fe546 100644 --- a/src/documents/tests/test_api_search.py +++ b/src/documents/tests/test_api_search.py @@ -1357,6 +1357,83 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): self.assertEqual(results["custom_fields"][0]["id"], custom_field1.id) self.assertEqual(results["workflows"][0]["id"], workflow1.id) + def test_global_search_filters_owned_mail_objects(self): + user1 = User.objects.create_user("mail-search-user") + user2 = User.objects.create_user("other-mail-search-user") + user1.user_permissions.add( + Permission.objects.get(codename="view_mailaccount"), + Permission.objects.get(codename="view_mailrule"), + ) + + own_account = MailAccount.objects.create( + name="bank owned account", + username="owner@example.com", + password="secret", + imap_server="imap.owner.example.com", + imap_port=993, + imap_security=MailAccount.ImapSecurity.SSL, + character_set="UTF-8", + owner=user1, + ) + other_account = MailAccount.objects.create( + name="bank other account", + username="other@example.com", + password="secret", + imap_server="imap.other.example.com", + imap_port=993, + imap_security=MailAccount.ImapSecurity.SSL, + character_set="UTF-8", + owner=user2, + ) + unowned_account = MailAccount.objects.create( + name="bank shared account", + username="shared@example.com", + password="secret", + imap_server="imap.shared.example.com", + imap_port=993, + imap_security=MailAccount.ImapSecurity.SSL, + character_set="UTF-8", + ) + own_rule = MailRule.objects.create( + name="bank owned rule", + account=own_account, + action=MailRule.MailAction.MOVE, + owner=user1, + ) + other_rule = MailRule.objects.create( + name="bank other rule", + account=other_account, + action=MailRule.MailAction.MOVE, + owner=user2, + ) + unowned_rule = MailRule.objects.create( + name="bank shared rule", + account=unowned_account, + action=MailRule.MailAction.MOVE, + ) + + self.client.force_authenticate(user1) + + response = self.client.get("/api/search/?query=bank") + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertCountEqual( + [account["id"] for account in response.data["mail_accounts"]], + [own_account.id, unowned_account.id], + ) + self.assertCountEqual( + [rule["id"] for rule in response.data["mail_rules"]], + [own_rule.id, unowned_rule.id], + ) + self.assertNotIn( + other_account.id, + [account["id"] for account in response.data["mail_accounts"]], + ) + self.assertNotIn( + other_rule.id, + [rule["id"] for rule in response.data["mail_rules"]], + ) + def test_global_search_bad_request(self): """ WHEN: diff --git a/src/documents/views.py b/src/documents/views.py index 6974ddc1c..e8a929859 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -2112,13 +2112,21 @@ class GlobalSearchView(PassUserMixin): ) groups = groups[:OBJECT_LIMIT] mail_rules = ( - MailRule.objects.filter(name__icontains=query) + get_objects_for_user_owner_aware( + request.user, + "view_mailrule", + MailRule, + ).filter(name__icontains=query) if request.user.has_perm("paperless_mail.view_mailrule") else [] ) mail_rules = mail_rules[:OBJECT_LIMIT] mail_accounts = ( - MailAccount.objects.filter(name__icontains=query) + get_objects_for_user_owner_aware( + request.user, + "view_mailaccount", + MailAccount, + ).filter(name__icontains=query) if request.user.has_perm("paperless_mail.view_mailaccount") else [] ) From 2cb155e71751b73e1eb856d8abfde998893e6d05 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 20 Mar 2026 15:47:37 -0700 Subject: [PATCH 054/113] Bump version to 2.20.12 --- pyproject.toml | 2 +- src-ui/package.json | 2 +- src-ui/src/environments/environment.prod.ts | 2 +- src/paperless/version.py | 2 +- uv.lock | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ae95894c8..c22d3545e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "paperless-ngx" -version = "2.20.11" +version = "2.20.12" description = "A community-supported supercharged document management system: scan, index and archive all your physical documents" readme = "README.md" requires-python = ">=3.10" diff --git a/src-ui/package.json b/src-ui/package.json index 33feeabb9..a578cbeef 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -1,6 +1,6 @@ { "name": "paperless-ngx-ui", - "version": "2.20.11", + "version": "2.20.12", "scripts": { "preinstall": "npx only-allow pnpm", "ng": "ng", diff --git a/src-ui/src/environments/environment.prod.ts b/src-ui/src/environments/environment.prod.ts index bafd0dfab..46fb6fdfe 100644 --- a/src-ui/src/environments/environment.prod.ts +++ b/src-ui/src/environments/environment.prod.ts @@ -6,7 +6,7 @@ export const environment = { apiVersion: '9', // match src/paperless/settings.py appTitle: 'Paperless-ngx', tag: 'prod', - version: '2.20.11', + version: '2.20.12', webSocketHost: window.location.host, webSocketProtocol: window.location.protocol == 'https:' ? 'wss:' : 'ws:', webSocketBaseUrl: base_url.pathname + 'ws/', diff --git a/src/paperless/version.py b/src/paperless/version.py index 9f9841618..16df09624 100644 --- a/src/paperless/version.py +++ b/src/paperless/version.py @@ -1,6 +1,6 @@ from typing import Final -__version__: Final[tuple[int, int, int]] = (2, 20, 11) +__version__: Final[tuple[int, int, int]] = (2, 20, 12) # Version string like X.Y.Z __full_version_str__: Final[str] = ".".join(map(str, __version__)) # Version string like X.Y diff --git a/uv.lock b/uv.lock index 3e2b7d5cb..8c15a6252 100644 --- a/uv.lock +++ b/uv.lock @@ -1991,7 +1991,7 @@ wheels = [ [[package]] name = "paperless-ngx" -version = "2.20.11" +version = "2.20.12" source = { virtual = "." } dependencies = [ { name = "babel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, From d2a752a19654d8e63ddeb0d640196b6ea815a2dc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 19:23:06 -0700 Subject: [PATCH 055/113] Documentation: Add v2.20.12 changelog (#12407) * Changelog v2.20.12 - GHA * Update changelog for version 2.20.12 Added security advisory for GHSA-96jx-fj7m-qh6x and fixed workflow saves and usermod/groupmod issues. --------- Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com> --- docs/changelog.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index ec2342060..e2b1b597c 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,32 @@ # Changelog +## paperless-ngx 2.20.12 + +### Security + +- Resolve [GHSA-96jx-fj7m-qh6x](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-96jx-fj7m-qh6x) + +### Bug Fixes + +- Fix: Scope the workflow saves to prevent clobbering filename/archive_filename [@stumpylog](https://github.com/stumpylog) ([#12390](https://github.com/paperless-ngx/paperless-ngx/pull/12390)) +- Fix: don't try to usermod/groupmod when non-root + update docs (#12365) [@stumpylog](https://github.com/stumpylog) ([#12391](https://github.com/paperless-ngx/paperless-ngx/pull/12391)) +- Fix: avoid moving files if already moved [@shamoon](https://github.com/shamoon) ([#12389](https://github.com/paperless-ngx/paperless-ngx/pull/12389)) +- Fix: remove pagination from document notes api spec [@shamoon](https://github.com/shamoon) ([#12388](https://github.com/paperless-ngx/paperless-ngx/pull/12388)) +- Fix: fix file button hover color in dark mode [@shamoon](https://github.com/shamoon) ([#12367](https://github.com/paperless-ngx/paperless-ngx/pull/12367)) +- Fixhancement: only offer basic auth for appropriate requests [@shamoon](https://github.com/shamoon) ([#12362](https://github.com/paperless-ngx/paperless-ngx/pull/12362)) + +### All App Changes + +
+5 changes + +- Fix: Scope the workflow saves to prevent clobbering filename/archive_filename [@stumpylog](https://github.com/stumpylog) ([#12390](https://github.com/paperless-ngx/paperless-ngx/pull/12390)) +- Fix: avoid moving files if already moved [@shamoon](https://github.com/shamoon) ([#12389](https://github.com/paperless-ngx/paperless-ngx/pull/12389)) +- Fix: remove pagination from document notes api spec [@shamoon](https://github.com/shamoon) ([#12388](https://github.com/paperless-ngx/paperless-ngx/pull/12388)) +- Fix: fix file button hover color in dark mode [@shamoon](https://github.com/shamoon) ([#12367](https://github.com/paperless-ngx/paperless-ngx/pull/12367)) +- Fixhancement: only offer basic auth for appropriate requests [@shamoon](https://github.com/shamoon) ([#12362](https://github.com/paperless-ngx/paperless-ngx/pull/12362)) +
+ ## paperless-ngx 2.20.11 ### Security From 7dbf8bdd4aff6ceb4eedd8a4aba7652978d1dc74 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 21 Mar 2026 00:44:28 -0700 Subject: [PATCH 056/113] Fix: enforce permissions when attaching accounts to mail rules --- src/paperless_mail/serialisers.py | 15 ++++ src/paperless_mail/tests/test_api.py | 108 +++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) diff --git a/src/paperless_mail/serialisers.py b/src/paperless_mail/serialisers.py index b38c8e78c..aff3e75da 100644 --- a/src/paperless_mail/serialisers.py +++ b/src/paperless_mail/serialisers.py @@ -1,5 +1,8 @@ +from django.utils.translation import gettext as _ from rest_framework import serializers +from rest_framework.exceptions import PermissionDenied +from documents.permissions import has_perms_owner_aware from documents.serialisers import CorrespondentField from documents.serialisers import DocumentTypeField from documents.serialisers import OwnedObjectSerializer @@ -127,6 +130,18 @@ class MailRuleSerializer(OwnedObjectSerializer): return attrs + def validate_account(self, account): + if self.user is not None and has_perms_owner_aware( + self.user, + "change_mailaccount", + account, + ): + return account + + raise PermissionDenied( + _("Insufficient permissions."), + ) + def validate_maximum_age(self, value): if value > 36500: # ~100 years raise serializers.ValidationError("Maximum mail age is unreasonably large.") diff --git a/src/paperless_mail/tests/test_api.py b/src/paperless_mail/tests/test_api.py index cbfe0f9a4..905509ec1 100644 --- a/src/paperless_mail/tests/test_api.py +++ b/src/paperless_mail/tests/test_api.py @@ -632,6 +632,114 @@ class TestAPIMailRules(DirectoriesMixin, APITestCase): self.assertEqual(returned_rule1.name, "Updated Name 1") self.assertEqual(returned_rule1.action, MailRule.MailAction.DELETE) + def test_create_mail_rule_forbidden_for_unpermitted_account(self): + other_user = User.objects.create_user(username="mail-owner") + foreign_account = MailAccount.objects.create( + name="ForeignEmail", + username="username1", + password="password1", + imap_server="server.example.com", + imap_port=443, + imap_security=MailAccount.ImapSecurity.SSL, + character_set="UTF-8", + owner=other_user, + ) + + response = self.client.post( + self.ENDPOINT, + data={ + "name": "Rule1", + "account": foreign_account.pk, + "folder": "INBOX", + "filter_from": "from@example.com", + "maximum_age": 30, + "action": MailRule.MailAction.MARK_READ, + "assign_title_from": MailRule.TitleSource.FROM_SUBJECT, + "assign_correspondent_from": MailRule.CorrespondentSource.FROM_NOTHING, + "order": 0, + "attachment_type": MailRule.AttachmentProcessing.ATTACHMENTS_ONLY, + }, + ) + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(MailRule.objects.count(), 0) + + def test_create_mail_rule_allowed_for_granted_account_change_permission(self): + other_user = User.objects.create_user(username="mail-owner") + foreign_account = MailAccount.objects.create( + name="ForeignEmail", + username="username1", + password="password1", + imap_server="server.example.com", + imap_port=443, + imap_security=MailAccount.ImapSecurity.SSL, + character_set="UTF-8", + owner=other_user, + ) + assign_perm("change_mailaccount", self.user, foreign_account) + + response = self.client.post( + self.ENDPOINT, + data={ + "name": "Rule1", + "account": foreign_account.pk, + "folder": "INBOX", + "filter_from": "from@example.com", + "maximum_age": 30, + "action": MailRule.MailAction.MARK_READ, + "assign_title_from": MailRule.TitleSource.FROM_SUBJECT, + "assign_correspondent_from": MailRule.CorrespondentSource.FROM_NOTHING, + "order": 0, + "attachment_type": MailRule.AttachmentProcessing.ATTACHMENTS_ONLY, + }, + ) + + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(MailRule.objects.get().account, foreign_account) + + def test_update_mail_rule_forbidden_for_unpermitted_account(self): + own_account = MailAccount.objects.create( + name="Email1", + username="username1", + password="password1", + imap_server="server.example.com", + imap_port=443, + imap_security=MailAccount.ImapSecurity.SSL, + character_set="UTF-8", + ) + other_user = User.objects.create_user(username="mail-owner") + foreign_account = MailAccount.objects.create( + name="ForeignEmail", + username="username2", + password="password2", + imap_server="server.example.com", + imap_port=443, + imap_security=MailAccount.ImapSecurity.SSL, + character_set="UTF-8", + owner=other_user, + ) + rule1 = MailRule.objects.create( + name="Rule1", + account=own_account, + folder="INBOX", + filter_from="from@example.com", + maximum_age=30, + action=MailRule.MailAction.MARK_READ, + assign_title_from=MailRule.TitleSource.FROM_SUBJECT, + assign_correspondent_from=MailRule.CorrespondentSource.FROM_NOTHING, + order=0, + attachment_type=MailRule.AttachmentProcessing.ATTACHMENTS_ONLY, + ) + + response = self.client.patch( + f"{self.ENDPOINT}{rule1.pk}/", + data={"account": foreign_account.pk}, + ) + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + rule1.refresh_from_db() + self.assertEqual(rule1.account, own_account) + def test_get_mail_rules_owner_aware(self): """ GIVEN: From f84e0097e5b3a5383c662759ae0a780f5d63d416 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 21 Mar 2026 00:55:36 -0700 Subject: [PATCH 057/113] Fix validate document link targets --- src/documents/serialisers.py | 43 +++++++-- src/documents/tests/test_api_bulk_edit.py | 44 +++++++++ src/documents/tests/test_api_custom_fields.py | 95 +++++++++++++++++++ 3 files changed, 176 insertions(+), 6 deletions(-) diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 647e0e8b5..ea8cc70b6 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -853,6 +853,25 @@ class ReadWriteSerializerMethodField(serializers.SerializerMethodField): return {self.field_name: data} +def validate_documentlink_targets(user, doc_ids): + if Document.objects.filter(id__in=doc_ids).count() != len(doc_ids): + raise serializers.ValidationError( + "Some documents in value don't exist or were specified twice.", + ) + + if user is None: + return + + target_documents = Document.objects.filter(id__in=doc_ids).select_related("owner") + if not all( + has_perms_owner_aware(user, "change_document", document) + for document in target_documents + ): + raise PermissionDenied( + _("Insufficient permissions."), + ) + + class CustomFieldInstanceSerializer(serializers.ModelSerializer): field = serializers.PrimaryKeyRelatedField(queryset=CustomField.objects.all()) value = ReadWriteSerializerMethodField(allow_null=True) @@ -943,12 +962,11 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer): "Value must be a list", ) doc_ids = data["value"] - if Document.objects.filter(id__in=doc_ids).count() != len( - data["value"], - ): - raise serializers.ValidationError( - "Some documents in value don't exist or were specified twice.", - ) + request = self.context.get("request") + validate_documentlink_targets( + getattr(request, "user", None) if request is not None else None, + doc_ids, + ) return data @@ -1498,6 +1516,19 @@ class BulkEditSerializer( f"Some custom fields in {name} don't exist or were specified twice.", ) + if isinstance(custom_fields, dict): + custom_field_map = CustomField.objects.in_bulk(ids) + for raw_field_id, value in custom_fields.items(): + field = custom_field_map.get(int(raw_field_id)) + if ( + field is not None + and field.data_type == CustomField.FieldDataType.DOCUMENTLINK + and value is not None + ): + if not isinstance(value, list): + raise serializers.ValidationError("Value must be a list") + validate_documentlink_targets(self.user, value) + def validate_method(self, method): if method == "set_correspondent": return bulk_edit.set_correspondent diff --git a/src/documents/tests/test_api_bulk_edit.py b/src/documents/tests/test_api_bulk_edit.py index be7a81cd4..8400372a7 100644 --- a/src/documents/tests/test_api_bulk_edit.py +++ b/src/documents/tests/test_api_bulk_edit.py @@ -262,6 +262,50 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase): self.assertEqual(kwargs["add_custom_fields"], [self.cf1.id]) self.assertEqual(kwargs["remove_custom_fields"], [self.cf2.id]) + @mock.patch("documents.serialisers.bulk_edit.modify_custom_fields") + def test_api_modify_custom_fields_documentlink_forbidden_for_unpermitted_target( + self, + m, + ): + self.setup_mock(m, "modify_custom_fields") + user = User.objects.create_user(username="doc-owner") + user.user_permissions.add(Permission.objects.get(codename="change_document")) + other_user = User.objects.create_user(username="other-user") + source_doc = Document.objects.create( + checksum="source", + title="Source", + owner=user, + ) + target_doc = Document.objects.create( + checksum="target", + title="Target", + owner=other_user, + ) + doclink_field = CustomField.objects.create( + name="doclink", + data_type=CustomField.FieldDataType.DOCUMENTLINK, + ) + + self.client.force_authenticate(user=user) + + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [source_doc.id], + "method": "modify_custom_fields", + "parameters": { + "add_custom_fields": {doclink_field.id: [target_doc.id]}, + "remove_custom_fields": [], + }, + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + m.assert_not_called() + @mock.patch("documents.serialisers.bulk_edit.modify_custom_fields") def test_api_modify_custom_fields_with_values(self, m): self.setup_mock(m, "modify_custom_fields") diff --git a/src/documents/tests/test_api_custom_fields.py b/src/documents/tests/test_api_custom_fields.py index 8cc8f2cb2..998bc445a 100644 --- a/src/documents/tests/test_api_custom_fields.py +++ b/src/documents/tests/test_api_custom_fields.py @@ -6,6 +6,7 @@ from unittest.mock import ANY from django.contrib.auth.models import Permission from django.contrib.auth.models import User from django.test import override_settings +from guardian.shortcuts import assign_perm from rest_framework import status from rest_framework.test import APITestCase @@ -1247,6 +1248,100 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): self.assertEqual(resp.status_code, status.HTTP_200_OK) self.assertEqual(doc5.custom_fields.first().value, [1]) + def test_documentlink_patch_requires_change_permission_on_target_documents(self): + source_owner = User.objects.create_user(username="source-owner") + source_owner.user_permissions.add( + Permission.objects.get(codename="change_document"), + ) + other_user = User.objects.create_user(username="other-user") + + source_doc = Document.objects.create( + title="Source", + checksum="source", + mime_type="application/pdf", + owner=source_owner, + ) + target_doc = Document.objects.create( + title="Target", + checksum="target", + mime_type="application/pdf", + owner=other_user, + ) + custom_field_doclink = CustomField.objects.create( + name="Test Custom Field Doc Link", + data_type=CustomField.FieldDataType.DOCUMENTLINK, + ) + + self.client.force_authenticate(user=source_owner) + + resp = self.client.patch( + f"/api/documents/{source_doc.id}/", + data={ + "custom_fields": [ + { + "field": custom_field_doclink.id, + "value": [target_doc.id], + }, + ], + }, + format="json", + ) + + self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual( + CustomFieldInstance.objects.filter(field=custom_field_doclink).count(), + 0, + ) + + def test_documentlink_patch_allowed_with_change_permission_on_target_documents( + self, + ): + source_owner = User.objects.create_user(username="source-owner") + source_owner.user_permissions.add( + Permission.objects.get(codename="change_document"), + ) + other_user = User.objects.create_user(username="other-user") + + source_doc = Document.objects.create( + title="Source", + checksum="source", + mime_type="application/pdf", + owner=source_owner, + ) + target_doc = Document.objects.create( + title="Target", + checksum="target", + mime_type="application/pdf", + owner=other_user, + ) + custom_field_doclink = CustomField.objects.create( + name="Test Custom Field Doc Link", + data_type=CustomField.FieldDataType.DOCUMENTLINK, + ) + + assign_perm("change_document", source_owner, target_doc) + self.client.force_authenticate(user=source_owner) + + resp = self.client.patch( + f"/api/documents/{source_doc.id}/", + data={ + "custom_fields": [ + { + "field": custom_field_doclink.id, + "value": [target_doc.id], + }, + ], + }, + format="json", + ) + + self.assertEqual(resp.status_code, status.HTTP_200_OK) + target_doc.refresh_from_db() + self.assertEqual( + target_doc.custom_fields.get(field=custom_field_doclink).value, + [source_doc.id], + ) + def test_custom_field_filters(self): custom_field_string = CustomField.objects.create( name="Test Custom Field String", From 3cbdf5d0b7a4aa59aa00cdba274f7734e43a02f7 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 21 Mar 2026 01:20:59 -0700 Subject: [PATCH 058/113] Fix: require view permission for more-like search --- src/documents/tests/test_api_search.py | 52 ++++++++++++++++++++++++++ src/documents/views.py | 25 ++++++++++++- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/documents/tests/test_api_search.py b/src/documents/tests/test_api_search.py index d671fe546..79fae018a 100644 --- a/src/documents/tests/test_api_search.py +++ b/src/documents/tests/test_api_search.py @@ -772,6 +772,58 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): self.assertEqual(results[0]["id"], d3.id) self.assertEqual(results[1]["id"], d1.id) + def test_search_more_like_requires_view_permission_on_seed_document(self): + """ + GIVEN: + - A user can search documents they own + - Another user's private document exists with similar content + WHEN: + - The user requests more-like-this for the private seed document + THEN: + - The request is rejected + """ + owner = User.objects.create_user("owner") + attacker = User.objects.create_user("attacker") + attacker.user_permissions.add( + Permission.objects.get(codename="view_document"), + ) + + private_seed = Document.objects.create( + title="private bank statement", + content="quarterly treasury bank statement wire transfer", + checksum="seed", + owner=owner, + pk=10, + ) + visible_doc = Document.objects.create( + title="attacker-visible match", + content="quarterly treasury bank statement wire transfer summary", + checksum="visible", + owner=attacker, + pk=11, + ) + other_doc = Document.objects.create( + title="unrelated", + content="completely different topic", + checksum="other", + owner=attacker, + pk=12, + ) + + with AsyncWriter(index.open_index()) as writer: + index.update_document(writer, private_seed) + index.update_document(writer, visible_doc) + index.update_document(writer, other_doc) + + self.client.force_authenticate(user=attacker) + + response = self.client.get( + f"/api/documents/?more_like_id={private_seed.id}", + ) + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(response.content, b"Insufficient permissions.") + def test_search_filtering(self): t = Tag.objects.create(name="tag") t2 = Tag.objects.create(name="tag2") diff --git a/src/documents/views.py b/src/documents/views.py index e8a929859..5985c17a8 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -49,6 +49,7 @@ from django.utils import timezone from django.utils.decorators import method_decorator from django.utils.timezone import make_aware from django.utils.translation import get_language +from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.decorators.cache import cache_control from django.views.decorators.http import condition @@ -70,6 +71,7 @@ from rest_framework import parsers from rest_framework import serializers from rest_framework.decorators import action from rest_framework.exceptions import NotFound +from rest_framework.exceptions import PermissionDenied from rest_framework.exceptions import ValidationError from rest_framework.filters import OrderingFilter from rest_framework.filters import SearchFilter @@ -1369,11 +1371,28 @@ class UnifiedSearchViewSet(DocumentViewSet): filtered_queryset = super().filter_queryset(queryset) if self._is_search_request(): - from documents import index - if "query" in self.request.query_params: + from documents import index + query_class = index.DelayedFullTextQuery elif "more_like_id" in self.request.query_params: + try: + more_like_doc_id = int(self.request.query_params["more_like_id"]) + more_like_doc = Document.objects.select_related("owner").get( + pk=more_like_doc_id, + ) + except (TypeError, ValueError, Document.DoesNotExist): + raise PermissionDenied(_("Invalid more_like_id")) + + if not has_perms_owner_aware( + self.request.user, + "view_document", + more_like_doc, + ): + raise PermissionDenied(_("Insufficient permissions.")) + + from documents import index + query_class = index.DelayedMoreLikeThisQuery else: raise ValueError @@ -1409,6 +1428,8 @@ class UnifiedSearchViewSet(DocumentViewSet): return response except NotFound: raise + except PermissionDenied as e: + return HttpResponseForbidden(str(e.detail)) except Exception as e: logger.warning(f"An error occurred listing search results: {e!s}") return HttpResponseBadRequest( From cc71aad058bded68f5cbe31b4be379f1644c4f2c Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 21 Mar 2026 01:24:23 -0700 Subject: [PATCH 059/113] Fix: suggest corrections only if visible results --- src/documents/index.py | 9 ++++++- src/documents/tests/test_api_search.py | 34 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/documents/index.py b/src/documents/index.py index 8afc31fe9..f6e0821db 100644 --- a/src/documents/index.py +++ b/src/documents/index.py @@ -470,7 +470,14 @@ class DelayedFullTextQuery(DelayedQuery): try: corrected = self.searcher.correct_query(q, q_str) if corrected.string != q_str: - suggested_correction = corrected.string + corrected_results = self.searcher.search( + corrected.query, + limit=1, + filter=MappedDocIdSet(self.filter_queryset, self.searcher.ixreader), + scored=False, + ) + if len(corrected_results) > 0: + suggested_correction = corrected.string except Exception as e: logger.info( "Error while correcting query %s: %s", diff --git a/src/documents/tests/test_api_search.py b/src/documents/tests/test_api_search.py index 79fae018a..190e0c431 100644 --- a/src/documents/tests/test_api_search.py +++ b/src/documents/tests/test_api_search.py @@ -702,6 +702,40 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): self.assertEqual(correction, None) + def test_search_spelling_suggestion_suppressed_for_private_terms(self): + owner = User.objects.create_user("owner") + attacker = User.objects.create_user("attacker") + attacker.user_permissions.add( + Permission.objects.get(codename="view_document"), + ) + + with AsyncWriter(index.open_index()) as writer: + for i in range(55): + private_doc = Document.objects.create( + checksum=f"p{i}", + pk=100 + i, + title=f"Private Document {i + 1}", + content=f"treasury document {i + 1}", + owner=owner, + ) + visible_doc = Document.objects.create( + checksum=f"v{i}", + pk=200 + i, + title=f"Visible Document {i + 1}", + content=f"public ledger {i + 1}", + owner=attacker, + ) + index.update_document(writer, private_doc) + index.update_document(writer, visible_doc) + + self.client.force_authenticate(user=attacker) + + response = self.client.get("/api/documents/?query=treasurx") + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 0) + self.assertIsNone(response.data["corrected_query"]) + @mock.patch( "whoosh.searching.Searcher.correct_query", side_effect=Exception("Test error"), From 9646b8c67d119dcd4e2f67bb70ad0870febfd976 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 21 Mar 2026 01:50:04 -0700 Subject: [PATCH 060/113] Bump version to 2.20.13 --- pyproject.toml | 2 +- src-ui/package.json | 2 +- src-ui/src/environments/environment.prod.ts | 2 +- src/paperless/version.py | 2 +- uv.lock | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c22d3545e..cc9e1a3cc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "paperless-ngx" -version = "2.20.12" +version = "2.20.13" description = "A community-supported supercharged document management system: scan, index and archive all your physical documents" readme = "README.md" requires-python = ">=3.10" diff --git a/src-ui/package.json b/src-ui/package.json index a578cbeef..6c5ff8295 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -1,6 +1,6 @@ { "name": "paperless-ngx-ui", - "version": "2.20.12", + "version": "2.20.13", "scripts": { "preinstall": "npx only-allow pnpm", "ng": "ng", diff --git a/src-ui/src/environments/environment.prod.ts b/src-ui/src/environments/environment.prod.ts index 46fb6fdfe..ff10ca3f2 100644 --- a/src-ui/src/environments/environment.prod.ts +++ b/src-ui/src/environments/environment.prod.ts @@ -6,7 +6,7 @@ export const environment = { apiVersion: '9', // match src/paperless/settings.py appTitle: 'Paperless-ngx', tag: 'prod', - version: '2.20.12', + version: '2.20.13', webSocketHost: window.location.host, webSocketProtocol: window.location.protocol == 'https:' ? 'wss:' : 'ws:', webSocketBaseUrl: base_url.pathname + 'ws/', diff --git a/src/paperless/version.py b/src/paperless/version.py index 16df09624..b0b675c87 100644 --- a/src/paperless/version.py +++ b/src/paperless/version.py @@ -1,6 +1,6 @@ from typing import Final -__version__: Final[tuple[int, int, int]] = (2, 20, 12) +__version__: Final[tuple[int, int, int]] = (2, 20, 13) # Version string like X.Y.Z __full_version_str__: Final[str] = ".".join(map(str, __version__)) # Version string like X.Y diff --git a/uv.lock b/uv.lock index 8c15a6252..9702c6dfc 100644 --- a/uv.lock +++ b/uv.lock @@ -1991,7 +1991,7 @@ wheels = [ [[package]] name = "paperless-ngx" -version = "2.20.12" +version = "2.20.13" source = { virtual = "." } dependencies = [ { name = "babel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, From 07f54bfdab96b8747c5258619877b9f75e07ed83 Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 21 Mar 2026 09:26:23 +0000 Subject: [PATCH 061/113] Auto translate strings --- src-ui/messages.xlf | 6 ++--- src/locale/en_US/LC_MESSAGES/django.po | 34 +++++++++++++++----------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index d2e12880f..410f39a96 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -7482,7 +7482,7 @@
src/main.ts - 411 + 416
@@ -11352,14 +11352,14 @@ Prev src/main.ts - 410 + 415 End src/main.ts - 412 + 417 diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index f2f8a3ef7..de3e70775 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-17 22:44+0000\n" +"POT-Creation-Date: 2026-03-21 09:25+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -1299,7 +1299,9 @@ msgstr "" msgid "workflow runs" msgstr "" -#: documents/serialisers.py:463 documents/serialisers.py:2470 +#: documents/serialisers.py:463 documents/serialisers.py:815 +#: documents/serialisers.py:2501 documents/views.py:1992 +#: paperless_mail/serialisers.py:143 msgid "Insufficient permissions." msgstr "" @@ -1307,39 +1309,39 @@ msgstr "" msgid "Invalid color." msgstr "" -#: documents/serialisers.py:2093 +#: documents/serialisers.py:2124 #, python-format msgid "File type %(type)s not supported" msgstr "" -#: documents/serialisers.py:2137 +#: documents/serialisers.py:2168 #, python-format msgid "Custom field id must be an integer: %(id)s" msgstr "" -#: documents/serialisers.py:2144 +#: documents/serialisers.py:2175 #, python-format msgid "Custom field with id %(id)s does not exist" msgstr "" -#: documents/serialisers.py:2161 documents/serialisers.py:2171 +#: documents/serialisers.py:2192 documents/serialisers.py:2202 msgid "" "Custom fields must be a list of integers or an object mapping ids to values." msgstr "" -#: documents/serialisers.py:2166 +#: documents/serialisers.py:2197 msgid "Some custom fields don't exist or were specified twice." msgstr "" -#: documents/serialisers.py:2313 +#: documents/serialisers.py:2344 msgid "Invalid variable detected." msgstr "" -#: documents/serialisers.py:2526 +#: documents/serialisers.py:2557 msgid "Duplicate document identifiers are not allowed." msgstr "" -#: documents/serialisers.py:2556 documents/views.py:3569 +#: documents/serialisers.py:2587 documents/views.py:3598 #, python-format msgid "Documents not found: %(ids)s" msgstr "" @@ -1603,20 +1605,24 @@ msgstr "" msgid "Unable to parse URI {value}" msgstr "" -#: documents/views.py:3581 +#: documents/views.py:1985 +msgid "Invalid more_like_id" +msgstr "" + +#: documents/views.py:3610 #, python-format msgid "Insufficient permissions to share document %(id)s." msgstr "" -#: documents/views.py:3624 +#: documents/views.py:3653 msgid "Bundle is already being processed." msgstr "" -#: documents/views.py:3681 +#: documents/views.py:3710 msgid "The share link bundle is still being prepared. Please try again later." msgstr "" -#: documents/views.py:3691 +#: documents/views.py:3720 msgid "The share link bundle is unavailable." msgstr "" From 701735f6e55de83bba01d7eb112aa482c092ef2f Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Sun, 22 Mar 2026 06:53:32 -0700 Subject: [PATCH 062/113] Chore: Drop old signal and unneeded apps, transition to parser registry instead (#12405) * refactor: switch consumer and callers to ParserRegistry (Phase 4) Replace all Django signal-based parser discovery with direct registry calls. Removes `_parser_cleanup`, `parser_is_new_style` shims, and all old-style isinstance checks. All parser instantiation now uses the `with parser_class() as parser:` context manager pattern. - documents/parsers.py: delegate to get_parser_registry(); drop lru_cache - documents/consumer.py: use registry + context manager; remove shims - documents/tasks.py: same pattern - documents/management/commands/document_thumbnails.py: same pattern - documents/views.py: get_metadata uses context manager - documents/checks.py: use get_parser_registry().all_parsers() - paperless/parsers/registry.py: add all_parsers() public method - tests: update mocks to target documents.consumer.get_parser_class_for_mime_type Co-Authored-By: Claude Sonnet 4.6 * refactor: drop get_parser_class_for_mime_type; callers use registry directly All callers now call get_parser_registry().get_parser_for_file() with the actual filename and path, enabling score() to use file extension hints. The MIME-only helper is removed. - consumer.py: passes self.filename + self.working_copy - tasks.py: passes document.original_filename + document.source_path - document_thumbnails.py: same pattern - views.py: passes Path(file).name + Path(file) - parsers.py: internal helpers inline the registry call with filename="" - test_parsers.py: drop TestParserDiscovery (was testing mock behavior); TestParserAvailability uses registry directly - test_consumer.py: mocks switch to documents.consumer.get_parser_registry Co-Authored-By: Claude Sonnet 4.6 * refactor: remove document_consumer_declaration signal infrastructure Remove the document_consumer_declaration signal that was previously used for parser registration. Each parser app no longer connects to this signal, and the signal declaration itself has been removed from documents/signals. Changes: - Remove document_consumer_declaration from documents/signals/__init__.py - Remove ready() methods and signal imports from all parser app configs - Delete signal shim files (signals.py) from all parser apps: - paperless_tesseract/signals.py - paperless_text/signals.py - paperless_tika/signals.py - paperless_mail/signals.py - paperless_remote/signals.py Parser discovery now happens exclusively through the ParserRegistry system introduced in the previous refactor phases. Co-Authored-By: Claude Sonnet 4.6 * refactor: remove empty paperless_text and paperless_tika Django apps After parser classes were moved to paperless/parsers/ in the plugin refactor, these Django apps contained only empty AppConfig classes with no models, views, tasks, migrations, or other functionality. - Remove paperless_text and paperless_tika from INSTALLED_APPS - Delete empty app directories entirely - Update pyproject.toml test exclusions - Clean stale mypy baseline entries for moved parser files paperless_remote app is retained as it contains meaningful system checks for Azure AI configuration. Co-Authored-By: Claude Sonnet 4.6 * Moves the checks and tests to the main application and removes the old applications * Adds a comment to satisy Sonar * refactor: remove automatic log_summary() call from get_parser_registry() The summary was logged once per process, causing it to appear repeatedly during Docker startup (management commands, web server, each Celery worker subprocess). External parsers are already announced individually at INFO when discovered; the full summary is redundant noise. log_summary() is retained on ParserRegistry for manual/debug use. Co-Authored-By: Claude Sonnet 4.6 * Cleans up the duplicate test file/fixture * Fixes a race condition where webserver threads could race to populate the registry --------- Co-authored-by: Claude Sonnet 4.6 --- .mypy-baseline.txt | 14 - pyproject.toml | 4 - src/documents/checks.py | 11 +- src/documents/consumer.py | 532 ++++++++---------- .../commands/document_thumbnails.py | 48 +- src/documents/parsers.py | 86 +-- src/documents/signals/__init__.py | 1 - src/documents/tasks.py | 210 +++---- src/documents/tests/test_checks.py | 6 +- src/documents/tests/test_consumer.py | 221 ++++---- src/documents/tests/test_parsers.py | 149 +---- src/documents/views.py | 16 +- src/paperless/checks.py | 60 ++ src/paperless/parsers/registry.py | 45 +- src/paperless/settings/__init__.py | 7 +- src/paperless/tests/parsers/conftest.py | 29 - .../tests/parsers/test_remote_parser.py | 58 +- .../tests/parsers/test_tika_parser.py | 6 +- .../tests/samples/remote/simple-digital.pdf | Bin 22926 -> 0 bytes src/paperless/tests/test_checks.py | 116 ++++ src/paperless_mail/apps.py | 10 - src/paperless_mail/signals.py | 19 - src/paperless_remote/__init__.py | 4 - src/paperless_remote/apps.py | 14 - src/paperless_remote/checks.py | 17 - src/paperless_remote/signals.py | 38 -- src/paperless_remote/tests/__init__.py | 0 src/paperless_remote/tests/test_checks.py | 24 - src/paperless_tesseract/__init__.py | 5 - src/paperless_tesseract/apps.py | 14 - src/paperless_tesseract/checks.py | 52 -- src/paperless_tesseract/signals.py | 34 -- src/paperless_tesseract/tests/__init__.py | 0 src/paperless_tesseract/tests/test_checks.py | 67 --- src/paperless_text/__init__.py | 0 src/paperless_text/apps.py | 14 - src/paperless_text/signals.py | 29 - src/paperless_text/tests/__init__.py | 0 src/paperless_tika/__init__.py | 0 src/paperless_tika/apps.py | 15 - src/paperless_tika/signals.py | 33 -- 41 files changed, 713 insertions(+), 1295 deletions(-) delete mode 100644 src/paperless/tests/samples/remote/simple-digital.pdf delete mode 100644 src/paperless_mail/signals.py delete mode 100644 src/paperless_remote/__init__.py delete mode 100644 src/paperless_remote/apps.py delete mode 100644 src/paperless_remote/checks.py delete mode 100644 src/paperless_remote/signals.py delete mode 100644 src/paperless_remote/tests/__init__.py delete mode 100644 src/paperless_remote/tests/test_checks.py delete mode 100644 src/paperless_tesseract/__init__.py delete mode 100644 src/paperless_tesseract/apps.py delete mode 100644 src/paperless_tesseract/checks.py delete mode 100644 src/paperless_tesseract/signals.py delete mode 100644 src/paperless_tesseract/tests/__init__.py delete mode 100644 src/paperless_tesseract/tests/test_checks.py delete mode 100644 src/paperless_text/__init__.py delete mode 100644 src/paperless_text/apps.py delete mode 100644 src/paperless_text/signals.py delete mode 100644 src/paperless_text/tests/__init__.py delete mode 100644 src/paperless_tika/__init__.py delete mode 100644 src/paperless_tika/apps.py delete mode 100644 src/paperless_tika/signals.py diff --git a/.mypy-baseline.txt b/.mypy-baseline.txt index 2700bfc71..61ffe9c10 100644 --- a/.mypy-baseline.txt +++ b/.mypy-baseline.txt @@ -2437,17 +2437,3 @@ src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "Non src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "unpaper_clean" [union-attr] src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "unpaper_clean" [union-attr] src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "user_args" [union-attr] -src/paperless_text/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] -src/paperless_text/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] -src/paperless_text/parsers.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "None") [assignment] -src/paperless_text/signals.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_text/signals.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_tika/parsers.py:0: error: Argument 1 to "make_thumbnail_from_pdf" has incompatible type "None"; expected "Path" [arg-type] -src/paperless_tika/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] -src/paperless_tika/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_tika/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_tika/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] -src/paperless_tika/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] -src/paperless_tika/parsers.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "None") [assignment] -src/paperless_tika/signals.py:0: error: Function is missing a type annotation [no-untyped-def] -src/paperless_tika/signals.py:0: error: Function is missing a type annotation [no-untyped-def] diff --git a/pyproject.toml b/pyproject.toml index f2a20ac47..ee89ae4dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -269,10 +269,6 @@ testpaths = [ "src/documents/tests/", "src/paperless/tests/", "src/paperless_mail/tests/", - "src/paperless_tesseract/tests/", - "src/paperless_tika/tests", - "src/paperless_text/tests/", - "src/paperless_remote/tests/", "src/paperless_ai/tests", ] diff --git a/src/documents/checks.py b/src/documents/checks.py index b6e9e90fc..0867ef403 100644 --- a/src/documents/checks.py +++ b/src/documents/checks.py @@ -3,25 +3,20 @@ from django.core.checks import Error from django.core.checks import Warning from django.core.checks import register -from documents.signals import document_consumer_declaration from documents.templating.utils import convert_format_str_to_template_format +from paperless.parsers.registry import get_parser_registry @register() def parser_check(app_configs, **kwargs): - parsers = [] - for response in document_consumer_declaration.send(None): - parsers.append(response[1]) - - if len(parsers) == 0: + if not get_parser_registry().all_parsers(): return [ Error( "No parsers found. This is a bug. The consumer won't be " "able to consume any documents without parsers.", ), ] - else: - return [] + return [] @register() diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 81d9eb456..809d6c647 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -32,9 +32,7 @@ from documents.models import DocumentType from documents.models import StoragePath from documents.models import Tag from documents.models import WorkflowTrigger -from documents.parsers import DocumentParser from documents.parsers import ParseError -from documents.parsers import get_parser_class_for_mime_type from documents.permissions import set_permissions_for_object from documents.plugins.base import AlwaysRunPluginMixin from documents.plugins.base import ConsumeTaskPlugin @@ -52,40 +50,12 @@ from documents.utils import copy_basic_file_stats from documents.utils import copy_file_with_basic_stats from documents.utils import run_subprocess from paperless.parsers import ParserContext -from paperless.parsers.mail import MailDocumentParser -from paperless.parsers.remote import RemoteDocumentParser -from paperless.parsers.tesseract import RasterisedDocumentParser -from paperless.parsers.text import TextDocumentParser -from paperless.parsers.tika import TikaDocumentParser +from paperless.parsers import ParserProtocol +from paperless.parsers.registry import get_parser_registry LOGGING_NAME: Final[str] = "paperless.consumer" -def _parser_cleanup(parser: DocumentParser) -> None: - """ - Call cleanup on a parser, handling the new-style context-manager parsers. - - New-style parsers (e.g. TextDocumentParser) use __exit__ for teardown - instead of a cleanup() method. This shim will be removed once all existing parsers - have switched to the new style and this consumer is updated to use it - - TODO(stumpylog): Remove me in the future - """ - if isinstance( - parser, - ( - MailDocumentParser, - RasterisedDocumentParser, - RemoteDocumentParser, - TextDocumentParser, - TikaDocumentParser, - ), - ): - parser.__exit__(None, None, None) - else: - parser.cleanup() - - class WorkflowTriggerPlugin( NoCleanupPluginMixin, NoSetupPluginMixin, @@ -422,8 +392,12 @@ class ConsumerPlugin( self.log.error(f"Error attempting to clean PDF: {e}") # Based on the mime type, get the parser for that type - parser_class: type[DocumentParser] | None = get_parser_class_for_mime_type( - mime_type, + parser_class: type[ParserProtocol] | None = ( + get_parser_registry().get_parser_for_file( + mime_type, + self.filename, + self.working_copy, + ) ) if not parser_class: tempdir.cleanup() @@ -446,313 +420,275 @@ class ConsumerPlugin( tempdir.cleanup() raise - def progress_callback( - current_progress, - max_progress, - ) -> None: # pragma: no cover - # recalculate progress to be within 20 and 80 - p = int((current_progress / max_progress) * 50 + 20) - self._send_progress(p, 100, ProgressStatusOptions.WORKING) - # This doesn't parse the document yet, but gives us a parser. - - document_parser: DocumentParser = parser_class( - self.logging_group, - progress_callback=progress_callback, - ) - - parser_is_new_style = isinstance( - document_parser, - ( - MailDocumentParser, - RasterisedDocumentParser, - RemoteDocumentParser, - TextDocumentParser, - TikaDocumentParser, - ), - ) - - # New-style parsers use __enter__/__exit__ for resource management. - # _parser_cleanup (below) handles __exit__; call __enter__ here. - # TODO(stumpylog): Remove me in the future - if parser_is_new_style: - document_parser.__enter__() - - self.log.debug(f"Parser: {type(document_parser).__name__}") - - # Parse the document. This may take some time. - - text = None - date = None - thumbnail = None - archive_path = None - page_count = None - - try: - self._send_progress( - 20, - 100, - ProgressStatusOptions.WORKING, - ConsumerStatusShortMessage.PARSING_DOCUMENT, + with parser_class() as document_parser: + document_parser.configure( + ParserContext(mailrule_id=self.input_doc.mailrule_id), ) - self.log.debug(f"Parsing {self.filename}...") - # TODO(stumpylog): Remove me in the future when all parsers use new protocol - if parser_is_new_style: - document_parser.configure( - ParserContext(mailrule_id=self.input_doc.mailrule_id), - ) - # TODO(stumpylog): Remove me in the future - document_parser.parse(self.working_copy, mime_type) - else: - document_parser.parse(self.working_copy, mime_type, self.filename) + self.log.debug(f"Parser: {document_parser.name} v{document_parser.version}") - self.log.debug(f"Generating thumbnail for {self.filename}...") - self._send_progress( - 70, - 100, - ProgressStatusOptions.WORKING, - ConsumerStatusShortMessage.GENERATING_THUMBNAIL, - ) - # TODO(stumpylog): Remove me in the future when all parsers use new protocol - if parser_is_new_style: - thumbnail = document_parser.get_thumbnail(self.working_copy, mime_type) - else: - thumbnail = document_parser.get_thumbnail( - self.working_copy, - mime_type, - self.filename, - ) + # Parse the document. This may take some time. - text = document_parser.get_text() - date = document_parser.get_date() - if date is None: + text = None + date = None + thumbnail = None + archive_path = None + page_count = None + + try: self._send_progress( - 90, + 20, 100, ProgressStatusOptions.WORKING, - ConsumerStatusShortMessage.PARSE_DATE, + ConsumerStatusShortMessage.PARSING_DOCUMENT, ) - with get_date_parser() as date_parser: - date = next(date_parser.parse(self.filename, text), None) - archive_path = document_parser.get_archive_path() - page_count = document_parser.get_page_count(self.working_copy, mime_type) + self.log.debug(f"Parsing {self.filename}...") - except ParseError as e: - _parser_cleanup(document_parser) - if tempdir: - tempdir.cleanup() - self._fail( - str(e), - f"Error occurred while consuming document {self.filename}: {e}", - exc_info=True, - exception=e, - ) - except Exception as e: - _parser_cleanup(document_parser) - if tempdir: - tempdir.cleanup() - self._fail( - str(e), - f"Unexpected error while consuming document {self.filename}: {e}", - exc_info=True, - exception=e, - ) + document_parser.parse(self.working_copy, mime_type) - # Prepare the document classifier. + self.log.debug(f"Generating thumbnail for {self.filename}...") + self._send_progress( + 70, + 100, + ProgressStatusOptions.WORKING, + ConsumerStatusShortMessage.GENERATING_THUMBNAIL, + ) + thumbnail = document_parser.get_thumbnail(self.working_copy, mime_type) - # TODO: I don't really like to do this here, but this way we avoid - # reloading the classifier multiple times, since there are multiple - # post-consume hooks that all require the classifier. - - classifier = load_classifier() - - self._send_progress( - 95, - 100, - ProgressStatusOptions.WORKING, - ConsumerStatusShortMessage.SAVE_DOCUMENT, - ) - # now that everything is done, we can start to store the document - # in the system. This will be a transaction and reasonably fast. - try: - with transaction.atomic(): - # store the document. - if self.input_doc.root_document_id: - # If this is a new version of an existing document, we need - # to make sure we're not creating a new document, but updating - # the existing one. - root_doc = Document.objects.get( - pk=self.input_doc.root_document_id, + text = document_parser.get_text() + date = document_parser.get_date() + if date is None: + self._send_progress( + 90, + 100, + ProgressStatusOptions.WORKING, + ConsumerStatusShortMessage.PARSE_DATE, ) - original_document = self._create_version_from_root( - root_doc, - text=text, - page_count=page_count, - mime_type=mime_type, - ) - actor = None + with get_date_parser() as date_parser: + date = next(date_parser.parse(self.filename, text), None) + archive_path = document_parser.get_archive_path() + page_count = document_parser.get_page_count( + self.working_copy, + mime_type, + ) - # Save the new version, potentially creating an audit log entry for the version addition if enabled. - if ( - settings.AUDIT_LOG_ENABLED - and self.metadata.actor_id is not None - ): - actor = User.objects.filter(pk=self.metadata.actor_id).first() - if actor is not None: - from auditlog.context import ( # type: ignore[import-untyped] - set_actor, - ) + except ParseError as e: + if tempdir: + tempdir.cleanup() + self._fail( + str(e), + f"Error occurred while consuming document {self.filename}: {e}", + exc_info=True, + exception=e, + ) + except Exception as e: + if tempdir: + tempdir.cleanup() + self._fail( + str(e), + f"Unexpected error while consuming document {self.filename}: {e}", + exc_info=True, + exception=e, + ) - with set_actor(actor): + # Prepare the document classifier. + + # TODO: I don't really like to do this here, but this way we avoid + # reloading the classifier multiple times, since there are multiple + # post-consume hooks that all require the classifier. + + classifier = load_classifier() + + self._send_progress( + 95, + 100, + ProgressStatusOptions.WORKING, + ConsumerStatusShortMessage.SAVE_DOCUMENT, + ) + # now that everything is done, we can start to store the document + # in the system. This will be a transaction and reasonably fast. + try: + with transaction.atomic(): + # store the document. + if self.input_doc.root_document_id: + # If this is a new version of an existing document, we need + # to make sure we're not creating a new document, but updating + # the existing one. + root_doc = Document.objects.get( + pk=self.input_doc.root_document_id, + ) + original_document = self._create_version_from_root( + root_doc, + text=text, + page_count=page_count, + mime_type=mime_type, + ) + actor = None + + # Save the new version, potentially creating an audit log entry for the version addition if enabled. + if ( + settings.AUDIT_LOG_ENABLED + and self.metadata.actor_id is not None + ): + actor = User.objects.filter( + pk=self.metadata.actor_id, + ).first() + if actor is not None: + from auditlog.context import ( # type: ignore[import-untyped] + set_actor, + ) + + with set_actor(actor): + original_document.save() + else: original_document.save() else: original_document.save() + + # Create a log entry for the version addition, if enabled + if settings.AUDIT_LOG_ENABLED: + from auditlog.models import ( # type: ignore[import-untyped] + LogEntry, + ) + + LogEntry.objects.log_create( + instance=root_doc, + changes={ + "Version Added": ["None", original_document.id], + }, + action=LogEntry.Action.UPDATE, + actor=actor, + additional_data={ + "reason": "Version added", + "version_id": original_document.id, + }, + ) + document = original_document else: - original_document.save() - - # Create a log entry for the version addition, if enabled - if settings.AUDIT_LOG_ENABLED: - from auditlog.models import ( # type: ignore[import-untyped] - LogEntry, + document = self._store( + text=text, + date=date, + page_count=page_count, + mime_type=mime_type, ) - LogEntry.objects.log_create( - instance=root_doc, - changes={ - "Version Added": ["None", original_document.id], - }, - action=LogEntry.Action.UPDATE, - actor=actor, - additional_data={ - "reason": "Version added", - "version_id": original_document.id, - }, - ) - document = original_document - else: - document = self._store( - text=text, - date=date, - page_count=page_count, - mime_type=mime_type, - ) + # If we get here, it was successful. Proceed with post-consume + # hooks. If they fail, nothing will get changed. - # If we get here, it was successful. Proceed with post-consume - # hooks. If they fail, nothing will get changed. - - document_consumption_finished.send( - sender=self.__class__, - document=document, - logging_group=self.logging_group, - classifier=classifier, - original_file=self.unmodified_original - if self.unmodified_original - else self.working_copy, - ) - - # After everything is in the database, copy the files into - # place. If this fails, we'll also rollback the transaction. - with FileLock(settings.MEDIA_LOCK): - generated_filename = generate_unique_filename(document) - if ( - len(str(generated_filename)) - > Document.MAX_STORED_FILENAME_LENGTH - ): - self.log.warning( - "Generated source filename exceeds db path limit, falling back to default naming", - ) - generated_filename = generate_filename( - document, - use_format=False, - ) - document.filename = generated_filename - create_source_path_directory(document.source_path) - - self._write( - self.unmodified_original - if self.unmodified_original is not None + document_consumption_finished.send( + sender=self.__class__, + document=document, + logging_group=self.logging_group, + classifier=classifier, + original_file=self.unmodified_original + if self.unmodified_original else self.working_copy, - document.source_path, ) - self._write( - thumbnail, - document.thumbnail_path, - ) - - if archive_path and Path(archive_path).is_file(): - generated_archive_filename = generate_unique_filename( - document, - archive_filename=True, - ) + # After everything is in the database, copy the files into + # place. If this fails, we'll also rollback the transaction. + with FileLock(settings.MEDIA_LOCK): + generated_filename = generate_unique_filename(document) if ( - len(str(generated_archive_filename)) + len(str(generated_filename)) > Document.MAX_STORED_FILENAME_LENGTH ): self.log.warning( - "Generated archive filename exceeds db path limit, falling back to default naming", + "Generated source filename exceeds db path limit, falling back to default naming", ) - generated_archive_filename = generate_filename( + generated_filename = generate_filename( document, - archive_filename=True, use_format=False, ) - document.archive_filename = generated_archive_filename - create_source_path_directory(document.archive_path) + document.filename = generated_filename + create_source_path_directory(document.source_path) + self._write( - archive_path, - document.archive_path, + self.unmodified_original + if self.unmodified_original is not None + else self.working_copy, + document.source_path, ) - with Path(archive_path).open("rb") as f: - document.archive_checksum = hashlib.md5( - f.read(), - ).hexdigest() + self._write( + thumbnail, + document.thumbnail_path, + ) - # Don't save with the lock active. Saving will cause the file - # renaming logic to acquire the lock as well. - # This triggers things like file renaming - document.save() + if archive_path and Path(archive_path).is_file(): + generated_archive_filename = generate_unique_filename( + document, + archive_filename=True, + ) + if ( + len(str(generated_archive_filename)) + > Document.MAX_STORED_FILENAME_LENGTH + ): + self.log.warning( + "Generated archive filename exceeds db path limit, falling back to default naming", + ) + generated_archive_filename = generate_filename( + document, + archive_filename=True, + use_format=False, + ) + document.archive_filename = generated_archive_filename + create_source_path_directory(document.archive_path) + self._write( + archive_path, + document.archive_path, + ) - if document.root_document_id: - document_updated.send( - sender=self.__class__, - document=document.root_document, - ) + with Path(archive_path).open("rb") as f: + document.archive_checksum = hashlib.md5( + f.read(), + ).hexdigest() - # Delete the file only if it was successfully consumed - self.log.debug(f"Deleting original file {self.input_doc.original_file}") - self.input_doc.original_file.unlink() - self.log.debug(f"Deleting working copy {self.working_copy}") - self.working_copy.unlink() - if self.unmodified_original is not None: # pragma: no cover + # Don't save with the lock active. Saving will cause the file + # renaming logic to acquire the lock as well. + # This triggers things like file renaming + document.save() + + if document.root_document_id: + document_updated.send( + sender=self.__class__, + document=document.root_document, + ) + + # Delete the file only if it was successfully consumed self.log.debug( - f"Deleting unmodified original file {self.unmodified_original}", + f"Deleting original file {self.input_doc.original_file}", ) - self.unmodified_original.unlink() + self.input_doc.original_file.unlink() + self.log.debug(f"Deleting working copy {self.working_copy}") + self.working_copy.unlink() + if self.unmodified_original is not None: # pragma: no cover + self.log.debug( + f"Deleting unmodified original file {self.unmodified_original}", + ) + self.unmodified_original.unlink() - # https://github.com/jonaswinkler/paperless-ng/discussions/1037 - shadow_file = ( - Path(self.input_doc.original_file).parent - / f"._{Path(self.input_doc.original_file).name}" + # https://github.com/jonaswinkler/paperless-ng/discussions/1037 + shadow_file = ( + Path(self.input_doc.original_file).parent + / f"._{Path(self.input_doc.original_file).name}" + ) + + if Path(shadow_file).is_file(): + self.log.debug(f"Deleting shadow file {shadow_file}") + Path(shadow_file).unlink() + + except Exception as e: + self._fail( + str(e), + f"The following error occurred while storing document " + f"{self.filename} after parsing: {e}", + exc_info=True, + exception=e, ) - - if Path(shadow_file).is_file(): - self.log.debug(f"Deleting shadow file {shadow_file}") - Path(shadow_file).unlink() - - except Exception as e: - self._fail( - str(e), - f"The following error occurred while storing document " - f"{self.filename} after parsing: {e}", - exc_info=True, - exception=e, - ) - finally: - _parser_cleanup(document_parser) - tempdir.cleanup() + finally: + tempdir.cleanup() self.run_post_consume_script(document) diff --git a/src/documents/management/commands/document_thumbnails.py b/src/documents/management/commands/document_thumbnails.py index 1756f8754..3d779ae18 100644 --- a/src/documents/management/commands/document_thumbnails.py +++ b/src/documents/management/commands/document_thumbnails.py @@ -3,19 +3,18 @@ import shutil from documents.management.commands.base import PaperlessCommand from documents.models import Document -from documents.parsers import get_parser_class_for_mime_type -from paperless.parsers.mail import MailDocumentParser -from paperless.parsers.remote import RemoteDocumentParser -from paperless.parsers.tesseract import RasterisedDocumentParser -from paperless.parsers.text import TextDocumentParser -from paperless.parsers.tika import TikaDocumentParser +from paperless.parsers.registry import get_parser_registry logger = logging.getLogger("paperless.management.thumbnails") def _process_document(doc_id: int) -> None: document: Document = Document.objects.get(id=doc_id) - parser_class = get_parser_class_for_mime_type(document.mime_type) + parser_class = get_parser_registry().get_parser_for_file( + document.mime_type, + document.original_filename or "", + document.source_path, + ) if parser_class is None: logger.warning( @@ -25,40 +24,9 @@ def _process_document(doc_id: int) -> None: ) return - parser = parser_class(logging_group=None) - - parser_is_new_style = isinstance( - parser, - ( - MailDocumentParser, - RasterisedDocumentParser, - RemoteDocumentParser, - TextDocumentParser, - TikaDocumentParser, - ), - ) - - # TODO(stumpylog): Remove branch in the future when all parsers use new protocol - if parser_is_new_style: - parser.__enter__() - - try: - # TODO(stumpylog): Remove branch in the future when all parsers use new protocol - if parser_is_new_style: - thumb = parser.get_thumbnail(document.source_path, document.mime_type) - else: - thumb = parser.get_thumbnail( - document.source_path, - document.mime_type, - document.get_public_filename(), - ) + with parser_class() as parser: + thumb = parser.get_thumbnail(document.source_path, document.mime_type) shutil.move(thumb, document.thumbnail_path) - finally: - # TODO(stumpylog): Cleanup once all parsers are handled - if parser_is_new_style: - parser.__exit__(None, None, None) - else: - parser.cleanup() class Command(PaperlessCommand): diff --git a/src/documents/parsers.py b/src/documents/parsers.py index 372cf0491..69ee4e285 100644 --- a/src/documents/parsers.py +++ b/src/documents/parsers.py @@ -3,84 +3,47 @@ from __future__ import annotations import logging import mimetypes import os -import re import shutil import subprocess import tempfile -from functools import lru_cache from pathlib import Path from typing import TYPE_CHECKING from django.conf import settings from documents.loggers import LoggingMixin -from documents.signals import document_consumer_declaration from documents.utils import copy_file_with_basic_stats from documents.utils import run_subprocess +from paperless.parsers.registry import get_parser_registry if TYPE_CHECKING: import datetime -# This regular expression will try to find dates in the document at -# hand and will match the following formats: -# - XX.YY.ZZZZ with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits -# - XX/YY/ZZZZ with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits -# - XX-YY-ZZZZ with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits -# - ZZZZ.XX.YY with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits -# - ZZZZ/XX/YY with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits -# - ZZZZ-XX-YY with XX + YY being 1 or 2 and ZZZZ being 2 or 4 digits -# - XX. MONTH ZZZZ with XX being 1 or 2 and ZZZZ being 2 or 4 digits -# - MONTH ZZZZ, with ZZZZ being 4 digits -# - MONTH XX, ZZZZ with XX being 1 or 2 and ZZZZ being 4 digits -# - XX MON ZZZZ with XX being 1 or 2 and ZZZZ being 4 digits. MONTH is 3 letters -# - XXPP MONTH ZZZZ with XX being 1 or 2 and PP being 2 letters and ZZZZ being 4 digits - -# TODO: isn't there a date parsing library for this? - -DATE_REGEX = re.compile( - r"(\b|(?!=([_-])))(\d{1,2})[\.\/-](\d{1,2})[\.\/-](\d{4}|\d{2})(\b|(?=([_-])))|" - r"(\b|(?!=([_-])))(\d{4}|\d{2})[\.\/-](\d{1,2})[\.\/-](\d{1,2})(\b|(?=([_-])))|" - r"(\b|(?!=([_-])))(\d{1,2}[\. ]+[a-zéûäëčžúřěáíóńźçŞğü]{3,9} \d{4}|[a-zéûäëčžúřěáíóńźçŞğü]{3,9} \d{1,2}, \d{4})(\b|(?=([_-])))|" - r"(\b|(?!=([_-])))([^\W\d_]{3,9} \d{1,2}, (\d{4}))(\b|(?=([_-])))|" - r"(\b|(?!=([_-])))([^\W\d_]{3,9} \d{4})(\b|(?=([_-])))|" - r"(\b|(?!=([_-])))(\d{1,2}[^ 0-9]{2}[\. ]+[^ ]{3,9}[ \.\/-]\d{4})(\b|(?=([_-])))|" - r"(\b|(?!=([_-])))(\b\d{1,2}[ \.\/-][a-zéûäëčžúřěáíóńźçŞğü]{3}[ \.\/-]\d{4})(\b|(?=([_-])))", - re.IGNORECASE, -) - - logger = logging.getLogger("paperless.parsing") -@lru_cache(maxsize=8) def is_mime_type_supported(mime_type: str) -> bool: """ Returns True if the mime type is supported, False otherwise """ - return get_parser_class_for_mime_type(mime_type) is not None + return get_parser_registry().get_parser_for_file(mime_type, "") is not None -@lru_cache(maxsize=8) def get_default_file_extension(mime_type: str) -> str: """ Returns the default file extension for a mimetype, or an empty string if it could not be determined """ - for response in document_consumer_declaration.send(None): - parser_declaration = response[1] - supported_mime_types = parser_declaration["mime_types"] - - if mime_type in supported_mime_types: - return supported_mime_types[mime_type] + parser_class = get_parser_registry().get_parser_for_file(mime_type, "") + if parser_class is not None: + supported = parser_class.supported_mime_types() + if mime_type in supported: + return supported[mime_type] ext = mimetypes.guess_extension(mime_type) - if ext: - return ext - else: - return "" + return ext if ext else "" -@lru_cache(maxsize=8) def is_file_ext_supported(ext: str) -> bool: """ Returns True if the file extension is supported, False otherwise @@ -94,44 +57,17 @@ def is_file_ext_supported(ext: str) -> bool: def get_supported_file_extensions() -> set[str]: extensions = set() - for response in document_consumer_declaration.send(None): - parser_declaration = response[1] - supported_mime_types = parser_declaration["mime_types"] - - for mime_type in supported_mime_types: + for parser_class in get_parser_registry().all_parsers(): + for mime_type, ext in parser_class.supported_mime_types().items(): extensions.update(mimetypes.guess_all_extensions(mime_type)) # Python's stdlib might be behind, so also add what the parser # says is the default extension # This makes image/webp supported on Python < 3.11 - extensions.add(supported_mime_types[mime_type]) + extensions.add(ext) return extensions -def get_parser_class_for_mime_type(mime_type: str) -> type[DocumentParser] | None: - """ - Returns the best parser (by weight) for the given mimetype or - None if no parser exists - """ - - options = [] - - for response in document_consumer_declaration.send(None): - parser_declaration = response[1] - supported_mime_types = parser_declaration["mime_types"] - - if mime_type in supported_mime_types: - options.append(parser_declaration) - - if not options: - return None - - best_parser = sorted(options, key=lambda _: _["weight"], reverse=True)[0] - - # Return the parser with the highest weight. - return best_parser["parser"] - - def run_convert( input_file, output_file, diff --git a/src/documents/signals/__init__.py b/src/documents/signals/__init__.py index fbb55d9fe..864fec09f 100644 --- a/src/documents/signals/__init__.py +++ b/src/documents/signals/__init__.py @@ -2,5 +2,4 @@ from django.dispatch import Signal document_consumption_started = Signal() document_consumption_finished = Signal() -document_consumer_declaration = Signal() document_updated = Signal() diff --git a/src/documents/tasks.py b/src/documents/tasks.py index a8ca0cc5f..751990c62 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -52,8 +52,6 @@ from documents.models import StoragePath from documents.models import Tag from documents.models import WorkflowRun from documents.models import WorkflowTrigger -from documents.parsers import DocumentParser -from documents.parsers import get_parser_class_for_mime_type from documents.plugins.base import ConsumeTaskPlugin from documents.plugins.base import ProgressManager from documents.plugins.base import StopConsumeTaskError @@ -66,11 +64,7 @@ from documents.signals.handlers import send_websocket_document_updated from documents.workflows.utils import get_workflows_for_trigger from paperless.config import AIConfig from paperless.parsers import ParserContext -from paperless.parsers.mail import MailDocumentParser -from paperless.parsers.remote import RemoteDocumentParser -from paperless.parsers.tesseract import RasterisedDocumentParser -from paperless.parsers.text import TextDocumentParser -from paperless.parsers.tika import TikaDocumentParser +from paperless.parsers.registry import get_parser_registry from paperless_ai.indexing import llm_index_add_or_update_document from paperless_ai.indexing import llm_index_remove_document from paperless_ai.indexing import update_llm_index @@ -310,8 +304,10 @@ def update_document_content_maybe_archive_file(document_id) -> None: mime_type = document.mime_type - parser_class: type[DocumentParser] | None = get_parser_class_for_mime_type( + parser_class = get_parser_registry().get_parser_for_file( mime_type, + document.original_filename or "", + document.source_path, ) if not parser_class: @@ -321,138 +317,92 @@ def update_document_content_maybe_archive_file(document_id) -> None: ) return - parser: DocumentParser = parser_class(logging_group=uuid.uuid4()) + with parser_class() as parser: + parser.configure(ParserContext()) - parser_is_new_style = isinstance( - parser, - ( - MailDocumentParser, - RasterisedDocumentParser, - RemoteDocumentParser, - TextDocumentParser, - TikaDocumentParser, - ), - ) - - # TODO(stumpylog): Remove branch in the future when all parsers use new protocol - if parser_is_new_style: - parser.__enter__() - - try: - # TODO(stumpylog): Remove branch in the future when all parsers use new protocol - if parser_is_new_style: - parser.configure(ParserContext()) + try: parser.parse(document.source_path, mime_type) - else: - parser.parse( - document.source_path, - mime_type, - document.get_public_filename(), - ) - # TODO(stumpylog): Remove branch in the future when all parsers use new protocol - if parser_is_new_style: thumbnail = parser.get_thumbnail(document.source_path, mime_type) - else: - thumbnail = parser.get_thumbnail( - document.source_path, - mime_type, - document.get_public_filename(), - ) - with transaction.atomic(): - oldDocument = Document.objects.get(pk=document.pk) - if parser.get_archive_path(): - with Path(parser.get_archive_path()).open("rb") as f: - checksum = hashlib.md5(f.read()).hexdigest() - # I'm going to save first so that in case the file move - # fails, the database is rolled back. - # We also don't use save() since that triggers the filehandling - # logic, and we don't want that yet (file not yet in place) - document.archive_filename = generate_unique_filename( - document, - archive_filename=True, - ) - Document.objects.filter(pk=document.pk).update( - archive_checksum=checksum, - content=parser.get_text(), - archive_filename=document.archive_filename, - ) - newDocument = Document.objects.get(pk=document.pk) - if settings.AUDIT_LOG_ENABLED: - LogEntry.objects.log_create( - instance=oldDocument, - changes={ - "content": [oldDocument.content, newDocument.content], - "archive_checksum": [ - oldDocument.archive_checksum, - newDocument.archive_checksum, - ], - "archive_filename": [ - oldDocument.archive_filename, - newDocument.archive_filename, - ], - }, - additional_data={ - "reason": "Update document content", - }, - action=LogEntry.Action.UPDATE, - ) - else: - Document.objects.filter(pk=document.pk).update( - content=parser.get_text(), - ) - - if settings.AUDIT_LOG_ENABLED: - LogEntry.objects.log_create( - instance=oldDocument, - changes={ - "content": [oldDocument.content, parser.get_text()], - }, - additional_data={ - "reason": "Update document content", - }, - action=LogEntry.Action.UPDATE, - ) - - with FileLock(settings.MEDIA_LOCK): + with transaction.atomic(): + oldDocument = Document.objects.get(pk=document.pk) if parser.get_archive_path(): - create_source_path_directory(document.archive_path) - shutil.move(parser.get_archive_path(), document.archive_path) - shutil.move(thumbnail, document.thumbnail_path) + with Path(parser.get_archive_path()).open("rb") as f: + checksum = hashlib.md5(f.read()).hexdigest() + # I'm going to save first so that in case the file move + # fails, the database is rolled back. + # We also don't use save() since that triggers the filehandling + # logic, and we don't want that yet (file not yet in place) + document.archive_filename = generate_unique_filename( + document, + archive_filename=True, + ) + Document.objects.filter(pk=document.pk).update( + archive_checksum=checksum, + content=parser.get_text(), + archive_filename=document.archive_filename, + ) + newDocument = Document.objects.get(pk=document.pk) + if settings.AUDIT_LOG_ENABLED: + LogEntry.objects.log_create( + instance=oldDocument, + changes={ + "content": [oldDocument.content, newDocument.content], + "archive_checksum": [ + oldDocument.archive_checksum, + newDocument.archive_checksum, + ], + "archive_filename": [ + oldDocument.archive_filename, + newDocument.archive_filename, + ], + }, + additional_data={ + "reason": "Update document content", + }, + action=LogEntry.Action.UPDATE, + ) + else: + Document.objects.filter(pk=document.pk).update( + content=parser.get_text(), + ) - document.refresh_from_db() - logger.info( - f"Updating index for document {document_id} ({document.archive_checksum})", - ) - with index.open_index_writer() as writer: - index.update_document(writer, document) + if settings.AUDIT_LOG_ENABLED: + LogEntry.objects.log_create( + instance=oldDocument, + changes={ + "content": [oldDocument.content, parser.get_text()], + }, + additional_data={ + "reason": "Update document content", + }, + action=LogEntry.Action.UPDATE, + ) - ai_config = AIConfig() - if ai_config.llm_index_enabled: - llm_index_add_or_update_document(document) + with FileLock(settings.MEDIA_LOCK): + if parser.get_archive_path(): + create_source_path_directory(document.archive_path) + shutil.move(parser.get_archive_path(), document.archive_path) + shutil.move(thumbnail, document.thumbnail_path) - clear_document_caches(document.pk) + document.refresh_from_db() + logger.info( + f"Updating index for document {document_id} ({document.archive_checksum})", + ) + with index.open_index_writer() as writer: + index.update_document(writer, document) - except Exception: - logger.exception( - f"Error while parsing document {document} (ID: {document_id})", - ) - finally: - # TODO(stumpylog): Remove branch in the future when all parsers use new protocol - if isinstance( - parser, - ( - MailDocumentParser, - RasterisedDocumentParser, - RemoteDocumentParser, - TextDocumentParser, - TikaDocumentParser, - ), - ): - parser.__exit__(None, None, None) - else: - parser.cleanup() + ai_config = AIConfig() + if ai_config.llm_index_enabled: + llm_index_add_or_update_document(document) + + clear_document_caches(document.pk) + + except Exception: + logger.exception( + f"Error while parsing document {document} (ID: {document_id})", + ) @shared_task diff --git a/src/documents/tests/test_checks.py b/src/documents/tests/test_checks.py index b78946ba9..51d9cdddc 100644 --- a/src/documents/tests/test_checks.py +++ b/src/documents/tests/test_checks.py @@ -13,8 +13,10 @@ class TestDocumentChecks(TestCase): def test_parser_check(self) -> None: self.assertEqual(parser_check(None), []) - with mock.patch("documents.checks.document_consumer_declaration.send") as m: - m.return_value = [] + with mock.patch("documents.checks.get_parser_registry") as mock_registry_fn: + mock_registry = mock.MagicMock() + mock_registry.all_parsers.return_value = [] + mock_registry_fn.return_value = mock_registry self.assertEqual( parser_check(None), diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index a3574fdce..df4c7d9c4 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -27,7 +27,6 @@ from documents.models import Document from documents.models import DocumentType from documents.models import StoragePath from documents.models import Tag -from documents.parsers import DocumentParser from documents.parsers import ParseError from documents.plugins.helpers import ProgressStatusOptions from documents.tasks import sanity_check @@ -38,62 +37,106 @@ from documents.tests.utils import GetConsumerMixin from paperless_mail.models import MailRule -class _BaseTestParser(DocumentParser): - def get_settings(self) -> None: +class _BaseNewStyleParser: + """Minimal ParserProtocol implementation for use in consumer tests.""" + + name: str = "test-parser" + version: str = "0.1" + author: str = "test" + url: str = "test" + + @classmethod + def supported_mime_types(cls) -> dict: + return { + "application/pdf": ".pdf", + "image/png": ".png", + "message/rfc822": ".eml", + } + + @classmethod + def score(cls, mime_type: str, filename: str, path=None): + return 0 if mime_type in cls.supported_mime_types() else None + + @property + def can_produce_archive(self) -> bool: + return True + + @property + def requires_pdf_rendition(self) -> bool: + return False + + def __init__(self) -> None: + self._tmpdir: Path | None = None + self._text: str | None = None + self._archive: Path | None = None + self._thumb: Path | None = None + + def __enter__(self): + self._tmpdir = Path( + tempfile.mkdtemp(prefix="paperless-test-", dir=settings.SCRATCH_DIR), + ) + _, thumb = tempfile.mkstemp(suffix=".webp", dir=self._tmpdir) + self._thumb = Path(thumb) + return self + + def __exit__(self, exc_type, exc_val, exc_tb) -> None: + if self._tmpdir and self._tmpdir.exists(): + shutil.rmtree(self._tmpdir, ignore_errors=True) + + def configure(self, context) -> None: """ - This parser does not implement additional settings yet + Test parser doesn't do anything with context """ + + def parse(self, document_path, mime_type, *, produce_archive: bool = True) -> None: + raise NotImplementedError + + def get_text(self) -> str | None: + return self._text + + def get_date(self): return None + def get_archive_path(self): + return self._archive -class DummyParser(_BaseTestParser): - def __init__(self, logging_group, scratch_dir, archive_path) -> None: - super().__init__(logging_group, None) - _, self.fake_thumb = tempfile.mkstemp(suffix=".webp", dir=scratch_dir) - self.archive_path = archive_path + def get_thumbnail(self, document_path, mime_type) -> Path: + return self._thumb - def get_thumbnail(self, document_path, mime_type, file_name=None): - return self.fake_thumb + def get_page_count(self, document_path, mime_type): + return None - def parse(self, document_path, mime_type, file_name=None) -> None: - self.text = "The Text" + def extract_metadata(self, document_path, mime_type) -> list: + return [] -class CopyParser(_BaseTestParser): - def get_thumbnail(self, document_path, mime_type, file_name=None): - return self.fake_thumb +class DummyParser(_BaseNewStyleParser): + _ARCHIVE_SRC = ( + Path(__file__).parent / "samples" / "documents" / "archive" / "0000001.pdf" + ) - def __init__(self, logging_group, progress_callback=None) -> None: - super().__init__(logging_group, progress_callback) - _, self.fake_thumb = tempfile.mkstemp(suffix=".webp", dir=self.tempdir) - - def parse(self, document_path, mime_type, file_name=None) -> None: - self.text = "The text" - self.archive_path = Path(self.tempdir / "archive.pdf") - shutil.copy(document_path, self.archive_path) + def parse(self, document_path, mime_type, *, produce_archive: bool = True) -> None: + self._text = "The Text" + if produce_archive and self._tmpdir: + self._archive = self._tmpdir / "archive.pdf" + shutil.copy(self._ARCHIVE_SRC, self._archive) -class FaultyParser(_BaseTestParser): - def __init__(self, logging_group, scratch_dir) -> None: - super().__init__(logging_group) - _, self.fake_thumb = tempfile.mkstemp(suffix=".webp", dir=scratch_dir) +class CopyParser(_BaseNewStyleParser): + def parse(self, document_path, mime_type, *, produce_archive: bool = True) -> None: + self._text = "The text" + if produce_archive and self._tmpdir: + self._archive = self._tmpdir / "archive.pdf" + shutil.copy(document_path, self._archive) - def get_thumbnail(self, document_path, mime_type, file_name=None): - return self.fake_thumb - def parse(self, document_path, mime_type, file_name=None): +class FaultyParser(_BaseNewStyleParser): + def parse(self, document_path, mime_type, *, produce_archive: bool = True) -> None: raise ParseError("Does not compute.") -class FaultyGenericExceptionParser(_BaseTestParser): - def __init__(self, logging_group, scratch_dir) -> None: - super().__init__(logging_group) - _, self.fake_thumb = tempfile.mkstemp(suffix=".webp", dir=scratch_dir) - - def get_thumbnail(self, document_path, mime_type, file_name=None): - return self.fake_thumb - - def parse(self, document_path, mime_type, file_name=None): +class FaultyGenericExceptionParser(_BaseNewStyleParser): + def parse(self, document_path, mime_type, *, produce_archive: bool = True) -> None: raise Exception("Generic exception.") @@ -147,38 +190,12 @@ class TestConsumer( self.assertEqual(payload["data"]["max_progress"], last_progress_max) self.assertEqual(payload["data"]["status"], last_status) - def make_dummy_parser(self, logging_group, progress_callback=None): - return DummyParser( - logging_group, - self.dirs.scratch_dir, - self.get_test_archive_file(), - ) - - def make_faulty_parser(self, logging_group, progress_callback=None): - return FaultyParser(logging_group, self.dirs.scratch_dir) - - def make_faulty_generic_exception_parser( - self, - logging_group, - progress_callback=None, - ): - return FaultyGenericExceptionParser(logging_group, self.dirs.scratch_dir) - def setUp(self) -> None: super().setUp() - patcher = mock.patch("documents.parsers.document_consumer_declaration.send") - m = patcher.start() - m.return_value = [ - ( - None, - { - "parser": self.make_dummy_parser, - "mime_types": {"application/pdf": ".pdf"}, - "weight": 0, - }, - ), - ] + patcher = mock.patch("documents.consumer.get_parser_registry") + mock_registry = patcher.start() + mock_registry.return_value.get_parser_for_file.return_value = DummyParser self.addCleanup(patcher.stop) def get_test_file(self): @@ -547,9 +564,9 @@ class TestConsumer( ) as consumer: consumer.run() - @mock.patch("documents.parsers.document_consumer_declaration.send") + @mock.patch("documents.consumer.get_parser_registry") def testNoParsers(self, m) -> None: - m.return_value = [] + m.return_value.get_parser_for_file.return_value = None with self.assertRaisesMessage( ConsumerError, @@ -560,18 +577,9 @@ class TestConsumer( self._assert_first_last_send_progress(last_status="FAILED") - @mock.patch("documents.parsers.document_consumer_declaration.send") + @mock.patch("documents.consumer.get_parser_registry") def testFaultyParser(self, m) -> None: - m.return_value = [ - ( - None, - { - "parser": self.make_faulty_parser, - "mime_types": {"application/pdf": ".pdf"}, - "weight": 0, - }, - ), - ] + m.return_value.get_parser_for_file.return_value = FaultyParser with self.get_consumer(self.get_test_file()) as consumer: with self.assertRaisesMessage( @@ -582,18 +590,9 @@ class TestConsumer( self._assert_first_last_send_progress(last_status="FAILED") - @mock.patch("documents.parsers.document_consumer_declaration.send") + @mock.patch("documents.consumer.get_parser_registry") def testGenericParserException(self, m) -> None: - m.return_value = [ - ( - None, - { - "parser": self.make_faulty_generic_exception_parser, - "mime_types": {"application/pdf": ".pdf"}, - "weight": 0, - }, - ), - ] + m.return_value.get_parser_for_file.return_value = FaultyGenericExceptionParser with self.get_consumer(self.get_test_file()) as consumer: with self.assertRaisesMessage( @@ -1017,7 +1016,7 @@ class TestConsumer( self._assert_first_last_send_progress() @override_settings(FILENAME_FORMAT="{title}") - @mock.patch("documents.parsers.document_consumer_declaration.send") + @mock.patch("documents.consumer.get_parser_registry") def test_similar_filenames(self, m) -> None: shutil.copy( Path(__file__).parent / "samples" / "simple.pdf", @@ -1031,16 +1030,7 @@ class TestConsumer( Path(__file__).parent / "samples" / "simple-noalpha.png", settings.CONSUMPTION_DIR / "simple.png.pdf", ) - m.return_value = [ - ( - None, - { - "parser": CopyParser, - "mime_types": {"application/pdf": ".pdf", "image/png": ".png"}, - "weight": 0, - }, - ), - ] + m.return_value.get_parser_for_file.return_value = CopyParser with self.get_consumer(settings.CONSUMPTION_DIR / "simple.png") as consumer: consumer.run() @@ -1068,8 +1058,10 @@ class TestConsumer( sanity_check() + @mock.patch("documents.consumer.get_parser_registry") @mock.patch("documents.consumer.run_subprocess") - def test_try_to_clean_invalid_pdf(self, m) -> None: + def test_try_to_clean_invalid_pdf(self, m, mock_registry) -> None: + mock_registry.return_value.get_parser_for_file.return_value = None shutil.copy( Path(__file__).parent / "samples" / "invalid_pdf.pdf", settings.CONSUMPTION_DIR / "invalid_pdf.pdf", @@ -1091,10 +1083,10 @@ class TestConsumer( @mock.patch("paperless_mail.models.MailRule.objects.get") @mock.patch("paperless.parsers.mail.MailDocumentParser.parse") - @mock.patch("documents.parsers.document_consumer_declaration.send") + @mock.patch("documents.consumer.get_parser_registry") def test_mail_parser_receives_mailrule( self, - mock_consumer_declaration_send: mock.Mock, + mock_get_parser_registry: mock.Mock, mock_mail_parser_parse: mock.Mock, mock_mailrule_get: mock.Mock, ) -> None: @@ -1106,18 +1098,11 @@ class TestConsumer( THEN: - The mail parser should receive the mail rule """ - from paperless_mail.signals import get_parser as mail_get_parser + from paperless.parsers.mail import MailDocumentParser - mock_consumer_declaration_send.return_value = [ - ( - None, - { - "parser": mail_get_parser, - "mime_types": {"message/rfc822": ".eml"}, - "weight": 0, - }, - ), - ] + mock_get_parser_registry.return_value.get_parser_for_file.return_value = ( + MailDocumentParser + ) mock_mailrule_get.return_value = mock.Mock( pdf_layout=MailRule.PdfLayout.HTML_ONLY, ) diff --git a/src/documents/tests/test_parsers.py b/src/documents/tests/test_parsers.py index 5ea1b361e..30963df70 100644 --- a/src/documents/tests/test_parsers.py +++ b/src/documents/tests/test_parsers.py @@ -1,132 +1,16 @@ -from tempfile import TemporaryDirectory -from unittest import mock - -from django.apps import apps from django.test import TestCase from django.test import override_settings from documents.parsers import get_default_file_extension -from documents.parsers import get_parser_class_for_mime_type from documents.parsers import get_supported_file_extensions from documents.parsers import is_file_ext_supported +from paperless.parsers.registry import get_parser_registry +from paperless.parsers.registry import reset_parser_registry from paperless.parsers.tesseract import RasterisedDocumentParser from paperless.parsers.text import TextDocumentParser from paperless.parsers.tika import TikaDocumentParser -class TestParserDiscovery(TestCase): - @mock.patch("documents.parsers.document_consumer_declaration.send") - def test_get_parser_class_1_parser(self, m, *args) -> None: - """ - GIVEN: - - Parser declared for a given mimetype - WHEN: - - Attempt to get parser for the mimetype - THEN: - - Declared parser class is returned - """ - - class DummyParser: - pass - - m.return_value = ( - ( - None, - { - "weight": 0, - "parser": DummyParser, - "mime_types": {"application/pdf": ".pdf"}, - }, - ), - ) - - self.assertEqual(get_parser_class_for_mime_type("application/pdf"), DummyParser) - - @mock.patch("documents.parsers.document_consumer_declaration.send") - def test_get_parser_class_n_parsers(self, m, *args) -> None: - """ - GIVEN: - - Two parsers declared for a given mimetype - - Second parser has a higher weight - WHEN: - - Attempt to get parser for the mimetype - THEN: - - Second parser class is returned - """ - - class DummyParser1: - pass - - class DummyParser2: - pass - - m.return_value = ( - ( - None, - { - "weight": 0, - "parser": DummyParser1, - "mime_types": {"application/pdf": ".pdf"}, - }, - ), - ( - None, - { - "weight": 1, - "parser": DummyParser2, - "mime_types": {"application/pdf": ".pdf"}, - }, - ), - ) - - self.assertEqual( - get_parser_class_for_mime_type("application/pdf"), - DummyParser2, - ) - - @mock.patch("documents.parsers.document_consumer_declaration.send") - def test_get_parser_class_0_parsers(self, m, *args) -> None: - """ - GIVEN: - - No parsers are declared - WHEN: - - Attempt to get parser for the mimetype - THEN: - - No parser class is returned - """ - m.return_value = [] - with TemporaryDirectory(): - self.assertIsNone(get_parser_class_for_mime_type("application/pdf")) - - @mock.patch("documents.parsers.document_consumer_declaration.send") - def test_get_parser_class_no_valid_parser(self, m, *args) -> None: - """ - GIVEN: - - No parser declared for a given mimetype - - Parser declared for a different mimetype - WHEN: - - Attempt to get parser for the given mimetype - THEN: - - No parser class is returned - """ - - class DummyParser: - pass - - m.return_value = ( - ( - None, - { - "weight": 0, - "parser": DummyParser, - "mime_types": {"application/pdf": ".pdf"}, - }, - ), - ) - - self.assertIsNone(get_parser_class_for_mime_type("image/tiff")) - - class TestParserAvailability(TestCase): def test_tesseract_parser(self) -> None: """ @@ -151,7 +35,7 @@ class TestParserAvailability(TestCase): self.assertIn(ext, supported_exts) self.assertEqual(get_default_file_extension(mime_type), ext) self.assertIsInstance( - get_parser_class_for_mime_type(mime_type)(logging_group=None), + get_parser_registry().get_parser_for_file(mime_type, "")(), RasterisedDocumentParser, ) @@ -175,7 +59,7 @@ class TestParserAvailability(TestCase): self.assertIn(ext, supported_exts) self.assertEqual(get_default_file_extension(mime_type), ext) self.assertIsInstance( - get_parser_class_for_mime_type(mime_type)(logging_group=None), + get_parser_registry().get_parser_for_file(mime_type, "")(), TextDocumentParser, ) @@ -198,22 +82,23 @@ class TestParserAvailability(TestCase): ), ] - # Force the app ready to notice the settings override - with override_settings(TIKA_ENABLED=True, INSTALLED_APPS=["paperless_tika"]): - app = apps.get_app_config("paperless_tika") - app.ready() + self.addCleanup(reset_parser_registry) + + # Reset and rebuild the registry with Tika enabled. + with override_settings(TIKA_ENABLED=True): + reset_parser_registry() supported_exts = get_supported_file_extensions() - for mime_type, ext in supported_mimes_and_exts: - self.assertIn(ext, supported_exts) - self.assertEqual(get_default_file_extension(mime_type), ext) - self.assertIsInstance( - get_parser_class_for_mime_type(mime_type)(logging_group=None), - TikaDocumentParser, - ) + for mime_type, ext in supported_mimes_and_exts: + self.assertIn(ext, supported_exts) + self.assertEqual(get_default_file_extension(mime_type), ext) + self.assertIsInstance( + get_parser_registry().get_parser_for_file(mime_type, "")(), + TikaDocumentParser, + ) def test_no_parser_for_mime(self) -> None: - self.assertIsNone(get_parser_class_for_mime_type("text/sdgsdf")) + self.assertIsNone(get_parser_registry().get_parser_for_file("text/sdgsdf", "")) def test_default_extension(self) -> None: # Test no parser declared still returns a an extension diff --git a/src/documents/views.py b/src/documents/views.py index ffdc309fd..0716ce66d 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -7,7 +7,6 @@ import tempfile import zipfile from collections import defaultdict from collections import deque -from contextlib import nullcontext from datetime import datetime from pathlib import Path from time import mktime @@ -159,7 +158,6 @@ from documents.models import UiSettings from documents.models import Workflow from documents.models import WorkflowAction from documents.models import WorkflowTrigger -from documents.parsers import get_parser_class_for_mime_type from documents.permissions import AcknowledgeTasksPermissions from documents.permissions import PaperlessAdminPermissions from documents.permissions import PaperlessNotePermissions @@ -227,7 +225,7 @@ from paperless.celery import app as celery_app from paperless.config import AIConfig from paperless.config import GeneralConfig from paperless.models import ApplicationConfiguration -from paperless.parsers import ParserProtocol +from paperless.parsers.registry import get_parser_registry from paperless.serialisers import GroupSerializer from paperless.serialisers import UserSerializer from paperless.views import StandardPagination @@ -1084,17 +1082,17 @@ class DocumentViewSet( if not Path(file).is_file(): return None - parser_class = get_parser_class_for_mime_type(mime_type) + parser_class = get_parser_registry().get_parser_for_file( + mime_type, + Path(file).name, + Path(file), + ) if parser_class: - parser = parser_class(progress_callback=None, logging_group=None) - cm = parser if isinstance(parser, ParserProtocol) else nullcontext(parser) - try: - with cm: + with parser_class() as parser: return parser.extract_metadata(file, mime_type) except Exception: # pragma: no cover logger.exception(f"Issue getting metadata for {file}") - # TODO: cover GPG errors, remove later. return [] else: # pragma: no cover logger.warning(f"No parser for {mime_type}") diff --git a/src/paperless/checks.py b/src/paperless/checks.py index bcea6ef24..5f069b547 100644 --- a/src/paperless/checks.py +++ b/src/paperless/checks.py @@ -3,6 +3,7 @@ import os import pwd import shutil import stat +import subprocess from pathlib import Path from django.conf import settings @@ -299,3 +300,62 @@ def check_deprecated_db_settings( ) return warnings + + +@register() +def check_remote_parser_configured(app_configs, **kwargs) -> list[Error]: + if settings.REMOTE_OCR_ENGINE == "azureai" and not ( + settings.REMOTE_OCR_ENDPOINT and settings.REMOTE_OCR_API_KEY + ): + return [ + Error( + "Azure AI remote parser requires endpoint and API key to be configured.", + ), + ] + + return [] + + +def get_tesseract_langs(): + proc = subprocess.run( + [shutil.which("tesseract"), "--list-langs"], + capture_output=True, + ) + + # Decode bytes to string, split on newlines, trim out the header + proc_lines = proc.stdout.decode("utf8", errors="ignore").strip().split("\n")[1:] + + return [x.strip() for x in proc_lines] + + +@register() +def check_default_language_available(app_configs, **kwargs): + errs = [] + + if not settings.OCR_LANGUAGE: + errs.append( + Warning( + "No OCR language has been specified with PAPERLESS_OCR_LANGUAGE. " + "This means that tesseract will fallback to english.", + ), + ) + return errs + + # binaries_check in paperless will check and report if this doesn't exist + # So skip trying to do anything here and let that handle missing binaries + if shutil.which("tesseract") is not None: + installed_langs = get_tesseract_langs() + + specified_langs = [x.strip() for x in settings.OCR_LANGUAGE.split("+")] + + for lang in specified_langs: + if lang not in installed_langs: + errs.append( + Error( + f"The selected ocr language {lang} is " + f"not installed. Paperless cannot OCR your documents " + f"without it. Please fix PAPERLESS_OCR_LANGUAGE.", + ), + ) + + return errs diff --git a/src/paperless/parsers/registry.py b/src/paperless/parsers/registry.py index 7effe554f..c81fb1c45 100644 --- a/src/paperless/parsers/registry.py +++ b/src/paperless/parsers/registry.py @@ -33,6 +33,7 @@ name, version, author, url, supported_mime_types (callable), score (callable). from __future__ import annotations import logging +import threading from importlib.metadata import entry_points from typing import TYPE_CHECKING @@ -49,6 +50,7 @@ logger = logging.getLogger("paperless.parsers.registry") _registry: ParserRegistry | None = None _discovery_complete: bool = False +_lock = threading.Lock() # Attribute names that every registered external parser class must expose. _REQUIRED_ATTRS: tuple[str, ...] = ( @@ -74,7 +76,6 @@ def get_parser_registry() -> ParserRegistry: 1. Creates a new ParserRegistry. 2. Calls register_defaults to install built-in parsers. 3. Calls discover to load third-party plugins via importlib.metadata entrypoints. - 4. Calls log_summary to emit a startup summary. Subsequent calls return the same instance immediately. @@ -85,14 +86,15 @@ def get_parser_registry() -> ParserRegistry: """ global _registry, _discovery_complete - if _registry is None: - _registry = ParserRegistry() - _registry.register_defaults() + with _lock: + if _registry is None: + r = ParserRegistry() + r.register_defaults() + _registry = r - if not _discovery_complete: - _registry.discover() - _registry.log_summary() - _discovery_complete = True + if not _discovery_complete: + _registry.discover() + _discovery_complete = True return _registry @@ -113,9 +115,11 @@ def init_builtin_parsers() -> None: """ global _registry - if _registry is None: - _registry = ParserRegistry() - _registry.register_defaults() + with _lock: + if _registry is None: + r = ParserRegistry() + r.register_defaults() + _registry = r def reset_parser_registry() -> None: @@ -304,6 +308,23 @@ class ParserRegistry: getattr(cls, "url", "unknown"), ) + # ------------------------------------------------------------------ + # Inspection helpers + # ------------------------------------------------------------------ + + def all_parsers(self) -> list[type[ParserProtocol]]: + """Return all registered parser classes (external first, then builtins). + + Used by compatibility wrappers that need to iterate every parser to + compute the full set of supported MIME types and file extensions. + + Returns + ------- + list[type[ParserProtocol]] + External parsers followed by built-in parsers. + """ + return [*self._external, *self._builtins] + # ------------------------------------------------------------------ # Parser resolution # ------------------------------------------------------------------ @@ -334,7 +355,7 @@ class ParserRegistry: mime_type: The detected MIME type of the file. filename: - The original filename, including extension. + The original filename, including extension. May be empty in some cases path: Optional filesystem path to the file. Forwarded to each parser's score method. diff --git a/src/paperless/settings/__init__.py b/src/paperless/settings/__init__.py index 011f776b5..1c33db7c6 100644 --- a/src/paperless/settings/__init__.py +++ b/src/paperless/settings/__init__.py @@ -121,10 +121,7 @@ INSTALLED_APPS = [ "django_extensions", "paperless", "documents.apps.DocumentsConfig", - "paperless_tesseract.apps.PaperlessTesseractConfig", - "paperless_text.apps.PaperlessTextConfig", "paperless_mail.apps.PaperlessMailConfig", - "paperless_remote.apps.PaperlessRemoteParserConfig", "django.contrib.admin", "rest_framework", "rest_framework.authtoken", @@ -974,8 +971,8 @@ TIKA_GOTENBERG_ENDPOINT = os.getenv( "http://localhost:3000", ) -if TIKA_ENABLED: - INSTALLED_APPS.append("paperless_tika.apps.PaperlessTikaConfig") +# Tika parser is now integrated into the main parser registry +# No separate Django app needed AUDIT_LOG_ENABLED = get_bool_from_env("PAPERLESS_AUDIT_LOG_ENABLED", "true") if AUDIT_LOG_ENABLED: diff --git a/src/paperless/tests/parsers/conftest.py b/src/paperless/tests/parsers/conftest.py index a484f02c8..8747ac9bd 100644 --- a/src/paperless/tests/parsers/conftest.py +++ b/src/paperless/tests/parsers/conftest.py @@ -90,35 +90,6 @@ def text_parser() -> Generator[TextDocumentParser, None, None]: yield parser -# ------------------------------------------------------------------ -# Remote parser sample files -# ------------------------------------------------------------------ - - -@pytest.fixture(scope="session") -def remote_samples_dir(samples_dir: Path) -> Path: - """Absolute path to the remote parser sample files directory. - - Returns - ------- - Path - ``/remote/`` - """ - return samples_dir / "remote" - - -@pytest.fixture(scope="session") -def sample_pdf_file(remote_samples_dir: Path) -> Path: - """Path to a simple digital PDF sample file. - - Returns - ------- - Path - Absolute path to ``remote/simple-digital.pdf``. - """ - return remote_samples_dir / "simple-digital.pdf" - - # ------------------------------------------------------------------ # Remote parser instance # ------------------------------------------------------------------ diff --git a/src/paperless/tests/parsers/test_remote_parser.py b/src/paperless/tests/parsers/test_remote_parser.py index 69199a6e8..892915bb5 100644 --- a/src/paperless/tests/parsers/test_remote_parser.py +++ b/src/paperless/tests/parsers/test_remote_parser.py @@ -277,20 +277,20 @@ class TestRemoteParserParse: def test_parse_returns_text_from_azure( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, azure_client: Mock, ) -> None: - remote_parser.parse(sample_pdf_file, "application/pdf") + remote_parser.parse(simple_digital_pdf_file, "application/pdf") assert remote_parser.get_text() == _DEFAULT_TEXT def test_parse_sets_archive_path( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, azure_client: Mock, ) -> None: - remote_parser.parse(sample_pdf_file, "application/pdf") + remote_parser.parse(simple_digital_pdf_file, "application/pdf") archive = remote_parser.get_archive_path() assert archive is not None @@ -300,11 +300,11 @@ class TestRemoteParserParse: def test_parse_closes_client_on_success( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, azure_client: Mock, ) -> None: remote_parser.configure(ParserContext()) - remote_parser.parse(sample_pdf_file, "application/pdf") + remote_parser.parse(simple_digital_pdf_file, "application/pdf") azure_client.close.assert_called_once() @@ -312,9 +312,9 @@ class TestRemoteParserParse: def test_parse_sets_empty_text_when_not_configured( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, ) -> None: - remote_parser.parse(sample_pdf_file, "application/pdf") + remote_parser.parse(simple_digital_pdf_file, "application/pdf") assert remote_parser.get_text() == "" assert remote_parser.get_archive_path() is None @@ -328,10 +328,10 @@ class TestRemoteParserParse: def test_get_date_always_none( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, azure_client: Mock, ) -> None: - remote_parser.parse(sample_pdf_file, "application/pdf") + remote_parser.parse(simple_digital_pdf_file, "application/pdf") assert remote_parser.get_date() is None @@ -345,33 +345,33 @@ class TestRemoteParserParseError: def test_parse_returns_none_on_azure_error( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, failing_azure_client: Mock, ) -> None: - remote_parser.parse(sample_pdf_file, "application/pdf") + remote_parser.parse(simple_digital_pdf_file, "application/pdf") assert remote_parser.get_text() is None def test_parse_closes_client_on_error( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, failing_azure_client: Mock, ) -> None: - remote_parser.parse(sample_pdf_file, "application/pdf") + remote_parser.parse(simple_digital_pdf_file, "application/pdf") failing_azure_client.close.assert_called_once() def test_parse_logs_error_on_azure_failure( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, failing_azure_client: Mock, mocker: MockerFixture, ) -> None: mock_log = mocker.patch("paperless.parsers.remote.logger") - remote_parser.parse(sample_pdf_file, "application/pdf") + remote_parser.parse(simple_digital_pdf_file, "application/pdf") mock_log.error.assert_called_once() assert "Azure AI Vision parsing failed" in mock_log.error.call_args[0][0] @@ -386,18 +386,18 @@ class TestRemoteParserPageCount: def test_page_count_for_pdf( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, ) -> None: - count = remote_parser.get_page_count(sample_pdf_file, "application/pdf") + count = remote_parser.get_page_count(simple_digital_pdf_file, "application/pdf") assert isinstance(count, int) assert count >= 1 def test_page_count_returns_none_for_image_mime( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, ) -> None: - count = remote_parser.get_page_count(sample_pdf_file, "image/png") + count = remote_parser.get_page_count(simple_digital_pdf_file, "image/png") assert count is None def test_page_count_returns_none_for_invalid_pdf( @@ -420,25 +420,31 @@ class TestRemoteParserMetadata: def test_extract_metadata_non_pdf_returns_empty( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, ) -> None: - result = remote_parser.extract_metadata(sample_pdf_file, "image/png") + result = remote_parser.extract_metadata(simple_digital_pdf_file, "image/png") assert result == [] def test_extract_metadata_pdf_returns_list( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, ) -> None: - result = remote_parser.extract_metadata(sample_pdf_file, "application/pdf") + result = remote_parser.extract_metadata( + simple_digital_pdf_file, + "application/pdf", + ) assert isinstance(result, list) def test_extract_metadata_pdf_entries_have_required_keys( self, remote_parser: RemoteDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, ) -> None: - result = remote_parser.extract_metadata(sample_pdf_file, "application/pdf") + result = remote_parser.extract_metadata( + simple_digital_pdf_file, + "application/pdf", + ) for entry in result: assert "namespace" in entry assert "prefix" in entry diff --git a/src/paperless/tests/parsers/test_tika_parser.py b/src/paperless/tests/parsers/test_tika_parser.py index 010969259..560527934 100644 --- a/src/paperless/tests/parsers/test_tika_parser.py +++ b/src/paperless/tests/parsers/test_tika_parser.py @@ -77,10 +77,10 @@ class TestTikaParserRegistryInterface: def test_get_page_count_returns_int_with_pdf_archive( self, tika_parser: TikaDocumentParser, - sample_pdf_file: Path, + simple_digital_pdf_file: Path, ) -> None: - tika_parser._archive_path = sample_pdf_file - count = tika_parser.get_page_count(sample_pdf_file, "application/pdf") + tika_parser._archive_path = simple_digital_pdf_file + count = tika_parser.get_page_count(simple_digital_pdf_file, "application/pdf") assert isinstance(count, int) assert count > 0 diff --git a/src/paperless/tests/samples/remote/simple-digital.pdf b/src/paperless/tests/samples/remote/simple-digital.pdf deleted file mode 100644 index e450de48269ce43785b8344c63e233a1794abae6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22926 zcmeFZ1ymeg@;^!l!6mrE;Lb3(yL)iAVQ_bM2@U~*y9EgZNJ4OTf?IHc27(3mH{|=> z-S7V7z4P{+J?EYO***+?`*z*Bb*rj-daCNvG^&!)EFe~HWSZ{c?w0P)-Fe9D05*W5 znGLd_AW#wFVCiNB;DGk10i~_&+#oJMX**Llh$IB;Xbuq;Ms{^`ftcDOdu6l44>H?6H;@?p^vKWPs#P#ZGbM{;Bcf{BGr+ELKNlvYYRNcNgtX+7@aLXT zMQN!S?3XnMOGXzd6?Y;rsx^sOB+DXSS48V9%8C_*Nre0Ge09*fJ;tB)nym>uKSOw1 z2i!o0IGFz_FtqiwM&zfZJvBhw+)rnJ_woEU1@Qha3iwk&AOMJsm!0je>e%A*b|c=( zS#^}IgXn*zCa)u*nWXP(wA20EkL1j%VyEC?M)$S`K=_(QzmCRCLHrFiECjSQtYn`iKg zf}%nOaWK%_&+Ku&A#j>Q@-?@j>#2p9dZv4QKhun z=@em(Dge&env$D{x9Q_-*cI_>U>>Rgrg4#rb67eijW{P8;mu->2nuC92$yD~)|^om zof)g{JNi%po%qS2uXL^$$;LVc720v6ksjPB{pbm!yHQ(d{s&oogF>puBi3^YH8K8~ ztf=^&Z>QNYfr%PP%}Ba_X=avrD9bVAkH*pka_wzWhja;v5}TSXTYZnCH!OGA` z3&Wr_z7-7B5)oa9ALHmvT?5AkgZZZC23wcJ>T-OElbRVKU0r;Baq_`7Pq-kT3Z{JZ znzD>tk*w~s6hTUEMXXn7y`Gwr?fjkxs;nIJ_~l-gs<>$-h<Ro53Nw-;(BpU?f_z^C3`oT3wrR`6@gqyKrECgMXzc67xJHqs zAT-Dx8^>$LdmKT)E37b`Q9HMosc9RLS$SU}H%%K8sPn~!;@wJl8+r3Ni~|WNKE`!R z=<|F3*4*42fu`oqj{85Inim%J8su5@xg8h26nNi<@6U2i3+$78s?@4}*VfUtWWkk6 zeAe{ldtn!>Qb4X=udArd3&K0rj2b-D!=Pmdh8w@li!_F%!*}lAmIHJV5!u@`n11Hu z#F}Fagcv7kuQ4S`TnuB$$LG*7l+ct^QSXK;nPa<~;%{0m9&|Yq?448ky<0xS-kd^R z=`@)^j=-TZt1p0$iI!&iVt%=D96Ou<>au%fn$^mpvHOmuK3obBkAk|UuHVvh2G0bh zVd#_TTdGX6Jv;Kv{=TJ2sA4{=8zx zVGa>A?xEGeV@B7Swbkd+ z`Yz5K(Xo}_Tt4>o8W?%ftQ37A^?FYCHR{9eQ0jBvmGBcLV z7USBIYAT_SguJkPyK>eTf=DHgI?IA7lk=OMias-*WM_{oKsStX;f1tbxPT*rG)H@JdR-qiMbg%YftI!VPiy zZR^}EJtn@&S8k+jFr_tRn+KzvT{naNdgcjyzj@^-Cw4W{vM74GX3aG zA8%4J&>|DQ4h1z-uCB}oY#P?Uy|GYrt+1K%w)kn}x`2wFUsXPfXf!%W(eEb!UUN;={~aG}&ptOzqXF$UaFB(W2)RzJSXYod?!X>MwuK0cJ@kv?_Z)Wq0~* zGOg&X#OHioX*4tz8_S6BMI3fc-aPx9SV>#!LJ6SP0Y&o|8J_vzMoHtuuMdn&y(V1R zK3q=dZ`GNZv1=&=LdVU94vAbHoVU;;EGI@!=NH-SOr^m`dwB(Y2hn07Nsh@#q^8!b zog){pP5B33E|Gl)J?KO2>I$`2g4eMdGHjsV|+;o9-(THn7OA24?NE{GgWdW$|4i-A%#Om9y@vU~Gu zf_#`FM|CtNfv^t=Vv#jFC!namky9zp<6{Wl8^lNw%}gptv8L=)vGr7JU$w5d0xfO@ zO`Hb6y3uS@5GCb|O^vME)$Um$SdSk5l-cGS^vgLtmnCt;I?6gFaT1e^Kycs3X~0)8 z#@Ld>x3EadXZ=fh*Sy_b)t4{;X-ds?7e@fOpdJ~0__})@Tj!i~EmyhR zMIaQ*Gq&r}C!;53!hbq4PU6b(^$S5J$HvCwPj~NadHT7-)7`vvRWj>x(94OQT=S)QiT2GGZDghdV$l(WmRmJFIsV5<7Q&=*@b_>z0*3@5vvn##f4+iAtctFB4n-0 zwal!;jo%)3jY*cxR)?YS9BGm&4jLFzMgE%Zds9|GHgwt$G;dYa(PPb(`E&Rb*J(?S z_{*t4;H1me92Saibz9)2`y4aeaEOjeuoRE9t$Nj#&&W$5r|$}8Eg86;nv zY>xf(Dh_F-t`;Xnc;xxNV!5UqHMfq0Mn~fae3Tz`4iS{D8W|NQbS!2j1 zFH<*9e-3L`+3Q8VSR14DPu+Z%TC5kTag`HZQN$w}xA&Ek)xR!ydk{s_4Go>SZMbzn zL_!NQZ`ynqXsi}XRqLZv8&^~H(aUdJUdVX!Wb3r=2iHsE=MP+Ky3f0aysXerYl3sR z5~I>gd=d9wF?6mJ6Nf#spfYIGs^W}}v(3s@?XPuWV*1IXJ)gFtnL^COB6#`zXTs8I zjVGs@;mP!J+c-_!s)%4fjqBG1$)mOSoCb_f^J1>2>yVNogSmjmRHb3NgQCNlWix+| z$sg8^D~-jq)%N)JT%m5PZNtW+B61^Nnib_);Fa7z$&cGqY6z0urs1<5oo6tjMwHBh zLT5Uxy+ebokmIfyM`}Yfy!<3ZTCpOuLq1}?{DPAe)JsR}5mWMY)a^u$BWv&snUh|Z z@w5RenTyjt7*A*MW61mAPy2v&IL4vgK6m^sl*=XlPajm@ruzpjPB@b8&6E8!ZhOcJ zGVt6uW;rN|yGwpNKIh=k;PasC_;_3KzGd&CgJ!hc@&E-d)yGrgbLMkskg>WWifmaok5-jbv%Y8R!_ZR!a*c(d+@u|ReL8tA^_wR4s z(=t^yBG?}G5mo>c1}UuHA&WLhsuxu1Sd>%h>@wQo;x$#s>+9K^UCE#8x!0)JX4ePV z1sCD*+67yq^suZo1ogxA!0I2<=;p7$hP*h#OSg2PPx(e#C$Lc>?`kEZI6BfLi$SJO zjJt)G59v2|fqDU8FJ>>^UfrMHs7BPnfo3i=cG%(VWP5TAq^)XV21 z>6;rtTl(aT+79zB=gbYc&^^nVu<_A&2Xe&RJh8r#PMxAtj2=F z)%fPs)dVAg;B8O)`^^>5hk(N#67s$PyzgN`w1&2-_?TSfoYwM!!g0AwmnPyNNUxEU zGdjQ_KG?fTY-8g)N^Je5hwqTkvrHD?oUyNz02zSybtl5ozu44-iuMSpv>)lG6f4(H zCxLhD77fEc*}vi;X4N!6E_&~1A$gs;Yve||em_#RSFR3h6Yjd>=9CVaFK(>8{5wA! zKjaDD@8=nN@71b1-k<$AYee6E82M|*{myK$S7Dr2yYe_m6F!X?Kf@arw%S@Lck%O4NiFh)aHP0`uSyE} zzVqrj;R7Q2We;?xXxoRme}!`>0F&jz_Z z+4Z{~oZjNYI|?`TY}u5vk?2_o@$&Ar9*%ca``_lrUe4KB*;HE_UKP0{o(jKXVAguS zm??JaKRl`d!4R~I&*nvK@8{E#-!86{)6FQCt^CTf1*~W8O+HjJB&3v1?$@@eqAvj# zm4QzUQCjSS%UFWQaZ+DoVm5ZeGN8b*u$csVpm6H0!J?!S61UqK9D1U)Ta4)gZU=`a zU77grJahcUgf4TnJ1nQvW4@gP6LXRM6#^`!0#*5iP7e2R2vXlZDxQ&NV}PPF(@o>dC__(T55|`~t+14O#brDBA9x;pGlC zIt@R7J(&;skAWXW9<%BL2Mzt0YUGt3VXHfjly1aZ{T4%F3{r4IP9N?n$87sn305g* z7{!MgE!4V!RL?bXL?rn!f&C2#-is$IQOC-DS+C0ASC!-G1LXpdJ-XDFi0=5hTEAkP zv}<{5TvjT1XZ;GuxUBxJsX~b71ikv8*)L#9xQV1jh`h9Y+0p zbeVCkVQ>QJ4%^~<31eR8ncCGnt2xE^h0nnDQmmJWO-5eB|}CM)u=DRO#rwrrNJlnQ3GDQG*v`~ES$4E(xmH{pAOhk;6c~hK@@-&o1!BJ87^L2x~HgP5i7gB1bZi0mJ$O00#VQur~ zfSb@JH+r2cP*wTMj95A|U)|XFO)E;A=)!tYHa4t`*Tv&{yordhX1yQmk|wAt5%I)d zBNU>~X;9)}m=@!^yXE2bz)a03_R(GxS~8NNg@;U2MYQs82FveyQQ|F1oD#;+u#KBA z{v3$%W5!b|uu(*W3r*+MV&dlKlDiFqC__R}Vrk6=VpQPNtRU>V_{t^UiL*!jZ!czE zq|C;eS?-P3oeq1I-=8E-Ccu4S=bMN-NSK^es(qNGzG-kr5pu3dAP&XG3D%?F$ly(j zMqvh1=gQC0P+_~*_I#=DUshU>3ya;z>AIE2q7Xlk#yW~gzl26iMH!1Y|86GU+i>iS* zEN(?Bh%T-N$i;cDD8GDF`|8Xd?hKb$mrDJLDU4l=mf|JCiZNuP@~W92WyFODR1NPD zn7gh0EiRuXSd+h(mvd4M@1Cr`(<~?2;(QA*I4(8L*1O#G-@OI zDRO9j@%?0Hyb(7=Rmp^duPm~ZB^O*!*FUID4S!fc!V^pU0dY|%+!^y&JGCszlWIu2 zUh3S%QDHY?`YuOPV<_fF$wP_^dJsDNE=kmsd zBmG7+@)hcp)4s7n$s>+9{)o(NZfRrZEFbt^=*&#zyT8;qZmsoD5o9%3)&*@6r^ zm%bGXWtg1My4uO;e(bc1|6!wEj?}Bpzk&3b{9y3HGWM%}Q=yo}*OM1qdkZ`CPkW*O%DR3o%(%G_(6lTi~BdHmdw zjg=M}x*YEEBctv534OShxFd$-QFhG91mK3co1$-;JgM~o967uFLhrH;@SPz6OY&P` zr_AG;t`E5xE5Na@ltOWsJ?hN4)Rhp@VN;T8q1}S4+=8iguB9Lf|4}aewQu~e6tFKN zoYkbO*60LG(^0#$>IkX*6b5X2J&C`c86sp2at_%`-{AG|Q20|F=4knSURw^mWbvvz zR#uoU3d3Gie&Go)iXj?X$DUUzXOS&AI(Y5*y;;J$Iq9&gL7}sOBHrN$kWJ!3phqwv6>k} zay@rFY5dW+v!nd=>zH+E9`7C8>Z=W)}?i- zd;v3|?}A;cuAVvPhv+fq)dJdjD$9IfM+pYV^=bGypcaT7$$t`|JF@zEJzdHWM^gX z>vwzR5s>Bk=~F$pRddetz{x{!?!=O-|ny^XIrdD z2V@1aoNqLZ<`NW#H<+*9@NUDc$#j{E-$+Iek;fj6izKqU{`ox@mtp@Y{%wRL` z`oPTn8N)gHpf`d!JFi=6m&Uukv#8}xTxAj~k4Gs^#v_jt-^JS980*?D>Xp7`MVN8&@n+X(`cc64x)gt&rT ztexB(p_w1(p|Ytx1Sl@{v@t1Kn?YPm-K-rQ)FCd`7RXPjAxl>PC$s^j6c=~&(r4k~ z^wXGK3qV&`N3 zf5=@KCJj4u1E9GpzZb)9nAb_X7=v{ww6&X3a{A>c;~5#g z2n27yt~OOjgO%i(C}J0VHW*W0r^uTxs{5ju(-z)2C0J=o>_}p@9tgf5AX-d-FuZBd z$qLEa`kvp9BKUf<*Y>#2XzTmNeBYN=zRMTS=K<=kG}R=?Zw1{C8;JoFb9EE7c3my8 zZ$&z9e~ND7So+~|*`ynkb$DJN7b;H4zjZf6`fy{+!Zh#lW5#l)h%;uAlVw(OGux|P z!U%MfG}p6;>mrt2Hb6XUKA=CVnn${WvMI!|g)zeQi;Cl1urBS4ZZt1(Y{YUib4+Ne z=&+%GXZio4Gx? zj)sdnJUN4+>7Q*77cx-W+T6{`Ri6jyINVUXaA#VCWXl50t0r7G({3ri} z5Ksf+(6f|uM zlz>VMozfNXTj;-DKb-#%P#M7Sw+t|d>$hzG_bK4_nVK3}hPQ`1dMZ4EZl2IT&jvSH z&xW9nAppi4O8Kb#pdfnW*CEj%h>Y(L8R<;`@cHx~yxTp0p4?+xJld@y>_5cWjyBE; zRojxW!dxwP`*nj&`C+=KzMK7wJ@?8nH1Gxu2f@4xLL~@}ZE&Mtn4iG_LC1j~#vV;p^V6MRt~AjvP#y%j1EWc96Oe>Y zI!&G5bYebw%Co3(=P z^oDtP3WF+hcj>pu2cyA_aW?fh1GoPye-mchbEiF1p~05##4< zqOdrk&rv&`-F5m?kbRNl(3I{-81)mq>n+|<9tpAaLj9Is%_mh}BEiL@G8URg2^Vu*f1zhM!SL3?Q-x zj{sZ;u<9c000INg_~H1(SQD8x(Y?hZDI5pze?`I;0O;Y6Ln-rR>4~DlzZbyKBk{wQ zh|3hX(PIxqxD;%t3cJBFhDGO3se&|+QzdX!aW$ULh@GoGcY9_NqL&{tPV}U zkB`J&H|NC_Mz-wwb`0XhU=32~DqA=Ef?6F^xvuwx%pr()-QtSU52+2+vrBv3=nFYn zkYi`}F`^*yYGnU9(iKP$O(fKEJ?+@m3o`%#*v)h-bH#Co`+)A)wRnu)f^tM<0*4$d zwT4LzM;h|1Gt5NF3GfB81@T!JTS!Ers4Rs!CNd%6POV_jY z*G^(zs9IhMBL+&oq{P7tel6WYfrTma()u;3BpxMxQY5`74#g-y9y9edQID?V^Fqvt z5Gx5c06(TSrvK~x*IBPAdJxTUPGC+DPY6J9UJ>aME#l0SD-alfONSQ~zB+klu0h0z zofyV)o!&H`22};_Ong&FQ*=`VktkZhVg6wOSs_`Gg=+mf?RQesST--t zkH! zuxCm4xZ#)YMJeS*r{ci_prnNj3E$2+81xuUz<>?QVaYL zGY|Pmf!4c7H0C;u;5UlzZBmZ+AnmzW*MF3}r8ZbNS4Z^IXR zySAP0VP-k}#VtK5>qMoN=XHI#jGftUe_5u$?gP zE`cthbtco~<48nIkR(=8@PPCt4Kg;(YZpn}LcEDYE9H+g{Fp+o1A1PX;edkErAKJD zu~jgKqdxVV_Go>_H3K>a@rt*oWK#=MwNbXwRAbFWW%YAv_rKPr=qT18O-+-iCikt_Z_-+guRMNQ)`rSGsX7T>uBbS&*m@FWlJdv% z9~?grtRqpAK<4ZjQ6pm8bW;P9<}`J*--7I#w+=kpWOHG@M&wJ*mSLq#OR^or zAF$tKbrJDS6qFB;%%y0jZl|ev)BdJmpc#icT(m%Kp1uVKGa5%KsZea9Ed7-o!zd0= z9)>0xOGd81{M9dpGKSO?A9;?F&`Alx{8-gK1{HeO6saMEA^aiQEg)$Kx{3@mK)z9e zU65R=UN}|Ekzb!*U*=kJT7Xg-Q>aj=P$nR)EvYT7Ei)(U8Fk3GjMjwNgy5#`=IR#X z#^ko|rtj8#M(;x@L?wjK3e!r^O47>M%G!$5iq?wViti8bhx3Q^C-P^#m%CBB(Yukp zQ8?57fv_vH+yA5Nhw*rOiE+_t{-e|j4dzsFNWm{vsds7`G!=L=uWh7+B+v72)Vs@1 zra5iUKPBqPzc1ldTPzov&YEtXmYFV_)}E%>quaySBZr539t_<=#e&4L#d5`RI)gex zI)giNIuj^jDdH(oDIyCJ3sMT=3!(}_3)0r{y6L;&x?Lk)L|~xqqw1sH#u7*)Q=w1+ zi|C6`i;#<0ix`SnikONpz=&XGFfy1MOaW#9vw*R|2w?IJzy`qvxKFo_C$=(nl^~Eq zOwo&$5gQ>HCK)anHkme=A{jRsI~ia7r8cEn($Yh-d{XoP>Hbi`w%dZcZ{bmU}2CL;lqXI5?QVB!F78xrjB zOY;u7<~yZ4Wjy8CCdGq8NeWL2kC953%9IM1O6!g7&F#(U&7%pSNumj*$ty`Od0P^- z#XijS*7Pj`^AvN9&RgBK4|esiS|m)VsiB&Qn$emWnvpXpGx0MyGkIJgTuEHX=Ww=2 zwk)xWj0+m6qjpS$Bt=xRCYPwQf8hwE+Yh-()=G}qnMMb^{R zS=Qy503jm7D_twS!X3gx!h^#75ApXLx3ssy2=Sr8p)nF+5)l${-9g>a-5K4HRIyaK zR5?_6MPWtpMd3v;;2?0y2B;q;o+chhvY7pnE;u!7g^>0oEEd?yeckD+av&VSx`Q~^7T@Ia18{ZjZ8&De58SEKE7;qa@8w40684MbH zGmtV!HP~t7|5EL|yzSF-p1sd9M^~-n&=I#|@qK$8Z$oQs_B;31=bej9^zZRo${VB5 z`(^cp!`9(;Td#kDZ>DdqZ}_dir7;;QMrvfTOqfi(OlW_4e|&!qT_RlsUFr_63P^=i z1x1Btj3xJ0a7wVoTgyA(_~(h4H=$Rfw{;70%R-Aq3wn!D3q{LG3t`KPmaP`FmV=f# zFBva7uN|*6uQ~6)Q;KVPzn^~Me(ZjGe$sxQ{SN(t{Xl*)*T1giulKGOu6(W|uE|cm z{%YO0?YfL1A5>Yl+`<2zwm!GUv)!<9xrwozu%WU8Tm$Ynt{tr%?X-74ra#g=B0MOlK(lsF~2B3!6eM2&ZK&cuv4#7tCOsgqBAn2K13m8KSV&>ilX9W!%HRESF+jz zY6DUO#`N;^n)E8~Glx|@PceNBPus_T;L zBESfij;noZzwA$r71lqb15k(ktn}WmPy)3>Ph-Y zMo5uGwY>BO{!%j6#sLm7GXfY{Dp+kO_W(XRoCch_XX#e8ySft!g>#Ze(aKS6c!t=^ zg`J$paiO&G>iIt=nXRiois~`5glfrF7IIBBSxbDB`N+56yTG%MOCT1jsi>-`rKm8X zI3hQq!mP)v^fOE+T&GAUZJwppxmLFpQtN2u``ybK&soe_*O|rH)!EWH@Py#R?L_>9 z@r3ro;e_Hu<~y)Q5cL2S305IiG?ow6Ec9!w6AKCJ8&(<3sJy|O-86#K^tU=G zSCq9>QAy@0o5?9}rxQ6--BQkyW8Vrg>H>6WzA<}i{`$OGyva1kHORtHjMIwKkP?n%tyZa~KZ$7VW9?v#WX)v_{vk0bJo#!;rUa$9 zvRJ>^w^*jQtk_r~@XZ5D=v&j2^|Yk76DgoH=Om<*sN}&nd@Qb7rH0#0BSIOL>UF6AnQQD+vTM0APVbV0F7^Jsm(q(953TGsJHKbjkYNNHM z*;L6{bf#r3VQrjIHB!P{P*rVL@w1BLU3PwUr9p+CSfl>+=U*wm3V${Isz!blE+M5T zrP(XlD@P+rV?-lUBDvKfpEhKl%8)9R>Yi$-S;!b!@uecOqP(KsCf}xT4>ZF*BRxYl zBTz9_;i%bO{){V{C?PW?voy0Lvsv$*Ui1ReC!0?(HupA{GZr&i)1Rj&_7wNT_mKDC z_b&F@_CR~OdzRD0(*iS*GiB5GGwl^e)`?tSxTv`}xtO_@xVkvixR5z*I9aWi#tG)U z%1>TxG|(z1DNt#q2ZU9}y({TWX>MoK|aL3dbZSdK}R z>DB%ht#GZFS+4iKdi8otdW#DL_IUP~_7HopJ>7xm0ri34f&78iLBPT70`TM9$H4tH zw|Tc7w`sQ#Hv@NZcQrR;Hyif_cZWU2-Im$w!um3W*{#{s*_qi-vqDwGC0XUZ(w8j` z4Tq%5gv*fSJRf=?S|L**8X>R{T`QoKy4A1Mrj@((S!<-vsgLoQ$NAum;LYR>|IO!{ zl^f8_x0{lixSQ4+@J;;<(@i_76Z}v3@9=x@c<^NKnD9T~%g~5Wo6w|DEl}U0aidK{ zFh>+dR76-rI7FC6SVu@joJZtDG@zBCrJ)8A6~yYqO2%o#jl?d+cEwJ{Dih{#?6DJp zGC_LW3+#Oa^+Z##GjS}jLa|h_9I;~rc|3<8GOhrJ7Mr_8IL9t)O6x*%CwAD$DQClw-gLxi`NzrB@&(@2!;rw}P{Rl7g**Bh-`z!^p!iZ+TegSXOlc z8pQQ#btbB&-!s2&sWPi_sTz9Es)wedq{E`;-yp5Wp+8kM^ZtDmhJL@!j-IwogYN3b z+>Zga_ucUJ-8NJXMb=>O1{mAXb*XfrwA*69V!`5@#Uh^Nur-r?rR}~6u~n9xzLmb? zBE)yjW7gyAMGa|h{Hk*2==|sm>k?~s^?dbU_3B~4a>z1|Z?RCl&{w1Gm4%gl;T7Sr zw!VkDd;8n63#JPJbZP`61aAZ?1pG+0NViC{NZQDN$VhY)^i_-k^jb13kz)6Oi^Ru* zVu=@#qhx#hoIX~E<7E=Q@ftD|GPp9XGQfU2Me@FElDN);ildbzgm(eQSv^5IPvTUGT$n zfBne0r)XfKMJBIbB0(yFJXc3WS%pyLxeET6(-`xZ%NX|<#Telj?pV8#n~}It1@smv zY!qem!f2<(r-jU`_2MRgz(0NC!Nu9ynYUfD<#SMDt zleMXiPaXGwK0qztAYVd^LX1#sODrwK0YM1kh6EL%9!>#%A3*>?25tvV`-L$Q8Cn2t z3uXxVI%*OM2x7-4Fw#AR}D` ze+AQ?(X{yVn3XtZ;79q7?rx%PHg0lm`e#mOc4t1Q>=9JbtbNpdOtci+=8E8vxO6&D zCFr(xq!z38rnb6vqSm|iyw<-KyLPx%!1>I%(0Rc*-g(`b&zZ}4*%{;eN{@Yi@<#Xu z*9Pf#iH-X2mEQ$6j(UMTjx>o_aM;t>Ke5EI*s&S0tErb1bY$lhscDgEE9e$zBB(8B zwP-zPR}>6nm*gpFkZ7!_`KZHbAvBtF?leNOKFMcH8E=^1RHgn*CrQfAGDurWzN7bM zxE{ldpfZy=i~m9vCHy9^cwP1}shp~k0T50j1ub~!Wul=dp)cWsux)t{`7ko3GHE`2 z(TQ-ed}97Y<<99Yd~QhuQeso0`bxpV%tH5``#qgK<$?dg;j7Z3H!^4mJ|uA>KEJG{ zCOV785~|CJrW&VGr`}IJpPHItniQBiDr=W}%n{2I8y^4a^!4>1Z;~?w7_ed8x1(rI zt6geVs%ar=;bS3XVYz)j(vZ`rptcTW0Pg zr@hgB>&bUyw35}5;}_u<+-XdAfcn3pd=;UWGQ)*lsyU8Zax2y!ud z=&^WKBKlFZrsF-J4f=%r$)tEqv(tj2QT3y0&G>t^wqp%b+jZG>zx8doA-M&)*5pGv zY~@^G?~~1(14qDQ0u%KV<;fGLOZUL%5W zgGC)Epn<39QCL-O_vI(#n+0EqLDkZSrOG>5Z(VQ8Yp?5DWYx}B1v;kcn0n4tg#~8$ z-@SVqfnAZ8F}h|JdgP{~j$<7dWj#{G)Kilquy&F7k9m2H~Xl~NVw6+)HC zl?s(L8VTC%HP5)RxrVqrxYoJ6x#GAaxPZ3Ywm)oXY~pPFZ4+j-W-exxX96m^r%&dr zXB($`XL72WHF&fxs~s+x7j?tyxh*Be$V7Y}ey)8>v*g+Tu}`z7wCBG+wQsw3yH~b9 zH?}^Clrtr?6Ttez;78-AE5_J+P5_Y?(KHbWu^CY`(E?E)(F*s^TuXr(uayhGtLwW{ zr5(q-K>vr!7o{k5_{=~!VXD^`9hSFKS?)U)PG zn~Nzc8dKA&XCJMLGUgR+x$Q0-gcl5!m*xbg?mmT&Q!bc|yL_Q}Us6$018Lf_Wh&78 zIFmoq%=P|L)2ABu((`?(?@|j=-7&)W2}V_o^MNNndL8XIxof#MxZ6L+es20qY+r9L z!a8C2rp4TY;aKgW#5K*q(8t@lIj7dJbh%Eb_}2YzS+R^Cq63XSTGnU6kaFtL*a}ULK7dI_{G11uj4C@GrWj?#It< zRO1^TwFrCP52JOVEud`>KjU$6$ZiMuflvAlVfup>f=)%dM89>+1k*hy<{9Lnam-vr zZOrhjzuw;cTB3i2-jl&X3R68`lpO6&r9J7FXjN{kJ`K4*DDBWMrwZsJ5vn zsIIBrQ(a06FNrNs9s!7X`b<{S}vR-n)7RlwRk z_%iD#VI}Yp=3MkRxbt~C!Z!?7!7rz4%e;c4BGm$iLb-e^Y{G&M+Z0{{x2ih@bKPf= z=NOS>tinryJ*Tp_NjpVF38TV9ejksm97BA?ZM$5*@AiC)>Wm7HYL&~CJCLgxJR7_j zEEwz^yzg&Ga3>=V$UeDR+E`3jRTfkCQ}n$`iGQX8r$Vxr*_MFRhsig1@Et8 zPcpu9^jk)aG3K6&_@3D9@ZGwe?;MUz<>vVdpZPiCjr{t$_w{CUdxZOI{MYIc(;X{U z3)ceIa92{-WLIP3@zz9t(@V+=sUI;b_+!R*K7$u(2PKQc(`lB*=&gRI$UeP~Lu;vz zmEamZVI_-sY=Yv|Hjho?OStRnC^i)9rixGyRDM3&-x2TtDBfgX9L0 z6;P{sz|OD3f#wCz(4!URPK6K!X$3I_y0;5yv}xRL%b^eY@xyY%Gs8S-_$v}eFII@# zF#Pf!A0}_3E{VzCk>d#S2FO0Bp03YE_TqX;IrUo6c$JuxfFU+pw~QMVzbb}phW5VA ztk0BiO=s?Ae$%^JDF1Z$smykf{F|_i-`QRIb?wQ*7SyeOc6KW=1-pUIq0gGrJd2LbtBmbve)?DF{`hwezl6?wCoZdx z#@ZflI!`2SBgYb!$ngUOZ)#7H*UKhV=JKpXhyzyc8=K_jQ&v7MD$Z9ew0yd@Kxw3@ zgS6o`YPQTYoSWHtW;rgJ2v{{cHM{y+_}=381K%49x5wYx+;Uy-FFKa4R$QM`X1lk`0gJq8cws? z&$;keH27Wi9d?nmK*OAE_>J04bL~9s7|>g%(q;E$%;oKc@xjsK?NN^y#e=s&`il;V z7cenMFclTgUZTSUeSZjqVZ#?${htbHo@y(eYC?E9dH(@I2R&7T{Iya<#of)x-A(Ry z-3GMCLq1_J(Z0$R~wZv9k?C1(yT?69`5hPcqXLTf$%a#9l9AU)^?j}S@`6pv1a|_caiT}de)Y{tqH}|J=KnGW#wfS$6pbY<@=7(0>xCwIz0{?ml zo$v4G!Hy0VjxP454q%9|_}|I?+WRCO@JXD%i1+_OI4;s?Qh~h>G&m} zuaAJ%7HT*;+6imBSVLbhAqf1h{l69Y_fCi;^!*dU>}>38EFcgIh*tx|#m~;h&&kWg z2I6OfuH(N@{x2)}L)lP&g8Cou?+*B+@&7Zn|19MHZ+85TMgC)vf0G9O<68eF#s14| z|6`GVS#|%Wf&a0{ze%zGGTZ-Hn-u#m zv;9BEBL9e=LGg@2l%7w~vHvMz_!pq23KTQv4Gmx+16A!z!4P|B@DC_%=Loj_E9&fT z5yrov&i(+8N!dZ{p|DCQl+4t@+|S$s1FAXNL6l5?1K<8!22d3WB>i*pzc-$=0aVccy}W;(^f#kFCslU0chyH`1Ly<( zCY|A50;B&mBKw5hb4C7dfIVd3-w}Jz$m-uAd(c^d3fAVX`hRHl=}^Ma{Rueumnqo) zE2vTe8h5pGw1lo4I@ccvL1dtc6U0Fb{1oif|7|4zP)An};NWg&_s2grDDQt(-QO*s zXzE}|4{>18RA+$7Y3gDt2MtU@-QuYUG5-@D2%X_C!Dd(e-?3;lL+HBx2m}K_zj3#J zmHRJn$v;DSg3?mb(rj#8JZ#V^CpI>2KIonkx`)CtdDx-G_*)?IPdZMCKWMn2w7==0 zbez!f+}wYDpyRnYpdV;Il!T1~%9mXVx@Uv(`aLC79Z#V_dP!(Fkev+#0`Y>l*x7!^ z1?kw>=otPYu9pkM0%~S<4rC~&KQ{n37Z(Q?zyk1R9}gD?)ZkAWz~TQY+=_7iIzwS=we$U&?!S+P!s`D6h(o=UGn;zf@Ux^bR~{QiN51tfzOz8%?u_+(c;KQ zhSD}T@LJ)eXGF>TK0gtN`{OwrawtjqNr zu=Ty=!&Y~Iu{Jf(7qWchg&`<|%RL{t1SLLk>*XB}8ke?Pd;Gj%M2wgYKkM)?7506b z)Cc-o(|s#&`Rh0lg~C4S#JPxi2#hpVu65C6obhw`Ur2K@=FM_GeSBSizlWDuDCw-V kPGfa=d?`gW`dlS1xI->&7F}1o7(8T1_&&7T@9RN#cXxA{fdBvi diff --git a/src/paperless/tests/test_checks.py b/src/paperless/tests/test_checks.py index 3572f02a4..87e64a90e 100644 --- a/src/paperless/tests/test_checks.py +++ b/src/paperless/tests/test_checks.py @@ -5,6 +5,7 @@ from pathlib import Path from unittest import mock import pytest +from django.core.checks import ERROR from django.core.checks import Error from django.core.checks import Warning from pytest_django.fixtures import SettingsWrapper @@ -12,7 +13,9 @@ from pytest_mock import MockerFixture from paperless.checks import audit_log_check from paperless.checks import binaries_check +from paperless.checks import check_default_language_available from paperless.checks import check_deprecated_db_settings +from paperless.checks import check_remote_parser_configured from paperless.checks import check_v3_minimum_upgrade_version from paperless.checks import debug_mode_check from paperless.checks import paths_check @@ -626,3 +629,116 @@ class TestV3MinimumUpgradeVersionCheck: conn.introspection.table_names.side_effect = OperationalError("DB unavailable") mocker.patch.dict("paperless.checks.connections", {"default": conn}) assert check_v3_minimum_upgrade_version(None) == [] + + +class TestRemoteParserChecks: + def test_no_engine(self, settings: SettingsWrapper) -> None: + settings.REMOTE_OCR_ENGINE = None + msgs = check_remote_parser_configured(None) + + assert len(msgs) == 0 + + def test_azure_no_endpoint(self, settings: SettingsWrapper) -> None: + + settings.REMOTE_OCR_ENGINE = "azureai" + settings.REMOTE_OCR_API_KEY = "somekey" + settings.REMOTE_OCR_ENDPOINT = None + + msgs = check_remote_parser_configured(None) + + assert len(msgs) == 1 + + msg = msgs[0] + + assert ( + "Azure AI remote parser requires endpoint and API key to be configured." + in msg.msg + ) + + +class TestTesseractChecks: + def test_default_language(self) -> None: + check_default_language_available(None) + + def test_no_language(self, settings: SettingsWrapper) -> None: + + settings.OCR_LANGUAGE = "" + + msgs = check_default_language_available(None) + + assert len(msgs) == 1 + msg = msgs[0] + + assert ( + "No OCR language has been specified with PAPERLESS_OCR_LANGUAGE" in msg.msg + ) + + def test_invalid_language( + self, + settings: SettingsWrapper, + mocker: MockerFixture, + ) -> None: + + settings.OCR_LANGUAGE = "ita" + + tesser_lang_mock = mocker.patch("paperless.checks.get_tesseract_langs") + tesser_lang_mock.return_value = ["deu", "eng"] + + msgs = check_default_language_available(None) + + assert len(msgs) == 1 + msg = msgs[0] + + assert msg.level == ERROR + assert "The selected ocr language ita is not installed" in msg.msg + + def test_multi_part_language( + self, + settings: SettingsWrapper, + mocker: MockerFixture, + ) -> None: + """ + GIVEN: + - An OCR language which is multi part (ie chi-sim) + - The language is correctly formatted + WHEN: + - Installed packages are checked + THEN: + - No errors are reported + """ + + settings.OCR_LANGUAGE = "chi_sim" + + tesser_lang_mock = mocker.patch("paperless.checks.get_tesseract_langs") + tesser_lang_mock.return_value = ["chi_sim", "eng"] + + msgs = check_default_language_available(None) + + assert len(msgs) == 0 + + def test_multi_part_language_bad_format( + self, + settings: SettingsWrapper, + mocker: MockerFixture, + ) -> None: + """ + GIVEN: + - An OCR language which is multi part (ie chi-sim) + - The language is correctly NOT formatted + WHEN: + - Installed packages are checked + THEN: + - No errors are reported + """ + settings.OCR_LANGUAGE = "chi-sim" + + tesser_lang_mock = mocker.patch("paperless.checks.get_tesseract_langs") + tesser_lang_mock.return_value = ["chi_sim", "eng"] + + msgs = check_default_language_available(None) + + assert len(msgs) == 1 + msg = msgs[0] + + assert msg.level == ERROR + assert "The selected ocr language chi-sim is not installed" in msg.msg diff --git a/src/paperless_mail/apps.py b/src/paperless_mail/apps.py index dd3e71f82..1c5d656e0 100644 --- a/src/paperless_mail/apps.py +++ b/src/paperless_mail/apps.py @@ -1,18 +1,8 @@ from django.apps import AppConfig -from django.conf import settings from django.utils.translation import gettext_lazy as _ -from paperless_mail.signals import mail_consumer_declaration - class PaperlessMailConfig(AppConfig): name = "paperless_mail" verbose_name = _("Paperless mail") - - def ready(self) -> None: - from documents.signals import document_consumer_declaration - - if settings.TIKA_ENABLED: - document_consumer_declaration.connect(mail_consumer_declaration) - AppConfig.ready(self) diff --git a/src/paperless_mail/signals.py b/src/paperless_mail/signals.py deleted file mode 100644 index 8fe046393..000000000 --- a/src/paperless_mail/signals.py +++ /dev/null @@ -1,19 +0,0 @@ -def get_parser(*args, **kwargs): - from paperless.parsers.mail import MailDocumentParser - - # MailDocumentParser accepts no constructor args in the new-style protocol. - # Pop legacy args that arrive from the signal-based consumer path. - # Phase 4 will replace this signal path with the ParserRegistry. - kwargs.pop("logging_group", None) - kwargs.pop("progress_callback", None) - return MailDocumentParser() - - -def mail_consumer_declaration(sender, **kwargs): - return { - "parser": get_parser, - "weight": 20, - "mime_types": { - "message/rfc822": ".eml", - }, - } diff --git a/src/paperless_remote/__init__.py b/src/paperless_remote/__init__.py deleted file mode 100644 index 5380ea5ac..000000000 --- a/src/paperless_remote/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# this is here so that django finds the checks. -from paperless_remote.checks import check_remote_parser_configured - -__all__ = ["check_remote_parser_configured"] diff --git a/src/paperless_remote/apps.py b/src/paperless_remote/apps.py deleted file mode 100644 index 1997b0ae9..000000000 --- a/src/paperless_remote/apps.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.apps import AppConfig - -from paperless_remote.signals import remote_consumer_declaration - - -class PaperlessRemoteParserConfig(AppConfig): - name = "paperless_remote" - - def ready(self) -> None: - from documents.signals import document_consumer_declaration - - document_consumer_declaration.connect(remote_consumer_declaration) - - AppConfig.ready(self) diff --git a/src/paperless_remote/checks.py b/src/paperless_remote/checks.py deleted file mode 100644 index b9abb0592..000000000 --- a/src/paperless_remote/checks.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.conf import settings -from django.core.checks import Error -from django.core.checks import register - - -@register() -def check_remote_parser_configured(app_configs, **kwargs): - if settings.REMOTE_OCR_ENGINE == "azureai" and not ( - settings.REMOTE_OCR_ENDPOINT and settings.REMOTE_OCR_API_KEY - ): - return [ - Error( - "Azure AI remote parser requires endpoint and API key to be configured.", - ), - ] - - return [] diff --git a/src/paperless_remote/signals.py b/src/paperless_remote/signals.py deleted file mode 100644 index 2300be760..000000000 --- a/src/paperless_remote/signals.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -from typing import Any - - -def get_parser(*args: Any, **kwargs: Any) -> Any: - from paperless.parsers.remote import RemoteDocumentParser - - # The new RemoteDocumentParser does not accept the progress_callback - # kwarg injected by the old signal-based consumer. logging_group is - # forwarded as a positional arg. - # Phase 4 will replace this signal path with the new ParserRegistry. - kwargs.pop("progress_callback", None) - return RemoteDocumentParser(*args, **kwargs) - - -def get_supported_mime_types() -> dict[str, str]: - from django.conf import settings - - from paperless.parsers.remote import RemoteDocumentParser - from paperless.parsers.remote import RemoteEngineConfig - - config = RemoteEngineConfig( - engine=settings.REMOTE_OCR_ENGINE, - api_key=settings.REMOTE_OCR_API_KEY, - endpoint=settings.REMOTE_OCR_ENDPOINT, - ) - if not config.engine_is_valid(): - return {} - return RemoteDocumentParser.supported_mime_types() - - -def remote_consumer_declaration(sender: Any, **kwargs: Any) -> dict[str, Any]: - return { - "parser": get_parser, - "weight": 5, - "mime_types": get_supported_mime_types(), - } diff --git a/src/paperless_remote/tests/__init__.py b/src/paperless_remote/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/paperless_remote/tests/test_checks.py b/src/paperless_remote/tests/test_checks.py deleted file mode 100644 index 0512fb257..000000000 --- a/src/paperless_remote/tests/test_checks.py +++ /dev/null @@ -1,24 +0,0 @@ -from unittest import TestCase - -from django.test import override_settings - -from paperless_remote import check_remote_parser_configured - - -class TestChecks(TestCase): - @override_settings(REMOTE_OCR_ENGINE=None) - def test_no_engine(self) -> None: - msgs = check_remote_parser_configured(None) - self.assertEqual(len(msgs), 0) - - @override_settings(REMOTE_OCR_ENGINE="azureai") - @override_settings(REMOTE_OCR_API_KEY="somekey") - @override_settings(REMOTE_OCR_ENDPOINT=None) - def test_azure_no_endpoint(self) -> None: - msgs = check_remote_parser_configured(None) - self.assertEqual(len(msgs), 1) - self.assertTrue( - msgs[0].msg.startswith( - "Azure AI remote parser requires endpoint and API key to be configured.", - ), - ) diff --git a/src/paperless_tesseract/__init__.py b/src/paperless_tesseract/__init__.py deleted file mode 100644 index cc0b886aa..000000000 --- a/src/paperless_tesseract/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# this is here so that django finds the checks. -from paperless_tesseract.checks import check_default_language_available -from paperless_tesseract.checks import get_tesseract_langs - -__all__ = ["check_default_language_available", "get_tesseract_langs"] diff --git a/src/paperless_tesseract/apps.py b/src/paperless_tesseract/apps.py deleted file mode 100644 index 8ade88400..000000000 --- a/src/paperless_tesseract/apps.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.apps import AppConfig - -from paperless_tesseract.signals import tesseract_consumer_declaration - - -class PaperlessTesseractConfig(AppConfig): - name = "paperless_tesseract" - - def ready(self) -> None: - from documents.signals import document_consumer_declaration - - document_consumer_declaration.connect(tesseract_consumer_declaration) - - AppConfig.ready(self) diff --git a/src/paperless_tesseract/checks.py b/src/paperless_tesseract/checks.py deleted file mode 100644 index 0d7a1d90d..000000000 --- a/src/paperless_tesseract/checks.py +++ /dev/null @@ -1,52 +0,0 @@ -import shutil -import subprocess - -from django.conf import settings -from django.core.checks import Error -from django.core.checks import Warning -from django.core.checks import register - - -def get_tesseract_langs(): - proc = subprocess.run( - [shutil.which("tesseract"), "--list-langs"], - capture_output=True, - ) - - # Decode bytes to string, split on newlines, trim out the header - proc_lines = proc.stdout.decode("utf8", errors="ignore").strip().split("\n")[1:] - - return [x.strip() for x in proc_lines] - - -@register() -def check_default_language_available(app_configs, **kwargs): - errs = [] - - if not settings.OCR_LANGUAGE: - errs.append( - Warning( - "No OCR language has been specified with PAPERLESS_OCR_LANGUAGE. " - "This means that tesseract will fallback to english.", - ), - ) - return errs - - # binaries_check in paperless will check and report if this doesn't exist - # So skip trying to do anything here and let that handle missing binaries - if shutil.which("tesseract") is not None: - installed_langs = get_tesseract_langs() - - specified_langs = [x.strip() for x in settings.OCR_LANGUAGE.split("+")] - - for lang in specified_langs: - if lang not in installed_langs: - errs.append( - Error( - f"The selected ocr language {lang} is " - f"not installed. Paperless cannot OCR your documents " - f"without it. Please fix PAPERLESS_OCR_LANGUAGE.", - ), - ) - - return errs diff --git a/src/paperless_tesseract/signals.py b/src/paperless_tesseract/signals.py deleted file mode 100644 index d80d13614..000000000 --- a/src/paperless_tesseract/signals.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import Any - - -def get_parser(*args: Any, **kwargs: Any) -> Any: - from paperless.parsers.tesseract import RasterisedDocumentParser - - # RasterisedDocumentParser accepts logging_group for constructor compatibility but - # does not store or use it (no legacy DocumentParser base class). - # progress_callback is also not used. Both may arrive as a positional arg - # (consumer) or a keyword arg (views); *args absorbs the positional form, - # kwargs.pop handles the keyword form. Phase 4 will replace this signal - # path with the new ParserRegistry so the shim can be removed at that point. - kwargs.pop("logging_group", None) - kwargs.pop("progress_callback", None) - return RasterisedDocumentParser(*args, **kwargs) - - -def tesseract_consumer_declaration(sender: Any, **kwargs: Any) -> dict[str, Any]: - return { - "parser": get_parser, - "weight": 0, - "mime_types": { - "application/pdf": ".pdf", - "image/jpeg": ".jpg", - "image/png": ".png", - "image/tiff": ".tif", - "image/gif": ".gif", - "image/bmp": ".bmp", - "image/webp": ".webp", - "image/heic": ".heic", - }, - } diff --git a/src/paperless_tesseract/tests/__init__.py b/src/paperless_tesseract/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/paperless_tesseract/tests/test_checks.py b/src/paperless_tesseract/tests/test_checks.py deleted file mode 100644 index ab3ba0c16..000000000 --- a/src/paperless_tesseract/tests/test_checks.py +++ /dev/null @@ -1,67 +0,0 @@ -from unittest import mock - -from django.core.checks import ERROR -from django.test import TestCase -from django.test import override_settings - -from paperless_tesseract import check_default_language_available - - -class TestChecks(TestCase): - def test_default_language(self) -> None: - check_default_language_available(None) - - @override_settings(OCR_LANGUAGE="") - def test_no_language(self) -> None: - msgs = check_default_language_available(None) - self.assertEqual(len(msgs), 1) - self.assertTrue( - msgs[0].msg.startswith( - "No OCR language has been specified with PAPERLESS_OCR_LANGUAGE", - ), - ) - - @override_settings(OCR_LANGUAGE="ita") - @mock.patch("paperless_tesseract.checks.get_tesseract_langs") - def test_invalid_language(self, m) -> None: - m.return_value = ["deu", "eng"] - msgs = check_default_language_available(None) - self.assertEqual(len(msgs), 1) - self.assertEqual(msgs[0].level, ERROR) - - @override_settings(OCR_LANGUAGE="chi_sim") - @mock.patch("paperless_tesseract.checks.get_tesseract_langs") - def test_multi_part_language(self, m) -> None: - """ - GIVEN: - - An OCR language which is multi part (ie chi-sim) - - The language is correctly formatted - WHEN: - - Installed packages are checked - THEN: - - No errors are reported - """ - m.return_value = ["chi_sim", "eng"] - - msgs = check_default_language_available(None) - - self.assertEqual(len(msgs), 0) - - @override_settings(OCR_LANGUAGE="chi-sim") - @mock.patch("paperless_tesseract.checks.get_tesseract_langs") - def test_multi_part_language_bad_format(self, m) -> None: - """ - GIVEN: - - An OCR language which is multi part (ie chi-sim) - - The language is correctly NOT formatted - WHEN: - - Installed packages are checked - THEN: - - No errors are reported - """ - m.return_value = ["chi_sim", "eng"] - - msgs = check_default_language_available(None) - - self.assertEqual(len(msgs), 1) - self.assertEqual(msgs[0].level, ERROR) diff --git a/src/paperless_text/__init__.py b/src/paperless_text/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/paperless_text/apps.py b/src/paperless_text/apps.py deleted file mode 100644 index 619d71886..000000000 --- a/src/paperless_text/apps.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.apps import AppConfig - -from paperless_text.signals import text_consumer_declaration - - -class PaperlessTextConfig(AppConfig): - name = "paperless_text" - - def ready(self) -> None: - from documents.signals import document_consumer_declaration - - document_consumer_declaration.connect(text_consumer_declaration) - - AppConfig.ready(self) diff --git a/src/paperless_text/signals.py b/src/paperless_text/signals.py deleted file mode 100644 index 916f0a7c0..000000000 --- a/src/paperless_text/signals.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from typing import Any - - -def get_parser(*args: Any, **kwargs: Any) -> Any: - from paperless.parsers.text import TextDocumentParser - - # TextDocumentParser accepts logging_group for constructor compatibility but - # does not store or use it (no legacy DocumentParser base class). - # progress_callback is also not used. Both may arrive as a positional arg - # (consumer) or a keyword arg (views); *args absorbs the positional form, - # kwargs.pop handles the keyword form. Phase 4 will replace this signal - # path with the new ParserRegistry so the shim can be removed at that point. - kwargs.pop("logging_group", None) - kwargs.pop("progress_callback", None) - return TextDocumentParser(*args, **kwargs) - - -def text_consumer_declaration(sender: Any, **kwargs: Any) -> dict[str, Any]: - return { - "parser": get_parser, - "weight": 10, - "mime_types": { - "text/plain": ".txt", - "text/csv": ".csv", - "application/csv": ".csv", - }, - } diff --git a/src/paperless_text/tests/__init__.py b/src/paperless_text/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/paperless_tika/__init__.py b/src/paperless_tika/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/paperless_tika/apps.py b/src/paperless_tika/apps.py deleted file mode 100644 index 714a05188..000000000 --- a/src/paperless_tika/apps.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.apps import AppConfig -from django.conf import settings - -from paperless_tika.signals import tika_consumer_declaration - - -class PaperlessTikaConfig(AppConfig): - name = "paperless_tika" - - def ready(self) -> None: - from documents.signals import document_consumer_declaration - - if settings.TIKA_ENABLED: - document_consumer_declaration.connect(tika_consumer_declaration) - AppConfig.ready(self) diff --git a/src/paperless_tika/signals.py b/src/paperless_tika/signals.py deleted file mode 100644 index f1fd17ef6..000000000 --- a/src/paperless_tika/signals.py +++ /dev/null @@ -1,33 +0,0 @@ -def get_parser(*args, **kwargs): - from paperless.parsers.tika import TikaDocumentParser - - # TikaDocumentParser accepts logging_group for constructor compatibility but - # does not store or use it (no legacy DocumentParser base class). - # progress_callback is also not used. Both may arrive as a positional arg - # (consumer) or a keyword arg (views); *args absorbs the positional form, - # kwargs.pop handles the keyword form. Phase 4 will replace this signal - # path with the new ParserRegistry so the shim can be removed at that point. - kwargs.pop("logging_group", None) - kwargs.pop("progress_callback", None) - return TikaDocumentParser() - - -def tika_consumer_declaration(sender, **kwargs): - return { - "parser": get_parser, - "weight": 10, - "mime_types": { - "application/msword": ".doc", - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": ".docx", - "application/vnd.ms-excel": ".xls", - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ".xlsx", - "application/vnd.ms-powerpoint": ".ppt", - "application/vnd.openxmlformats-officedocument.presentationml.presentation": ".pptx", - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": ".ppsx", - "application/vnd.oasis.opendocument.presentation": ".odp", - "application/vnd.oasis.opendocument.spreadsheet": ".ods", - "application/vnd.oasis.opendocument.text": ".odt", - "application/vnd.oasis.opendocument.graphics": ".odg", - "text/rtf": ".rtf", - }, - } From 79def8a200fa857334dc9df1c989809f9b4bed45 Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 22 Mar 2026 13:55:02 +0000 Subject: [PATCH 063/113] Auto translate strings --- src/locale/en_US/LC_MESSAGES/django.po | 92 +++++++++++++------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index de3e70775..ceb207dfa 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-21 09:25+0000\n" +"POT-Creation-Date: 2026-03-22 13:54+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -1300,7 +1300,7 @@ msgid "workflow runs" msgstr "" #: documents/serialisers.py:463 documents/serialisers.py:815 -#: documents/serialisers.py:2501 documents/views.py:1992 +#: documents/serialisers.py:2501 documents/views.py:1990 #: paperless_mail/serialisers.py:143 msgid "Insufficient permissions." msgstr "" @@ -1341,7 +1341,7 @@ msgstr "" msgid "Duplicate document identifiers are not allowed." msgstr "" -#: documents/serialisers.py:2587 documents/views.py:3598 +#: documents/serialisers.py:2587 documents/views.py:3596 #, python-format msgid "Documents not found: %(ids)s" msgstr "" @@ -1605,24 +1605,24 @@ msgstr "" msgid "Unable to parse URI {value}" msgstr "" -#: documents/views.py:1985 +#: documents/views.py:1983 msgid "Invalid more_like_id" msgstr "" -#: documents/views.py:3610 +#: documents/views.py:3608 #, python-format msgid "Insufficient permissions to share document %(id)s." msgstr "" -#: documents/views.py:3653 +#: documents/views.py:3651 msgid "Bundle is already being processed." msgstr "" -#: documents/views.py:3710 +#: documents/views.py:3708 msgid "The share link bundle is still being prepared. Please try again later." msgstr "" -#: documents/views.py:3720 +#: documents/views.py:3718 msgid "The share link bundle is unavailable." msgstr "" @@ -1862,151 +1862,151 @@ msgstr "" msgid "paperless application settings" msgstr "" -#: paperless/settings/__init__.py:521 +#: paperless/settings/__init__.py:518 msgid "English (US)" msgstr "" -#: paperless/settings/__init__.py:522 +#: paperless/settings/__init__.py:519 msgid "Arabic" msgstr "" -#: paperless/settings/__init__.py:523 +#: paperless/settings/__init__.py:520 msgid "Afrikaans" msgstr "" -#: paperless/settings/__init__.py:524 +#: paperless/settings/__init__.py:521 msgid "Belarusian" msgstr "" -#: paperless/settings/__init__.py:525 +#: paperless/settings/__init__.py:522 msgid "Bulgarian" msgstr "" -#: paperless/settings/__init__.py:526 +#: paperless/settings/__init__.py:523 msgid "Catalan" msgstr "" -#: paperless/settings/__init__.py:527 +#: paperless/settings/__init__.py:524 msgid "Czech" msgstr "" -#: paperless/settings/__init__.py:528 +#: paperless/settings/__init__.py:525 msgid "Danish" msgstr "" -#: paperless/settings/__init__.py:529 +#: paperless/settings/__init__.py:526 msgid "German" msgstr "" -#: paperless/settings/__init__.py:530 +#: paperless/settings/__init__.py:527 msgid "Greek" msgstr "" -#: paperless/settings/__init__.py:531 +#: paperless/settings/__init__.py:528 msgid "English (GB)" msgstr "" -#: paperless/settings/__init__.py:532 +#: paperless/settings/__init__.py:529 msgid "Spanish" msgstr "" -#: paperless/settings/__init__.py:533 +#: paperless/settings/__init__.py:530 msgid "Persian" msgstr "" -#: paperless/settings/__init__.py:534 +#: paperless/settings/__init__.py:531 msgid "Finnish" msgstr "" -#: paperless/settings/__init__.py:535 +#: paperless/settings/__init__.py:532 msgid "French" msgstr "" -#: paperless/settings/__init__.py:536 +#: paperless/settings/__init__.py:533 msgid "Hungarian" msgstr "" -#: paperless/settings/__init__.py:537 +#: paperless/settings/__init__.py:534 msgid "Indonesian" msgstr "" -#: paperless/settings/__init__.py:538 +#: paperless/settings/__init__.py:535 msgid "Italian" msgstr "" -#: paperless/settings/__init__.py:539 +#: paperless/settings/__init__.py:536 msgid "Japanese" msgstr "" -#: paperless/settings/__init__.py:540 +#: paperless/settings/__init__.py:537 msgid "Korean" msgstr "" -#: paperless/settings/__init__.py:541 +#: paperless/settings/__init__.py:538 msgid "Luxembourgish" msgstr "" -#: paperless/settings/__init__.py:542 +#: paperless/settings/__init__.py:539 msgid "Norwegian" msgstr "" -#: paperless/settings/__init__.py:543 +#: paperless/settings/__init__.py:540 msgid "Dutch" msgstr "" -#: paperless/settings/__init__.py:544 +#: paperless/settings/__init__.py:541 msgid "Polish" msgstr "" -#: paperless/settings/__init__.py:545 +#: paperless/settings/__init__.py:542 msgid "Portuguese (Brazil)" msgstr "" -#: paperless/settings/__init__.py:546 +#: paperless/settings/__init__.py:543 msgid "Portuguese" msgstr "" -#: paperless/settings/__init__.py:547 +#: paperless/settings/__init__.py:544 msgid "Romanian" msgstr "" -#: paperless/settings/__init__.py:548 +#: paperless/settings/__init__.py:545 msgid "Russian" msgstr "" -#: paperless/settings/__init__.py:549 +#: paperless/settings/__init__.py:546 msgid "Slovak" msgstr "" -#: paperless/settings/__init__.py:550 +#: paperless/settings/__init__.py:547 msgid "Slovenian" msgstr "" -#: paperless/settings/__init__.py:551 +#: paperless/settings/__init__.py:548 msgid "Serbian" msgstr "" -#: paperless/settings/__init__.py:552 +#: paperless/settings/__init__.py:549 msgid "Swedish" msgstr "" -#: paperless/settings/__init__.py:553 +#: paperless/settings/__init__.py:550 msgid "Turkish" msgstr "" -#: paperless/settings/__init__.py:554 +#: paperless/settings/__init__.py:551 msgid "Ukrainian" msgstr "" -#: paperless/settings/__init__.py:555 +#: paperless/settings/__init__.py:552 msgid "Vietnamese" msgstr "" -#: paperless/settings/__init__.py:556 +#: paperless/settings/__init__.py:553 msgid "Chinese Simplified" msgstr "" -#: paperless/settings/__init__.py:557 +#: paperless/settings/__init__.py:554 msgid "Chinese Traditional" msgstr "" @@ -2052,7 +2052,7 @@ msgid "" "process all matching rules that you have defined." msgstr "" -#: paperless_mail/apps.py:11 +#: paperless_mail/apps.py:8 msgid "Paperless mail" msgstr "" From b049ad9626fdf21127ee7dc96870135bb935d0fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 09:26:24 -0700 Subject: [PATCH 064/113] Chore(deps): Bump cbor2 in the uv group across 1 directory (#12424) Bumps the uv group with 1 update in the / directory: [cbor2](https://github.com/agronholm/cbor2). Updates `cbor2` from 5.8.0 to 5.9.0 - [Release notes](https://github.com/agronholm/cbor2/releases) - [Commits](https://github.com/agronholm/cbor2/compare/5.8.0...5.9.0) --- updated-dependencies: - dependency-name: cbor2 dependency-version: 5.9.0 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/uv.lock b/uv.lock index aa763f617..9b085ec01 100644 --- a/uv.lock +++ b/uv.lock @@ -361,31 +361,31 @@ wheels = [ [[package]] name = "cbor2" -version = "5.8.0" +version = "5.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d9/8e/8b4fdde28e42ffcd741a37f4ffa9fb59cd4fe01625b544dfcfd9ccb54f01/cbor2-5.8.0.tar.gz", hash = "sha256:b19c35fcae9688ac01ef75bad5db27300c2537eb4ee00ed07e05d8456a0d4931", size = 107825, upload-time = "2025-12-30T18:44:22.455Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/cb/09939728be094d155b5d4ac262e39877875f5f7e36eea66beb359f647bd0/cbor2-5.9.0.tar.gz", hash = "sha256:85c7a46279ac8f226e1059275221e6b3d0e370d2bb6bd0500f9780781615bcea", size = 111231, upload-time = "2026-03-22T15:56:50.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/4b/623435ef9b98e86b6956a41863d39ff4fe4d67983948b5834f55499681dd/cbor2-5.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18ac191640093e6c7fbcb174c006ffec4106c3d8ab788e70272c1c4d933cbe11", size = 69875, upload-time = "2025-12-30T18:43:35.888Z" }, - { url = "https://files.pythonhosted.org/packages/58/17/f664201080b2a7d0f57c16c8e9e5922013b92f202e294863ec7e75b7ff7f/cbor2-5.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fddee9103a17d7bed5753f0c7fc6663faa506eb953e50d8287804eccf7b048e6", size = 268316, upload-time = "2025-12-30T18:43:37.161Z" }, - { url = "https://files.pythonhosted.org/packages/d0/e1/072745b4ff01afe9df2cd627f8fc51a1acedb5d3d1253765625d2929db91/cbor2-5.8.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8d2ea26fad620aba5e88d7541be8b10c5034a55db9a23809b7cb49f36803f05b", size = 258874, upload-time = "2025-12-30T18:43:38.878Z" }, - { url = "https://files.pythonhosted.org/packages/a7/10/61c262b886d22b62c56e8aac6d10fa06d0953c997879ab882a31a624952b/cbor2-5.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:de68b4b310b072b082d317adc4c5e6910173a6d9455412e6183d72c778d1f54c", size = 261971, upload-time = "2025-12-30T18:43:40.401Z" }, - { url = "https://files.pythonhosted.org/packages/7e/42/b7862f5e64364b10ad120ea53e87ec7e891fb268cb99c572348e647cf7e9/cbor2-5.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:418d2cf0e03e90160fa1474c05a40fe228bbb4a92d1628bdbbd13a48527cb34d", size = 254151, upload-time = "2025-12-30T18:43:41.938Z" }, - { url = "https://files.pythonhosted.org/packages/2f/4f/3a16e3e8fd7e5fd86751a4f1aad218a8d19a96e75ec3989c3e95a8fe1d8f/cbor2-5.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b3f91fa699a5ce22470e973601c62dd9d55dc3ca20ee446516ac075fcab27c9", size = 70270, upload-time = "2025-12-30T18:43:46.005Z" }, - { url = "https://files.pythonhosted.org/packages/38/81/0d0cf0796fe8081492a61c45278f03def21a929535a492dd97c8438f5dbe/cbor2-5.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:518c118a5e00001854adb51f3164e647aa99b6a9877d2a733a28cb5c0a4d6857", size = 286242, upload-time = "2025-12-30T18:43:47.026Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a9/fdab6c10190cfb8d639e01f2b168f2406fc847a2a6bc00e7de78c3381d0a/cbor2-5.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cff2a1999e49cd51c23d1b6786a012127fd8f722c5946e82bd7ab3eb307443f3", size = 285412, upload-time = "2025-12-30T18:43:48.563Z" }, - { url = "https://files.pythonhosted.org/packages/31/59/746a8e630996217a3afd523f583fcf7e3d16640d63f9a03f0f4e4f74b5b1/cbor2-5.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c4492160212374973cdc14e46f0565f2462721ef922b40f7ea11e7d613dfb2a", size = 278041, upload-time = "2025-12-30T18:43:49.92Z" }, - { url = "https://files.pythonhosted.org/packages/0f/a3/f3bbeb6dedd45c6e0cddd627ea790dea295eaf82c83f0e2159b733365ebd/cbor2-5.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:546c7c7c4c6bcdc54a59242e0e82cea8f332b17b4465ae628718fef1fce401ca", size = 278185, upload-time = "2025-12-30T18:43:51.192Z" }, - { url = "https://files.pythonhosted.org/packages/a6/0d/5a3f20bafaefeb2c1903d961416f051c0950f0d09e7297a3aa6941596b29/cbor2-5.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6d8d104480845e2f28c6165b4c961bbe58d08cb5638f368375cfcae051c28015", size = 70332, upload-time = "2025-12-30T18:43:54.694Z" }, - { url = "https://files.pythonhosted.org/packages/57/66/177a3f089e69db69c987453ab4934086408c3338551e4984734597be9f80/cbor2-5.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:43efee947e5ab67d406d6e0dc61b5dee9d2f5e89ae176f90677a3741a20ca2e7", size = 285985, upload-time = "2025-12-30T18:43:55.733Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8e/9e17b8e4ed80a2ce97e2dfa5915c169dbb31599409ddb830f514b57f96cc/cbor2-5.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be7ae582f50be539e09c134966d0fd63723fc4789b8dff1f6c2e3f24ae3eaf32", size = 285173, upload-time = "2025-12-30T18:43:57.321Z" }, - { url = "https://files.pythonhosted.org/packages/cc/33/9f92e107d78f88ac22723ac15d0259d220ba98c1d855e51796317f4c4114/cbor2-5.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:50f5c709561a71ea7970b4cd2bf9eda4eccacc0aac212577080fdfe64183e7f5", size = 278395, upload-time = "2025-12-30T18:43:58.497Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3f/46b80050a4a35ce5cf7903693864a9fdea7213567dc8faa6e25cb375c182/cbor2-5.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6790ecc73aa93e76d2d9076fc42bf91a9e69f2295e5fa702e776dbe986465bd", size = 278330, upload-time = "2025-12-30T18:43:59.656Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0c/0654233d7543ac8a50f4785f172430ddc97538ba418eb305d6e529d1a120/cbor2-5.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ad72381477133046ce217617d839ea4e9454f8b77d9a6351b229e214102daeb7", size = 70710, upload-time = "2025-12-30T18:44:03.209Z" }, - { url = "https://files.pythonhosted.org/packages/84/62/4671d24e557d7f5a74a01b422c538925140c0495e57decde7e566f91d029/cbor2-5.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6da25190fad3434ce99876b11d4ca6b8828df6ca232cf7344cd14ae1166fb718", size = 285005, upload-time = "2025-12-30T18:44:05.109Z" }, - { url = "https://files.pythonhosted.org/packages/87/85/0c67d763a08e848c9a80d7e4723ba497cce676f41bc7ca1828ae90a0a872/cbor2-5.8.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c13919e3a24c5a6d286551fa288848a4cedc3e507c58a722ccd134e461217d99", size = 282435, upload-time = "2025-12-30T18:44:06.465Z" }, - { url = "https://files.pythonhosted.org/packages/b2/01/0650972b4dbfbebcfbe37cbba7fc3cd9019a8da6397ab3446e07175e342b/cbor2-5.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f8c40d32e5972047a777f9bf730870828f3cf1c43b3eb96fd0429c57a1d3b9e6", size = 277493, upload-time = "2025-12-30T18:44:07.609Z" }, - { url = "https://files.pythonhosted.org/packages/b3/6c/7704a4f32adc7f10f3b41ec067f500a4458f7606397af5e4cf2d368fd288/cbor2-5.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7627894bc0b3d5d0807f31e3107e11b996205470c4429dc2bb4ef8bfe7f64e1e", size = 276085, upload-time = "2025-12-30T18:44:09.021Z" }, - { url = "https://files.pythonhosted.org/packages/d6/4f/101071f880b4da05771128c0b89f41e334cff044dee05fb013c8f4be661c/cbor2-5.8.0-py3-none-any.whl", hash = "sha256:3727d80f539567b03a7aa11890e57798c67092c38df9e6c23abb059e0f65069c", size = 24374, upload-time = "2025-12-30T18:44:21.476Z" }, + { url = "https://files.pythonhosted.org/packages/43/aa/317c7118b8dda4c9563125c1a12c70c5b41e36677964a49c72b1aac061ec/cbor2-5.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0485d3372fc832c5e16d4eb45fa1a20fc53e806e6c29a1d2b0d3e176cedd52b9", size = 70578, upload-time = "2026-03-22T15:56:03.835Z" }, + { url = "https://files.pythonhosted.org/packages/31/43/fe29b1f897770011a5e7497f4523c2712282ee4a6cbf775ea6383fb7afb9/cbor2-5.9.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9d6e4e0f988b0e766509a8071975a8ee99f930e14a524620bf38083106158d2", size = 268738, upload-time = "2026-03-22T15:56:05.222Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1a/e494568f3d8aafbcdfe361df44c3bcf5cdab5183e25ea08e3d3f9fcf4075/cbor2-5.9.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5326336f633cc89dfe543c78829c16c3a6449c2c03277d1ddba99086c3323363", size = 262571, upload-time = "2026-03-22T15:56:06.411Z" }, + { url = "https://files.pythonhosted.org/packages/42/2e/92acd6f87382fd44a34d9d7e85cc45372e6ba664040b72d1d9df648b25d0/cbor2-5.9.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5e702b02d42a5ace45425b595ffe70fe35aebaf9a3cdfdc2c758b6189c744422", size = 262356, upload-time = "2026-03-22T15:56:08.236Z" }, + { url = "https://files.pythonhosted.org/packages/3f/68/52c039a28688baeeb78b0be7483855e6c66ea05884a937444deede0c87b8/cbor2-5.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2372d357d403e7912f104ff085950ffc82a5854d6d717f1ca1ce16a40a0ef5a7", size = 257604, upload-time = "2026-03-22T15:56:09.835Z" }, + { url = "https://files.pythonhosted.org/packages/ee/39/72d8a5a4b06565561ec28f4fcb41aff7bb77f51705c01f00b8254a2aca4f/cbor2-5.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1f223dffb1bcdd2764665f04c1152943d9daa4bc124a576cd8dee1cad4264313", size = 71223, upload-time = "2026-03-22T15:56:13.68Z" }, + { url = "https://files.pythonhosted.org/packages/09/fd/7ddf3d3153b54c69c3be77172b8d9aa3a9d74f62a7fbde614d53eaeed9a4/cbor2-5.9.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae6c706ac1d85a0b3cb3395308fd0c4d55e3202b4760773675957e93cdff45fc", size = 287865, upload-time = "2026-03-22T15:56:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/db/9d/7ede2cc42f9bb4260492e7d29d2aab781eacbbcfb09d983de1e695077199/cbor2-5.9.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4cd43d8fc374b31643b2830910f28177a606a7bc84975a62675dd3f2e320fc7b", size = 288246, upload-time = "2026-03-22T15:56:16.113Z" }, + { url = "https://files.pythonhosted.org/packages/ce/9d/588ebc7c5bc5843f609b05fe07be8575c7dec987735b0bbc908ac9c1264a/cbor2-5.9.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4aa07b392cc3d76fb31c08a46a226b58c320d1c172ff3073e864409ced7bc50f", size = 280214, upload-time = "2026-03-22T15:56:17.519Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a1/6fc8f4b15c6a27e7fbb7966c30c2b4b18c274a3221fa2f5e6235502d34bc/cbor2-5.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:971d425b3a23b75953d8853d5f9911bdeefa09d759ee3b5e6b07b5ff3cbd9073", size = 282162, upload-time = "2026-03-22T15:56:18.975Z" }, + { url = "https://files.pythonhosted.org/packages/81/c5/4901e21a8afe9448fd947b11e8f383903207cd6dd0800e5f5a386838de5b/cbor2-5.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fbb06f34aa645b4deca66643bba3d400d20c15312d1fe88d429be60c1ab50f27", size = 71284, upload-time = "2026-03-22T15:56:22.836Z" }, + { url = "https://files.pythonhosted.org/packages/1b/10/df643a381aebc3f05486de4813662bc58accb640fc3275cb276a75e89694/cbor2-5.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac684fe195c39821fca70d18afbf748f728aefbfbf88456018d299e559b8cae0", size = 287682, upload-time = "2026-03-22T15:56:24.024Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0c/8aa6b766059ae4a0ca1ec3ff96fe3823a69a7be880dba2e249f7fbe2700b/cbor2-5.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a54fbb32cb828c214f7f333a707e4aec61182e7efdc06ea5d9596d3ecee624a", size = 288009, upload-time = "2026-03-22T15:56:25.305Z" }, + { url = "https://files.pythonhosted.org/packages/74/07/6236bc25c183a9cf7e8062e5dddf9eae9b0b14ebf14a58a69fe5a1e872c6/cbor2-5.9.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4753a6d1bc71054d9179557bc65740860f185095ccb401d46637fff028a5b3ec", size = 280437, upload-time = "2026-03-22T15:56:26.479Z" }, + { url = "https://files.pythonhosted.org/packages/4e/0a/84328d23c3c68874ac6497edb9b1900579a1028efa54734df3f1762bbc15/cbor2-5.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:380e534482b843e43442b87d8777a7bf9bed20cb7526f89b780c3400f617304b", size = 282247, upload-time = "2026-03-22T15:56:28.644Z" }, + { url = "https://files.pythonhosted.org/packages/08/7d/9ccc36d10ef96e6038e48046ebe1ce35a1e7814da0e1e204d09e6ef09b8d/cbor2-5.9.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23606d31ba1368bd1b6602e3020ee88fe9523ca80e8630faf6b2fc904fd84560", size = 71500, upload-time = "2026-03-22T15:56:31.876Z" }, + { url = "https://files.pythonhosted.org/packages/70/e1/a6cca2cc72e13f00030c6a649f57ae703eb2c620806ab70c40db8eab33fa/cbor2-5.9.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0322296b9d52f55880e300ba8ba09ecf644303b99b51138bbb1c0fb644fa7c3e", size = 286953, upload-time = "2026-03-22T15:56:33.292Z" }, + { url = "https://files.pythonhosted.org/packages/08/3c/24cd5ef488a957d90e016f200a3aad820e4c2f85edd61c9fe4523007a1ee/cbor2-5.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:422817286c1d0ce947fb2f7eca9212b39bddd7231e8b452e2d2cc52f15332dba", size = 285454, upload-time = "2026-03-22T15:56:34.703Z" }, + { url = "https://files.pythonhosted.org/packages/a4/35/dca96818494c0ba47cdd73e8d809b27fa91f8fa0ce32a068a09237687454/cbor2-5.9.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9a4907e0c3035bb8836116854ed8e56d8aef23909d601fa59706320897ec2551", size = 279441, upload-time = "2026-03-22T15:56:35.888Z" }, + { url = "https://files.pythonhosted.org/packages/a4/44/d3362378b16e53cf7e535a3f5aed8476e2109068154e24e31981ef5bde9e/cbor2-5.9.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:fb7afe77f8d269e42d7c4b515c6fd14f1ccc0625379fb6829b269f493d16eddd", size = 279673, upload-time = "2026-03-22T15:56:37.08Z" }, + { url = "https://files.pythonhosted.org/packages/42/ff/b83492b096fbef26e9cb62c1a4bf2d3cef579ea7b33138c6c37c4ae66f67/cbor2-5.9.0-py3-none-any.whl", hash = "sha256:27695cbd70c90b8de5c4a284642c2836449b14e2c2e07e3ffe0744cb7669a01b", size = 24627, upload-time = "2026-03-22T15:56:48.847Z" }, ] [[package]] From bdc0a58242f393e549673a9a0a6f8f597e4dd472 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 26 Mar 2026 05:43:49 -0700 Subject: [PATCH 065/113] Security: prevent prototype pollution in settings and list view (#12438) --- .../document-list-view.service.spec.ts | 24 +++++++++ .../services/document-list-view.service.ts | 49 ++++++++++++++++--- .../src/app/services/settings.service.spec.ts | 17 +++++++ src-ui/src/app/services/settings.service.ts | 39 ++++++++++++--- 4 files changed, 114 insertions(+), 15 deletions(-) diff --git a/src-ui/src/app/services/document-list-view.service.spec.ts b/src-ui/src/app/services/document-list-view.service.spec.ts index 6258c42b2..da3d06444 100644 --- a/src-ui/src/app/services/document-list-view.service.spec.ts +++ b/src-ui/src/app/services/document-list-view.service.spec.ts @@ -21,6 +21,7 @@ import { FILTER_HAS_TAGS_ANY, } from '../data/filter-rule-type' import { SavedView } from '../data/saved-view' +import { DOCUMENT_LIST_SERVICE } from '../data/storage-keys' import { SETTINGS_KEYS } from '../data/ui-settings' import { PermissionsGuard } from '../guards/permissions.guard' import { DocumentListViewService } from './document-list-view.service' @@ -248,6 +249,29 @@ describe('DocumentListViewService', () => { expect(documentListViewService.sortReverse).toBeTruthy() }) + it('restores only known list view state fields from local storage', () => { + try { + localStorage.setItem( + DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG, + '{"currentPage":3,"sortField":"title","sortReverse":false,"__proto__":{"polluted":true},"injected":"ignored"}' + ) + + const restoredService = TestBed.runInInjectionContext( + () => new DocumentListViewService() + ) + + expect(restoredService.currentPage).toEqual(3) + expect(restoredService.sortField).toEqual('title') + expect(restoredService.sortReverse).toBeFalsy() + expect( + (restoredService as any).activeListViewState.injected + ).toBeUndefined() + expect(({} as any).polluted).toBeUndefined() + } finally { + localStorage.removeItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG) + } + }) + it('should load from query params', () => { expect(documentListViewService.currentPage).toEqual(1) const page = 2 diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts index 6989db8ed..f2460add2 100644 --- a/src-ui/src/app/services/document-list-view.service.ts +++ b/src-ui/src/app/services/document-list-view.service.ts @@ -24,6 +24,20 @@ const LIST_DEFAULT_DISPLAY_FIELDS: DisplayField[] = DEFAULT_DISPLAY_FIELDS.map( (f) => f.id ).filter((f) => f !== DisplayField.ADDED) +const RESTORABLE_LIST_VIEW_STATE_KEYS: (keyof ListViewState)[] = [ + 'title', + 'documents', + 'currentPage', + 'collectionSize', + 'sortField', + 'sortReverse', + 'filterRules', + 'selected', + 'pageSize', + 'displayMode', + 'displayFields', +] + /** * Captures the current state of the list view. */ @@ -112,6 +126,32 @@ export class DocumentListViewService { private displayFieldsInitialized: boolean = false + private restoreListViewState(savedState: unknown): ListViewState { + const newState = this.defaultListViewState() + + if ( + !savedState || + typeof savedState !== 'object' || + Array.isArray(savedState) + ) { + return newState + } + + const parsedState = savedState as Partial< + Record + > + const mutableState = newState as Record + + for (const key of RESTORABLE_LIST_VIEW_STATE_KEYS) { + const value = parsedState[key] + if (value != null) { + mutableState[key] = value + } + } + + return newState + } + get activeSavedViewId() { return this._activeSavedViewId } @@ -127,14 +167,7 @@ export class DocumentListViewService { if (documentListViewConfigJson) { try { let savedState: ListViewState = JSON.parse(documentListViewConfigJson) - // Remove null elements from the restored state - Object.keys(savedState).forEach((k) => { - if (savedState[k] == null) { - delete savedState[k] - } - }) - // only use restored state attributes instead of defaults if they are not null - let newState = Object.assign(this.defaultListViewState(), savedState) + let newState = this.restoreListViewState(savedState) this.listViewStates.set(null, newState) } catch (e) { localStorage.removeItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG) diff --git a/src-ui/src/app/services/settings.service.spec.ts b/src-ui/src/app/services/settings.service.spec.ts index 22ae3e504..5190bc549 100644 --- a/src-ui/src/app/services/settings.service.spec.ts +++ b/src-ui/src/app/services/settings.service.spec.ts @@ -166,6 +166,23 @@ describe('SettingsService', () => { expect(settingsService.get(SETTINGS_KEYS.THEME_COLOR)).toEqual('#9fbf2f') }) + it('ignores unsafe top-level keys from loaded settings', () => { + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}ui_settings/` + ) + const payload = JSON.parse( + JSON.stringify(ui_settings).replace( + '"settings":{', + '"settings":{"__proto__":{"polluted":"yes"},' + ) + ) + payload.settings.app_title = 'Safe Title' + req.flush(payload) + + expect(settingsService.get(SETTINGS_KEYS.APP_TITLE)).toEqual('Safe Title') + expect(({} as any).polluted).toBeUndefined() + }) + it('correctly allows updating settings of various types', () => { const req = httpTestingController.expectOne( `${environment.apiBaseUrl}ui_settings/` diff --git a/src-ui/src/app/services/settings.service.ts b/src-ui/src/app/services/settings.service.ts index f006cae12..8768a2058 100644 --- a/src-ui/src/app/services/settings.service.ts +++ b/src-ui/src/app/services/settings.service.ts @@ -276,6 +276,8 @@ const ISO_LANGUAGE_OPTION: LanguageOption = { dateInputFormat: 'yyyy-mm-dd', } +const UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'prototype', 'constructor']) + @Injectable({ providedIn: 'root', }) @@ -291,7 +293,7 @@ export class SettingsService { protected baseUrl: string = environment.apiBaseUrl + 'ui_settings/' - private settings: Object = {} + private settings: Record = {} currentUser: User public settingsSaved: EventEmitter = new EventEmitter() @@ -320,6 +322,21 @@ export class SettingsService { this._renderer = rendererFactory.createRenderer(null, null) } + private isSafeObjectKey(key: string): boolean { + return !UNSAFE_OBJECT_KEYS.has(key) + } + + private assignSafeSettings(source: Record) { + if (!source || typeof source !== 'object' || Array.isArray(source)) { + return + } + + for (const key of Object.keys(source)) { + if (!this.isSafeObjectKey(key)) continue + this.settings[key] = source[key] + } + } + // this is called by the app initializer in app.module public initializeSettings(): Observable { return this.http.get(this.baseUrl).pipe( @@ -338,7 +355,7 @@ export class SettingsService { }) }), tap((uisettings) => { - Object.assign(this.settings, uisettings.settings) + this.assignSafeSettings(uisettings.settings) if (this.get(SETTINGS_KEYS.APP_TITLE)?.length) { environment.appTitle = this.get(SETTINGS_KEYS.APP_TITLE) } @@ -533,7 +550,11 @@ export class SettingsService { let settingObj = this.settings keys.forEach((keyPart, index) => { keyPart = keyPart.replace(/-/g, '_') - if (!settingObj.hasOwnProperty(keyPart)) return + if ( + !this.isSafeObjectKey(keyPart) || + !Object.prototype.hasOwnProperty.call(settingObj, keyPart) + ) + return if (index == keys.length - 1) value = settingObj[keyPart] else settingObj = settingObj[keyPart] }) @@ -579,7 +600,9 @@ export class SettingsService { const keys = key.replace('general-settings:', '').split(':') keys.forEach((keyPart, index) => { keyPart = keyPart.replace(/-/g, '_') - if (!settingObj.hasOwnProperty(keyPart)) settingObj[keyPart] = {} + if (!this.isSafeObjectKey(keyPart)) return + if (!Object.prototype.hasOwnProperty.call(settingObj, keyPart)) + settingObj[keyPart] = {} if (index == keys.length - 1) settingObj[keyPart] = value else settingObj = settingObj[keyPart] }) @@ -602,7 +625,10 @@ export class SettingsService { maybeMigrateSettings() { if ( - !this.settings.hasOwnProperty('documentListSize') && + !Object.prototype.hasOwnProperty.call( + this.settings, + 'documentListSize' + ) && localStorage.getItem(SETTINGS_KEYS.DOCUMENT_LIST_SIZE) ) { // lets migrate @@ -610,8 +636,7 @@ export class SettingsService { const errorMessage = $localize`Unable to migrate settings to the database, please try saving manually.` try { - for (const setting in SETTINGS_KEYS) { - const key = SETTINGS_KEYS[setting] + for (const key of Object.values(SETTINGS_KEYS)) { const value = localStorage.getItem(key) this.set(key, value) } From ec76d3c762eed10a871855538a45bcfe34032609 Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 12:45:29 +0000 Subject: [PATCH 066/113] Auto translate strings --- src-ui/messages.xlf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 410f39a96..b250f523c 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -11187,21 +11187,21 @@ Successfully completed one-time migratration of settings to the database! src/app/services/settings.service.ts - 609 + 635
Unable to migrate settings to the database, please try saving manually. src/app/services/settings.service.ts - 610 + 636 You can restart the tour from the settings page. src/app/services/settings.service.ts - 683 + 708 From d18bbfa9c3d3559886dfe2305f183469d57821a0 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 26 Mar 2026 07:05:58 -0700 Subject: [PATCH 067/113] Chore: Instead of manual temporary directory management, use a context manager (#12430) --- src/documents/consumer.py | 479 +++++++++++++++++++------------------- 1 file changed, 235 insertions(+), 244 deletions(-) diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 809d6c647..64622dc74 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -338,18 +338,15 @@ class ConsumerPlugin( Return the document object if it was successfully created. """ - tempdir = None + # Preflight has already run including progress update to 0% + self.log.info(f"Consuming {self.filename}") - try: - # Preflight has already run including progress update to 0% - self.log.info(f"Consuming {self.filename}") - - # For the actual work, copy the file into a tempdir - tempdir = tempfile.TemporaryDirectory( - prefix="paperless-ngx", - dir=settings.SCRATCH_DIR, - ) - self.working_copy = Path(tempdir.name) / Path(self.filename) + # For the actual work, copy the file into a tempdir + with tempfile.TemporaryDirectory( + prefix="paperless-ngx", + dir=settings.SCRATCH_DIR, + ) as tmpdir: + self.working_copy = Path(tmpdir) / Path(self.filename) copy_file_with_basic_stats(self.input_doc.original_file, self.working_copy) self.unmodified_original = None @@ -381,7 +378,7 @@ class ConsumerPlugin( self.log.debug(f"Detected mime type after qpdf: {mime_type}") # Save the original file for later self.unmodified_original = ( - Path(tempdir.name) / Path("uo") / Path(self.filename) + Path(tmpdir) / Path("uo") / Path(self.filename) ) self.unmodified_original.parent.mkdir(exist_ok=True) copy_file_with_basic_stats( @@ -400,7 +397,6 @@ class ConsumerPlugin( ) ) if not parser_class: - tempdir.cleanup() self._fail( ConsumerStatusShortMessage.UNSUPPORTED_TYPE, f"Unsupported mime type {mime_type}", @@ -415,281 +411,276 @@ class ConsumerPlugin( ) self.run_pre_consume_script() - except: - if tempdir: - tempdir.cleanup() - raise - # This doesn't parse the document yet, but gives us a parser. - with parser_class() as document_parser: - document_parser.configure( - ParserContext(mailrule_id=self.input_doc.mailrule_id), - ) - - self.log.debug(f"Parser: {document_parser.name} v{document_parser.version}") - - # Parse the document. This may take some time. - - text = None - date = None - thumbnail = None - archive_path = None - page_count = None - - try: - self._send_progress( - 20, - 100, - ProgressStatusOptions.WORKING, - ConsumerStatusShortMessage.PARSING_DOCUMENT, + # This doesn't parse the document yet, but gives us a parser. + with parser_class() as document_parser: + document_parser.configure( + ParserContext(mailrule_id=self.input_doc.mailrule_id), ) - self.log.debug(f"Parsing {self.filename}...") - document_parser.parse(self.working_copy, mime_type) - - self.log.debug(f"Generating thumbnail for {self.filename}...") - self._send_progress( - 70, - 100, - ProgressStatusOptions.WORKING, - ConsumerStatusShortMessage.GENERATING_THUMBNAIL, + self.log.debug( + f"Parser: {document_parser.name} v{document_parser.version}", ) - thumbnail = document_parser.get_thumbnail(self.working_copy, mime_type) - text = document_parser.get_text() - date = document_parser.get_date() - if date is None: + # Parse the document. This may take some time. + + text = None + date = None + thumbnail = None + archive_path = None + page_count = None + + try: self._send_progress( - 90, + 20, 100, ProgressStatusOptions.WORKING, - ConsumerStatusShortMessage.PARSE_DATE, + ConsumerStatusShortMessage.PARSING_DOCUMENT, ) - with get_date_parser() as date_parser: - date = next(date_parser.parse(self.filename, text), None) - archive_path = document_parser.get_archive_path() - page_count = document_parser.get_page_count( - self.working_copy, - mime_type, - ) + self.log.debug(f"Parsing {self.filename}...") - except ParseError as e: - if tempdir: - tempdir.cleanup() - self._fail( - str(e), - f"Error occurred while consuming document {self.filename}: {e}", - exc_info=True, - exception=e, - ) - except Exception as e: - if tempdir: - tempdir.cleanup() - self._fail( - str(e), - f"Unexpected error while consuming document {self.filename}: {e}", - exc_info=True, - exception=e, - ) + document_parser.parse(self.working_copy, mime_type) - # Prepare the document classifier. + self.log.debug(f"Generating thumbnail for {self.filename}...") + self._send_progress( + 70, + 100, + ProgressStatusOptions.WORKING, + ConsumerStatusShortMessage.GENERATING_THUMBNAIL, + ) + thumbnail = document_parser.get_thumbnail( + self.working_copy, + mime_type, + ) - # TODO: I don't really like to do this here, but this way we avoid - # reloading the classifier multiple times, since there are multiple - # post-consume hooks that all require the classifier. - - classifier = load_classifier() - - self._send_progress( - 95, - 100, - ProgressStatusOptions.WORKING, - ConsumerStatusShortMessage.SAVE_DOCUMENT, - ) - # now that everything is done, we can start to store the document - # in the system. This will be a transaction and reasonably fast. - try: - with transaction.atomic(): - # store the document. - if self.input_doc.root_document_id: - # If this is a new version of an existing document, we need - # to make sure we're not creating a new document, but updating - # the existing one. - root_doc = Document.objects.get( - pk=self.input_doc.root_document_id, + text = document_parser.get_text() + date = document_parser.get_date() + if date is None: + self._send_progress( + 90, + 100, + ProgressStatusOptions.WORKING, + ConsumerStatusShortMessage.PARSE_DATE, ) - original_document = self._create_version_from_root( - root_doc, - text=text, - page_count=page_count, - mime_type=mime_type, - ) - actor = None + with get_date_parser() as date_parser: + date = next(date_parser.parse(self.filename, text), None) + archive_path = document_parser.get_archive_path() + page_count = document_parser.get_page_count( + self.working_copy, + mime_type, + ) - # Save the new version, potentially creating an audit log entry for the version addition if enabled. - if ( - settings.AUDIT_LOG_ENABLED - and self.metadata.actor_id is not None - ): - actor = User.objects.filter( - pk=self.metadata.actor_id, - ).first() - if actor is not None: - from auditlog.context import ( # type: ignore[import-untyped] - set_actor, - ) + except ParseError as e: + self._fail( + str(e), + f"Error occurred while consuming document {self.filename}: {e}", + exc_info=True, + exception=e, + ) + except Exception as e: + self._fail( + str(e), + f"Unexpected error while consuming document {self.filename}: {e}", + exc_info=True, + exception=e, + ) - with set_actor(actor): + # Prepare the document classifier. + + # TODO: I don't really like to do this here, but this way we avoid + # reloading the classifier multiple times, since there are multiple + # post-consume hooks that all require the classifier. + + classifier = load_classifier() + + self._send_progress( + 95, + 100, + ProgressStatusOptions.WORKING, + ConsumerStatusShortMessage.SAVE_DOCUMENT, + ) + # now that everything is done, we can start to store the document + # in the system. This will be a transaction and reasonably fast. + try: + with transaction.atomic(): + # store the document. + if self.input_doc.root_document_id: + # If this is a new version of an existing document, we need + # to make sure we're not creating a new document, but updating + # the existing one. + root_doc = Document.objects.get( + pk=self.input_doc.root_document_id, + ) + original_document = self._create_version_from_root( + root_doc, + text=text, + page_count=page_count, + mime_type=mime_type, + ) + actor = None + + # Save the new version, potentially creating an audit log entry for the version addition if enabled. + if ( + settings.AUDIT_LOG_ENABLED + and self.metadata.actor_id is not None + ): + actor = User.objects.filter( + pk=self.metadata.actor_id, + ).first() + if actor is not None: + from auditlog.context import ( # type: ignore[import-untyped] + set_actor, + ) + + with set_actor(actor): + original_document.save() + else: original_document.save() else: original_document.save() + + # Create a log entry for the version addition, if enabled + if settings.AUDIT_LOG_ENABLED: + from auditlog.models import ( # type: ignore[import-untyped] + LogEntry, + ) + + LogEntry.objects.log_create( + instance=root_doc, + changes={ + "Version Added": ["None", original_document.id], + }, + action=LogEntry.Action.UPDATE, + actor=actor, + additional_data={ + "reason": "Version added", + "version_id": original_document.id, + }, + ) + document = original_document else: - original_document.save() - - # Create a log entry for the version addition, if enabled - if settings.AUDIT_LOG_ENABLED: - from auditlog.models import ( # type: ignore[import-untyped] - LogEntry, + document = self._store( + text=text, + date=date, + page_count=page_count, + mime_type=mime_type, ) - LogEntry.objects.log_create( - instance=root_doc, - changes={ - "Version Added": ["None", original_document.id], - }, - action=LogEntry.Action.UPDATE, - actor=actor, - additional_data={ - "reason": "Version added", - "version_id": original_document.id, - }, - ) - document = original_document - else: - document = self._store( - text=text, - date=date, - page_count=page_count, - mime_type=mime_type, - ) + # If we get here, it was successful. Proceed with post-consume + # hooks. If they fail, nothing will get changed. - # If we get here, it was successful. Proceed with post-consume - # hooks. If they fail, nothing will get changed. - - document_consumption_finished.send( - sender=self.__class__, - document=document, - logging_group=self.logging_group, - classifier=classifier, - original_file=self.unmodified_original - if self.unmodified_original - else self.working_copy, - ) - - # After everything is in the database, copy the files into - # place. If this fails, we'll also rollback the transaction. - with FileLock(settings.MEDIA_LOCK): - generated_filename = generate_unique_filename(document) - if ( - len(str(generated_filename)) - > Document.MAX_STORED_FILENAME_LENGTH - ): - self.log.warning( - "Generated source filename exceeds db path limit, falling back to default naming", - ) - generated_filename = generate_filename( - document, - use_format=False, - ) - document.filename = generated_filename - create_source_path_directory(document.source_path) - - self._write( - self.unmodified_original - if self.unmodified_original is not None + document_consumption_finished.send( + sender=self.__class__, + document=document, + logging_group=self.logging_group, + classifier=classifier, + original_file=self.unmodified_original + if self.unmodified_original else self.working_copy, - document.source_path, ) - self._write( - thumbnail, - document.thumbnail_path, - ) - - if archive_path and Path(archive_path).is_file(): - generated_archive_filename = generate_unique_filename( - document, - archive_filename=True, - ) + # After everything is in the database, copy the files into + # place. If this fails, we'll also rollback the transaction. + with FileLock(settings.MEDIA_LOCK): + generated_filename = generate_unique_filename(document) if ( - len(str(generated_archive_filename)) + len(str(generated_filename)) > Document.MAX_STORED_FILENAME_LENGTH ): self.log.warning( - "Generated archive filename exceeds db path limit, falling back to default naming", + "Generated source filename exceeds db path limit, falling back to default naming", ) - generated_archive_filename = generate_filename( + generated_filename = generate_filename( document, - archive_filename=True, use_format=False, ) - document.archive_filename = generated_archive_filename - create_source_path_directory(document.archive_path) + document.filename = generated_filename + create_source_path_directory(document.source_path) + self._write( - archive_path, - document.archive_path, + self.unmodified_original + if self.unmodified_original is not None + else self.working_copy, + document.source_path, ) - with Path(archive_path).open("rb") as f: - document.archive_checksum = hashlib.md5( - f.read(), - ).hexdigest() + self._write( + thumbnail, + document.thumbnail_path, + ) - # Don't save with the lock active. Saving will cause the file - # renaming logic to acquire the lock as well. - # This triggers things like file renaming - document.save() + if archive_path and Path(archive_path).is_file(): + generated_archive_filename = generate_unique_filename( + document, + archive_filename=True, + ) + if ( + len(str(generated_archive_filename)) + > Document.MAX_STORED_FILENAME_LENGTH + ): + self.log.warning( + "Generated archive filename exceeds db path limit, falling back to default naming", + ) + generated_archive_filename = generate_filename( + document, + archive_filename=True, + use_format=False, + ) + document.archive_filename = generated_archive_filename + create_source_path_directory(document.archive_path) + self._write( + archive_path, + document.archive_path, + ) - if document.root_document_id: - document_updated.send( - sender=self.__class__, - document=document.root_document, - ) + with Path(archive_path).open("rb") as f: + document.archive_checksum = hashlib.md5( + f.read(), + ).hexdigest() - # Delete the file only if it was successfully consumed - self.log.debug( - f"Deleting original file {self.input_doc.original_file}", - ) - self.input_doc.original_file.unlink() - self.log.debug(f"Deleting working copy {self.working_copy}") - self.working_copy.unlink() - if self.unmodified_original is not None: # pragma: no cover + # Don't save with the lock active. Saving will cause the file + # renaming logic to acquire the lock as well. + # This triggers things like file renaming + document.save() + + if document.root_document_id: + document_updated.send( + sender=self.__class__, + document=document.root_document, + ) + + # Delete the file only if it was successfully consumed self.log.debug( - f"Deleting unmodified original file {self.unmodified_original}", + f"Deleting original file {self.input_doc.original_file}", ) - self.unmodified_original.unlink() + self.input_doc.original_file.unlink() + self.log.debug(f"Deleting working copy {self.working_copy}") + self.working_copy.unlink() + if self.unmodified_original is not None: # pragma: no cover + self.log.debug( + f"Deleting unmodified original file {self.unmodified_original}", + ) + self.unmodified_original.unlink() - # https://github.com/jonaswinkler/paperless-ng/discussions/1037 - shadow_file = ( - Path(self.input_doc.original_file).parent - / f"._{Path(self.input_doc.original_file).name}" + # https://github.com/jonaswinkler/paperless-ng/discussions/1037 + shadow_file = ( + Path(self.input_doc.original_file).parent + / f"._{Path(self.input_doc.original_file).name}" + ) + + if Path(shadow_file).is_file(): + self.log.debug(f"Deleting shadow file {shadow_file}") + Path(shadow_file).unlink() + + except Exception as e: + self._fail( + str(e), + f"The following error occurred while storing document " + f"{self.filename} after parsing: {e}", + exc_info=True, + exception=e, ) - if Path(shadow_file).is_file(): - self.log.debug(f"Deleting shadow file {shadow_file}") - Path(shadow_file).unlink() - - except Exception as e: - self._fail( - str(e), - f"The following error occurred while storing document " - f"{self.filename} after parsing: {e}", - exc_info=True, - exception=e, - ) - finally: - tempdir.cleanup() - self.run_post_consume_script(document) self.log.info(f"Document {document} consumption finished") From 8efb01010cf69ba02591a34a87afa0fa887ee9d9 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 26 Mar 2026 07:15:42 -0700 Subject: [PATCH 068/113] fix: Don't silently drop the change_groups and switch to a couple slightly more efficient implementations (#12431) --- src/documents/consumer.py | 5 +++-- src/documents/tasks.py | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 64622dc74..8f7efb0a2 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -1,6 +1,7 @@ import datetime import hashlib import os +import shutil import tempfile from enum import StrEnum from pathlib import Path @@ -824,7 +825,7 @@ class ConsumerPlugin( self.metadata.view_users is not None or self.metadata.view_groups is not None or self.metadata.change_users is not None - or self.metadata.change_users is not None + or self.metadata.change_groups is not None ): permissions = { "view": { @@ -857,7 +858,7 @@ class ConsumerPlugin( Path(source).open("rb") as read_file, Path(target).open("wb") as write_file, ): - write_file.write(read_file.read()) + shutil.copyfileobj(read_file, write_file) # Attempt to copy file's original stats, but it's ok if we can't try: diff --git a/src/documents/tasks.py b/src/documents/tasks.py index 751990c62..20351a49d 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -53,8 +53,8 @@ from documents.models import Tag from documents.models import WorkflowRun from documents.models import WorkflowTrigger from documents.plugins.base import ConsumeTaskPlugin -from documents.plugins.base import ProgressManager from documents.plugins.base import StopConsumeTaskError +from documents.plugins.helpers import ProgressManager from documents.plugins.helpers import ProgressStatusOptions from documents.sanity_checker import SanityCheckFailedException from documents.signals import document_updated @@ -533,13 +533,13 @@ def check_scheduled_workflows() -> None: id__in=matched_ids, ) - if documents.count() > 0: + if documents.exists(): documents = prefilter_documents_by_workflowtrigger( documents, trigger, ) - if documents.count() > 0: + if documents.exists(): logger.debug( f"Found {documents.count()} documents for trigger {trigger}", ) From ae0474450f067e2b296e3e74f3d1744f32d2d9c7 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 26 Mar 2026 07:36:02 -0700 Subject: [PATCH 069/113] Chore: logger, response and template sanitization cleanup (#12439) --- src/documents/templates/account/login.html | 10 +++++----- .../templates/account/password_reset.html | 4 ++-- .../account/password_reset_from_key.html | 8 ++++---- .../account/password_reset_from_key_done.html | 2 +- src/documents/templates/account/signup.html | 20 +++++++++---------- src/documents/templates/mfa/authenticate.html | 6 +++--- .../socialaccount/authentication_error.html | 2 +- .../templates/socialaccount/login.html | 4 +++- .../templates/socialaccount/signup.html | 14 +++++++------ src/documents/views.py | 5 ++++- src/documents/workflows/actions.py | 13 ++++++------ .../templates/email_msg_template.html | 19 ++++++++---------- src/paperless_mail/tests/test_mail_oauth.py | 5 ++++- src/paperless_mail/views.py | 15 ++++++++------ 14 files changed, 69 insertions(+), 58 deletions(-) diff --git a/src/documents/templates/account/login.html b/src/documents/templates/account/login.html index 767c21d7c..c66fa6e44 100644 --- a/src/documents/templates/account/login.html +++ b/src/documents/templates/account/login.html @@ -9,7 +9,7 @@

{% translate "Please sign in." %} {% if ACCOUNT_ALLOW_SIGNUPS %} -
{% blocktrans %}Don't have an account yet? Sign up{% endblocktrans %} +
{% translate "Don't have an account yet?" %} {% translate "Sign up" %} {% endif %}

{% endblock form_top_content %} @@ -25,12 +25,12 @@ {% translate "Username" as i18n_username %} {% translate "Password" as i18n_password %}
- - + +
- - + +
diff --git a/src/documents/templates/account/password_reset.html b/src/documents/templates/account/password_reset.html index 019babd52..64629c76d 100644 --- a/src/documents/templates/account/password_reset.html +++ b/src/documents/templates/account/password_reset.html @@ -14,8 +14,8 @@ {% endif %} {% translate "Email" as i18n_email %}
- - + +
diff --git a/src/documents/templates/account/password_reset_from_key.html b/src/documents/templates/account/password_reset_from_key.html index a9b2c3406..bc06ee85c 100644 --- a/src/documents/templates/account/password_reset_from_key.html +++ b/src/documents/templates/account/password_reset_from_key.html @@ -17,12 +17,12 @@ {% translate "New Password" as i18n_new_password1 %} {% translate "Confirm Password" as i18n_new_password2 %}
- - + +
- - + +
diff --git a/src/documents/templates/account/password_reset_from_key_done.html b/src/documents/templates/account/password_reset_from_key_done.html index 420901a6c..4909ea9be 100644 --- a/src/documents/templates/account/password_reset_from_key_done.html +++ b/src/documents/templates/account/password_reset_from_key_done.html @@ -11,5 +11,5 @@ {% block form_content %} {% url 'account_login' as login_url %} -

{% blocktranslate %}Your new password has been set. You can now log in{% endblocktranslate %}.

+

{% translate "Your new password has been set. You can now" %} {% translate "log in" %}.

{% endblock form_content %} diff --git a/src/documents/templates/account/signup.html b/src/documents/templates/account/signup.html index 9ab79d3df..000cd6366 100644 --- a/src/documents/templates/account/signup.html +++ b/src/documents/templates/account/signup.html @@ -8,7 +8,7 @@ {% block form_top_content %} {% if not FIRST_INSTALL %}

- {% blocktrans %}Already have an account? Sign in{% endblocktrans %} + {% translate "Already have an account?" %} {% translate "Sign in" %}

{% endif %} {% endblock form_top_content %} @@ -16,7 +16,7 @@ {% block form_content %} {% if FIRST_INSTALL %}

- {% blocktrans %}Note: This is the first user account for this installation and will be granted superuser privileges.{% endblocktrans %} + {% translate "Note: This is the first user account for this installation and will be granted superuser privileges." %}

{% endif %} {% translate "Username" as i18n_username %} @@ -24,20 +24,20 @@ {% translate "Password" as i18n_password1 %} {% translate "Password (again)" as i18n_password2 %}
- - + +
- - + +
- - + +
- - + +
diff --git a/src/documents/templates/mfa/authenticate.html b/src/documents/templates/mfa/authenticate.html index cfc29da2b..e86565189 100644 --- a/src/documents/templates/mfa/authenticate.html +++ b/src/documents/templates/mfa/authenticate.html @@ -9,15 +9,15 @@ {% block form_top_content %}

- {% blocktranslate %}Your account is protected by two-factor authentication. Please enter an authenticator code:{% endblocktranslate %} + {% translate "Your account is protected by two-factor authentication. Please enter an authenticator code:" %}

{% endblock form_top_content %} {% block form_content %} {% translate "Code" as i18n_code %}
- - + +
diff --git a/src/documents/templates/socialaccount/authentication_error.html b/src/documents/templates/socialaccount/authentication_error.html index 6450a1678..8891f924e 100644 --- a/src/documents/templates/socialaccount/authentication_error.html +++ b/src/documents/templates/socialaccount/authentication_error.html @@ -7,5 +7,5 @@ {% block form_content %} {% url 'account_login' as login_url %} -

{% blocktranslate %}An error occurred while attempting to login via your social network account. Back to the login page{% endblocktranslate %}

+

{% translate "An error occurred while attempting to login via your social network account. Back to the" %} {% translate "login page" %}

{% endblock form_content %} diff --git a/src/documents/templates/socialaccount/login.html b/src/documents/templates/socialaccount/login.html index 70c71ced2..4e2e595a0 100644 --- a/src/documents/templates/socialaccount/login.html +++ b/src/documents/templates/socialaccount/login.html @@ -7,7 +7,9 @@ {% block form_content %}

- {% blocktrans with provider.name as provider %}You are about to connect a new third-party account from {{ provider }}.{% endblocktrans %} + {% filter force_escape %} + {% blocktrans with provider=provider.name %}You are about to connect a new third-party account from {{ provider }}.{% endblocktrans %} + {% endfilter %}

diff --git a/src/documents/templates/socialaccount/signup.html b/src/documents/templates/socialaccount/signup.html index 01f70a524..cf84ea935 100644 --- a/src/documents/templates/socialaccount/signup.html +++ b/src/documents/templates/socialaccount/signup.html @@ -7,18 +7,20 @@ {% block form_content %}

- {% blocktrans with provider_name=account.get_provider.name %}You are about to use your {{provider_name}} account to login.{% endblocktrans %} - {% blocktrans %}As a final step, please complete the following form:{% endblocktrans %} + {% filter force_escape %} + {% blocktrans with provider_name=account.get_provider.name %}You are about to use your {{ provider_name }} account to login.{% endblocktrans %} + {% endfilter %} + {% translate "As a final step, please complete the following form:" %}

{% translate "Username" as i18n_username %} {% translate "Email (optional)" as i18n_email %}
- - + +
- - + +
{% if redirect_field_value %} diff --git a/src/documents/views.py b/src/documents/views.py index 0716ce66d..600acf078 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -2027,7 +2027,10 @@ class UnifiedSearchViewSet(DocumentViewSet): except NotFound: raise except PermissionDenied as e: - return HttpResponseForbidden(str(e.detail)) + invalid_more_like_id_message = _("Invalid more_like_id") + if str(e.detail) == str(invalid_more_like_id_message): + return HttpResponseForbidden(invalid_more_like_id_message) + return HttpResponseForbidden(_("Insufficient permissions.")) except Exception as e: logger.warning(f"An error occurred listing search results: {e!s}") return HttpResponseBadRequest( diff --git a/src/documents/workflows/actions.py b/src/documents/workflows/actions.py index 46d9f5c4a..9744048e5 100644 --- a/src/documents/workflows/actions.py +++ b/src/documents/workflows/actions.py @@ -282,7 +282,7 @@ def execute_password_removal_action( passwords = action.passwords if not passwords: logger.warning( - "Password removal action %s has no passwords configured", + "Workflow action %s has no configured unlock values", action.pk, extra={"group": logging_group}, ) @@ -321,22 +321,23 @@ def execute_password_removal_action( user=document.owner, ) logger.info( - "Removed password from document %s using workflow action %s", + "Unlocked document %s using workflow action %s", document.pk, action.pk, extra={"group": logging_group}, ) return - except ValueError as e: + except ValueError: logger.warning( - "Password removal failed for document %s with supplied password: %s", + "Workflow action %s could not unlock document %s with one configured value", + action.pk, document.pk, - e, extra={"group": logging_group}, ) logger.error( - "Password removal failed for document %s after trying all provided passwords", + "Workflow action %s could not unlock document %s with any configured value", + action.pk, document.pk, extra={"group": logging_group}, ) diff --git a/src/paperless_mail/templates/email_msg_template.html b/src/paperless_mail/templates/email_msg_template.html index a22666957..9df67e997 100644 --- a/src/paperless_mail/templates/email_msg_template.html +++ b/src/paperless_mail/templates/email_msg_template.html @@ -1,4 +1,3 @@ -{% autoescape off %} @@ -13,36 +12,34 @@
-
{{ date }}
+
{{ date|safe }}
{{ from_label }}
-
{{ from }}
+
{{ from|safe }}
{{ subject_label }}
-
{{ subject }}
+
{{ subject|safe }}
{{ to_label }}
-
{{ to }}
+
{{ to|safe }}
{{ cc_label }}
-
{{ cc }}
+
{{ cc|safe }}
{{ bcc_label }}
-
{{ bcc }}
+
{{ bcc|safe }}
{{ attachments_label }}
-
{{ attachments }}
+
{{ attachments|safe }}
-
{{ content }}
+
{{ content|safe }}
- -{% endautoescape %} diff --git a/src/paperless_mail/tests/test_mail_oauth.py b/src/paperless_mail/tests/test_mail_oauth.py index 651094673..d94e7947b 100644 --- a/src/paperless_mail/tests/test_mail_oauth.py +++ b/src/paperless_mail/tests/test_mail_oauth.py @@ -191,7 +191,10 @@ class TestMailOAuth( ).exists(), ) - self.assertIn("Error getting access token: test_error", cm.output[0]) + self.assertIn( + "Error getting access token from OAuth provider", + cm.output[0], + ) def test_oauth_callback_view_insufficient_permissions(self) -> None: """ diff --git a/src/paperless_mail/views.py b/src/paperless_mail/views.py index b8ac2c485..2593797f3 100644 --- a/src/paperless_mail/views.py +++ b/src/paperless_mail/views.py @@ -138,13 +138,16 @@ class MailAccountViewSet(ModelViewSet, PassUserMixin): existing_account.refresh_from_db() account.password = existing_account.password else: + logger.error( + "Mail account connectivity test failed: Unable to refresh oauth token", + ) raise MailError("Unable to refresh oauth token") mailbox_login(M, account) return Response({"success": True}) - except MailError as e: + except MailError: logger.error( - f"Mail account {account} test failed: {e}", + "Mail account connectivity test failed", ) return HttpResponseBadRequest("Unable to connect to server") @@ -218,7 +221,7 @@ class OauthCallbackView(GenericAPIView): if code is None: logger.error( - f"Invalid oauth callback request, code: {code}, scope: {scope}", + "Invalid oauth callback request: missing code", ) return HttpResponseBadRequest("Invalid request, see logs for more detail") @@ -229,7 +232,7 @@ class OauthCallbackView(GenericAPIView): state = request.query_params.get("state", "") if not oauth_manager.validate_state(state): logger.error( - f"Invalid oauth callback request received state: {state}, expected: {oauth_manager.state}", + "Invalid oauth callback request: state validation failed", ) return HttpResponseBadRequest("Invalid request, see logs for more detail") @@ -276,8 +279,8 @@ class OauthCallbackView(GenericAPIView): return HttpResponseRedirect( f"{oauth_manager.oauth_redirect_url}?oauth_success=1&account_id={account.pk}", ) - except GetAccessTokenError as e: - logger.error(f"Error getting access token: {e}") + except GetAccessTokenError: + logger.error("Error getting access token from OAuth provider") return HttpResponseRedirect( f"{oauth_manager.oauth_redirect_url}?oauth_success=0", ) From 38dba60ceb11d24d796df61416552abfc7190776 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 26 Mar 2026 07:36:32 -0700 Subject: [PATCH 070/113] Enhancement: auto-hide the search bar on mobile (#12404) --- .../app-frame/app-frame.component.html | 7 +-- .../app-frame/app-frame.component.scss | 17 ++++++ .../app-frame/app-frame.component.spec.ts | 53 +++++++++++++++++++ .../app-frame/app-frame.component.ts | 40 ++++++++++++++ .../document-list.component.scss | 9 +++- 5 files changed, 122 insertions(+), 4 deletions(-) diff --git a/src-ui/src/app/components/app-frame/app-frame.component.html b/src-ui/src/app/components/app-frame/app-frame.component.html index d876e28ea..11a4aefe2 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.html +++ b/src-ui/src/app/components/app-frame/app-frame.component.html @@ -1,7 +1,7 @@
-
+
@@ -378,7 +379,7 @@
-
diff --git a/src-ui/src/app/components/app-frame/app-frame.component.scss b/src-ui/src/app/components/app-frame/app-frame.component.scss index 77bf9bf21..c069eeefc 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.scss +++ b/src-ui/src/app/components/app-frame/app-frame.component.scss @@ -44,6 +44,23 @@ .sidebar { top: 3.5rem; } + + .search-container { + max-height: 4.5rem; + overflow: hidden; + transition: max-height .2s ease, opacity .2s ease, padding-top .2s ease, padding-bottom .2s ease; + + &.mobile-hidden { + max-height: 0; + opacity: 0; + padding-top: 0 !important; + padding-bottom: 0 !important; + } + } + + main.mobile-search-hidden { + padding-top: 56px; + } } main { diff --git a/src-ui/src/app/components/app-frame/app-frame.component.spec.ts b/src-ui/src/app/components/app-frame/app-frame.component.spec.ts index 931f46254..1341c6e5a 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.spec.ts +++ b/src-ui/src/app/components/app-frame/app-frame.component.spec.ts @@ -293,6 +293,59 @@ describe('AppFrameComponent', () => { expect(component.isMenuCollapsed).toBeTruthy() }) + it('should hide mobile search when scrolling down and show it when scrolling up', () => { + Object.defineProperty(globalThis, 'innerWidth', { + value: 767, + }) + + component.ngOnInit() + + Object.defineProperty(globalThis, 'scrollY', { + configurable: true, + value: 40, + }) + component.onWindowScroll() + expect(component.mobileSearchHidden).toBe(true) + + Object.defineProperty(globalThis, 'scrollY', { + configurable: true, + value: 0, + }) + component.onWindowScroll() + expect(component.mobileSearchHidden).toBe(false) + }) + + it('should keep mobile search visible on desktop scroll or resize', () => { + Object.defineProperty(globalThis, 'innerWidth', { + value: 1024, + }) + component.ngOnInit() + component.mobileSearchHidden = true + + component.onWindowScroll() + + expect(component.mobileSearchHidden).toBe(false) + + component.mobileSearchHidden = true + component.onWindowResize() + }) + + it('should keep mobile search visible while the mobile menu is expanded', () => { + Object.defineProperty(globalThis, 'innerWidth', { + value: 767, + }) + component.ngOnInit() + component.isMenuCollapsed = false + + Object.defineProperty(globalThis, 'scrollY', { + configurable: true, + value: 40, + }) + component.onWindowScroll() + + expect(component.mobileSearchHidden).toBe(false) + }) + it('should support close document & navigate on close current doc', () => { const closeSpy = jest.spyOn(openDocumentsService, 'closeDocument') closeSpy.mockReturnValue(of(true)) diff --git a/src-ui/src/app/components/app-frame/app-frame.component.ts b/src-ui/src/app/components/app-frame/app-frame.component.ts index 5218d829c..7989eb3e1 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.ts +++ b/src-ui/src/app/components/app-frame/app-frame.component.ts @@ -51,6 +51,8 @@ import { ComponentWithPermissions } from '../with-permissions/with-permissions.c import { GlobalSearchComponent } from './global-search/global-search.component' import { ToastsDropdownComponent } from './toasts-dropdown/toasts-dropdown.component' +const SCROLL_THRESHOLD = 16 + @Component({ selector: 'pngx-app-frame', templateUrl: './app-frame.component.html', @@ -94,6 +96,10 @@ export class AppFrameComponent slimSidebarAnimating: boolean = false + public mobileSearchHidden: boolean = false + + private lastScrollY: number = 0 + constructor() { super() const permissionsService = this.permissionsService @@ -111,6 +117,8 @@ export class AppFrameComponent } ngOnInit(): void { + this.lastScrollY = window.scrollY + if (this.settingsService.get(SETTINGS_KEYS.UPDATE_CHECKING_ENABLED)) { this.checkForUpdates() } @@ -263,6 +271,38 @@ export class AppFrameComponent return this.settingsService.get(SETTINGS_KEYS.AI_ENABLED) } + @HostListener('window:resize') + onWindowResize(): void { + if (!this.isMobileViewport()) { + this.mobileSearchHidden = false + } + } + + @HostListener('window:scroll') + onWindowScroll(): void { + const currentScrollY = window.scrollY + + if (!this.isMobileViewport() || this.isMenuCollapsed === false) { + this.mobileSearchHidden = false + this.lastScrollY = currentScrollY + return + } + + const delta = currentScrollY - this.lastScrollY + + if (currentScrollY <= 0 || delta < -SCROLL_THRESHOLD) { + this.mobileSearchHidden = false + } else if (currentScrollY > SCROLL_THRESHOLD && delta > SCROLL_THRESHOLD) { + this.mobileSearchHidden = true + } + + this.lastScrollY = currentScrollY + } + + private isMobileViewport(): boolean { + return window.innerWidth < 768 + } + closeMenu() { this.isMenuCollapsed = true } diff --git a/src-ui/src/app/components/document-list/document-list.component.scss b/src-ui/src/app/components/document-list/document-list.component.scss index 0e10b83da..06f4c4531 100644 --- a/src-ui/src/app/components/document-list/document-list.component.scss +++ b/src-ui/src/app/components/document-list/document-list.component.scss @@ -56,13 +56,20 @@ $paperless-card-breakpoints: ( .sticky-top { z-index: 990; // below main navbar - top: calc(7rem - 2px); // height of navbar (mobile) + top: calc(7rem - 2px); // height of navbar + search row (mobile) + transition: top 0.2s ease; @media (min-width: 580px) { top: 3.5rem; // height of navbar } } +@media (max-width: 579.98px) { + :host-context(main.mobile-search-hidden) .sticky-top { + top: calc(3.5rem - 2px); // height of navbar only when search is hidden + } +} + .table .form-check { padding: 0.2rem; min-height: 0; From b153ec803b3dd4e9fba7c35c2be10aa6f4897c1f Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 14:38:10 +0000 Subject: [PATCH 071/113] Auto translate strings --- src-ui/messages.xlf | 110 ++++++++++++------------- src/locale/en_US/LC_MESSAGES/django.po | 62 +++++++------- 2 files changed, 88 insertions(+), 84 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index b250f523c..d324f384f 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -297,11 +297,11 @@ src/app/components/app-frame/app-frame.component.html - 87 + 88 src/app/components/app-frame/app-frame.component.html - 89 + 90 src/app/components/dashboard/dashboard.component.html @@ -324,11 +324,11 @@ src/app/components/app-frame/app-frame.component.html - 94 + 95 src/app/components/app-frame/app-frame.component.html - 96 + 97 src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html @@ -375,15 +375,15 @@ src/app/components/app-frame/app-frame.component.html - 54 + 55 src/app/components/app-frame/app-frame.component.html - 273 + 274 src/app/components/app-frame/app-frame.component.html - 275 + 276 @@ -728,11 +728,11 @@ src/app/components/app-frame/app-frame.component.html - 308 + 309 src/app/components/app-frame/app-frame.component.html - 311 + 312 @@ -1139,11 +1139,11 @@ src/app/components/app-frame/app-frame.component.html - 233 + 234 src/app/components/app-frame/app-frame.component.html - 235 + 236 src/app/components/manage/saved-views/saved-views.component.html @@ -1700,7 +1700,7 @@ src/app/components/app-frame/app-frame.component.html - 204 + 205 src/app/components/common/input/tags/tags.component.ts @@ -1782,15 +1782,15 @@ src/app/components/app-frame/app-frame.component.ts - 156 + 164 src/app/components/app-frame/app-frame.component.ts - 230 + 238 src/app/components/app-frame/app-frame.component.ts - 255 + 263 @@ -1801,11 +1801,11 @@ src/app/components/app-frame/app-frame.component.html - 296 + 297 src/app/components/app-frame/app-frame.component.html - 298 + 299 @@ -2224,11 +2224,11 @@ src/app/components/app-frame/app-frame.component.html - 256 + 257 src/app/components/app-frame/app-frame.component.html - 259 + 260 @@ -2581,11 +2581,11 @@ src/app/components/app-frame/app-frame.component.html - 287 + 288 src/app/components/app-frame/app-frame.component.html - 289 + 290 @@ -2897,90 +2897,90 @@ Logged in as src/app/components/app-frame/app-frame.component.html - 46 + 47 My Profile src/app/components/app-frame/app-frame.component.html - 50 + 51 Logout src/app/components/app-frame/app-frame.component.html - 57 + 58 Documentation src/app/components/app-frame/app-frame.component.html - 62 + 63 src/app/components/app-frame/app-frame.component.html - 317 + 318 src/app/components/app-frame/app-frame.component.html - 320 + 321 Saved views src/app/components/app-frame/app-frame.component.html - 104 + 105 src/app/components/app-frame/app-frame.component.html - 134 + 135 Open documents src/app/components/app-frame/app-frame.component.html - 143 + 144 Close all src/app/components/app-frame/app-frame.component.html - 163 + 164 src/app/components/app-frame/app-frame.component.html - 165 + 166 Manage src/app/components/app-frame/app-frame.component.html - 174 + 175 Attributes src/app/components/app-frame/app-frame.component.html - 181 + 182 src/app/components/app-frame/app-frame.component.html - 183 + 184 Correspondents src/app/components/app-frame/app-frame.component.html - 209 + 210 src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html @@ -2995,7 +2995,7 @@ Document types src/app/components/app-frame/app-frame.component.html - 214 + 215 src/app/components/manage/document-attributes/document-attributes.component.ts @@ -3006,7 +3006,7 @@ Storage paths src/app/components/app-frame/app-frame.component.html - 219 + 220 src/app/components/manage/document-attributes/document-attributes.component.ts @@ -3017,7 +3017,7 @@ Custom fields src/app/components/app-frame/app-frame.component.html - 224 + 225 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -3040,11 +3040,11 @@ Workflows src/app/components/app-frame/app-frame.component.html - 242 + 243 src/app/components/app-frame/app-frame.component.html - 244 + 245 src/app/components/manage/workflows/workflows.component.html @@ -3055,92 +3055,92 @@ Mail src/app/components/app-frame/app-frame.component.html - 249 + 250 src/app/components/app-frame/app-frame.component.html - 252 + 253 Administration src/app/components/app-frame/app-frame.component.html - 267 + 268 Configuration src/app/components/app-frame/app-frame.component.html - 280 + 281 src/app/components/app-frame/app-frame.component.html - 282 + 283 GitHub src/app/components/app-frame/app-frame.component.html - 327 + 328 is available. src/app/components/app-frame/app-frame.component.html - 336,337 + 337,338 Click to view. src/app/components/app-frame/app-frame.component.html - 337 + 338 Paperless-ngx can automatically check for updates src/app/components/app-frame/app-frame.component.html - 341 + 342 How does this work? src/app/components/app-frame/app-frame.component.html - 348,350 + 349,351 Update available src/app/components/app-frame/app-frame.component.html - 361 + 362 Sidebar views updated src/app/components/app-frame/app-frame.component.ts - 343 + 383 Error updating sidebar views src/app/components/app-frame/app-frame.component.ts - 346 + 386 An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 367 + 407 diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index ceb207dfa..36caa615f 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-22 13:54+0000\n" +"POT-Creation-Date: 2026-03-26 14:37+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -1301,7 +1301,7 @@ msgstr "" #: documents/serialisers.py:463 documents/serialisers.py:815 #: documents/serialisers.py:2501 documents/views.py:1990 -#: paperless_mail/serialisers.py:143 +#: documents/views.py:2033 paperless_mail/serialisers.py:143 msgid "Insufficient permissions." msgstr "" @@ -1341,7 +1341,7 @@ msgstr "" msgid "Duplicate document identifiers are not allowed." msgstr "" -#: documents/serialisers.py:2587 documents/views.py:3596 +#: documents/serialisers.py:2587 documents/views.py:3599 #, python-format msgid "Documents not found: %(ids)s" msgstr "" @@ -1383,13 +1383,18 @@ msgid "Please sign in." msgstr "" #: documents/templates/account/login.html:12 -#, python-format -msgid "Don't have an account yet? Sign up" +msgid "Don't have an account yet?" +msgstr "" + +#: documents/templates/account/login.html:12 +#: documents/templates/account/signup.html:43 +#: documents/templates/socialaccount/signup.html:29 +msgid "Sign up" msgstr "" #: documents/templates/account/login.html:25 #: documents/templates/account/signup.html:22 -#: documents/templates/socialaccount/signup.html:13 +#: documents/templates/socialaccount/signup.html:15 msgid "Username" msgstr "" @@ -1399,6 +1404,7 @@ msgid "Password" msgstr "" #: documents/templates/account/login.html:36 +#: documents/templates/account/signup.html:11 #: documents/templates/mfa/authenticate.html:23 msgid "Sign in" msgstr "" @@ -1477,10 +1483,11 @@ msgid "Password reset complete." msgstr "" #: documents/templates/account/password_reset_from_key_done.html:14 -#, python-format -msgid "" -"Your new password has been set. You can now log " -"in" +msgid "Your new password has been set. You can now" +msgstr "" + +#: documents/templates/account/password_reset_from_key_done.html:14 +msgid "log in" msgstr "" #: documents/templates/account/signup.html:5 @@ -1488,8 +1495,7 @@ msgid "Paperless-ngx sign up" msgstr "" #: documents/templates/account/signup.html:11 -#, python-format -msgid "Already have an account? Sign in" +msgid "Already have an account?" msgstr "" #: documents/templates/account/signup.html:19 @@ -1499,7 +1505,7 @@ msgid "" msgstr "" #: documents/templates/account/signup.html:23 -#: documents/templates/socialaccount/signup.html:14 +#: documents/templates/socialaccount/signup.html:16 msgid "Email (optional)" msgstr "" @@ -1507,11 +1513,6 @@ msgstr "" msgid "Password (again)" msgstr "" -#: documents/templates/account/signup.html:43 -#: documents/templates/socialaccount/signup.html:27 -msgid "Sign up" -msgstr "" - #: documents/templates/index.html:61 msgid "Paperless-ngx is loading..." msgstr "" @@ -1556,18 +1557,21 @@ msgid "Paperless-ngx social account sign in" msgstr "" #: documents/templates/socialaccount/authentication_error.html:10 -#, python-format msgid "" "An error occurred while attempting to login via your social network account. " -"Back to the login page" +"Back to the" msgstr "" -#: documents/templates/socialaccount/login.html:10 +#: documents/templates/socialaccount/authentication_error.html:10 +msgid "login page" +msgstr "" + +#: documents/templates/socialaccount/login.html:11 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" -#: documents/templates/socialaccount/login.html:13 +#: documents/templates/socialaccount/login.html:15 msgid "Continue" msgstr "" @@ -1575,12 +1579,12 @@ msgstr "" msgid "Paperless-ngx social account sign up" msgstr "" -#: documents/templates/socialaccount/signup.html:10 +#: documents/templates/socialaccount/signup.html:11 #, python-format msgid "You are about to use your %(provider_name)s account to login." msgstr "" -#: documents/templates/socialaccount/signup.html:11 +#: documents/templates/socialaccount/signup.html:13 msgid "As a final step, please complete the following form:" msgstr "" @@ -1605,24 +1609,24 @@ msgstr "" msgid "Unable to parse URI {value}" msgstr "" -#: documents/views.py:1983 +#: documents/views.py:1983 documents/views.py:2030 msgid "Invalid more_like_id" msgstr "" -#: documents/views.py:3608 +#: documents/views.py:3611 #, python-format msgid "Insufficient permissions to share document %(id)s." msgstr "" -#: documents/views.py:3651 +#: documents/views.py:3654 msgid "Bundle is already being processed." msgstr "" -#: documents/views.py:3708 +#: documents/views.py:3711 msgid "The share link bundle is still being prepared. Please try again later." msgstr "" -#: documents/views.py:3718 +#: documents/views.py:3721 msgid "The share link bundle is unavailable." msgstr "" From 0060b46c8b46c2e3df9687876d278dd02ee1402b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 09:04:20 -0700 Subject: [PATCH 072/113] Chore(deps): Bump requests in the uv group across 1 directory (#12441) Bumps the uv group with 1 update in the / directory: [requests](https://github.com/psf/requests). Updates `requests` from 2.32.5 to 2.33.0 - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.32.5...v2.33.0) --- updated-dependencies: - dependency-name: requests dependency-version: 2.33.0 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 9b085ec01..53cbeb689 100644 --- a/uv.lock +++ b/uv.lock @@ -4211,7 +4211,7 @@ wheels = [ [[package]] name = "requests" -version = "2.32.5" +version = "2.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -4219,9 +4219,9 @@ dependencies = [ { name = "idna", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "urllib3", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, + { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, ] [[package]] From 9383471fa0af36506bd854aa9274e509f5d5ee3b Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 26 Mar 2026 11:28:02 -0700 Subject: [PATCH 073/113] Feature: Transition all checksums to use SHA256 (#12432) --- src/documents/consumer.py | 20 ++- .../management/commands/document_exporter.py | 3 +- .../migrations/0016_sha256_checksums.py | 130 +++++++++++++++++ src/documents/models.py | 4 +- src/documents/sanity_checker.py | 6 +- src/documents/tasks.py | 5 +- src/documents/tests/conftest.py | 4 +- src/documents/tests/factories.py | 2 +- src/documents/tests/test_consumer.py | 10 +- .../tests/test_management_exporter.py | 14 +- .../tests/test_management_importer.py | 4 +- .../tests/test_migration_sha256_checksums.py | 132 ++++++++++++++++++ src/documents/utils.py | 26 ++++ 13 files changed, 325 insertions(+), 35 deletions(-) create mode 100644 src/documents/migrations/0016_sha256_checksums.py create mode 100644 src/documents/tests/test_migration_sha256_checksums.py diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 8f7efb0a2..6ae5914b7 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -1,5 +1,4 @@ import datetime -import hashlib import os import shutil import tempfile @@ -47,6 +46,7 @@ from documents.signals import document_consumption_started from documents.signals import document_updated from documents.signals.handlers import run_workflows from documents.templating.workflows import parse_w_workflow_placeholders +from documents.utils import compute_checksum from documents.utils import copy_basic_file_stats from documents.utils import copy_file_with_basic_stats from documents.utils import run_subprocess @@ -197,9 +197,7 @@ class ConsumerPlugin( version_doc = Document( root_document=root_doc_frozen, version_index=next_version_index + 1, - checksum=hashlib.md5( - file_for_checksum.read_bytes(), - ).hexdigest(), + checksum=compute_checksum(file_for_checksum), content=text or "", page_count=page_count, mime_type=mime_type, @@ -634,10 +632,9 @@ class ConsumerPlugin( document.archive_path, ) - with Path(archive_path).open("rb") as f: - document.archive_checksum = hashlib.md5( - f.read(), - ).hexdigest() + document.archive_checksum = compute_checksum( + document.archive_path, + ) # Don't save with the lock active. Saving will cause the file # renaming logic to acquire the lock as well. @@ -777,7 +774,7 @@ class ConsumerPlugin( title=title[:127], content=text, mime_type=mime_type, - checksum=hashlib.md5(file_for_checksum.read_bytes()).hexdigest(), + checksum=compute_checksum(file_for_checksum), created=create_date, modified=create_date, page_count=page_count, @@ -894,10 +891,9 @@ class ConsumerPreflightPlugin( def pre_check_duplicate(self) -> None: """ - Using the MD5 of the file, check this exact file doesn't already exist + Using the SHA256 of the file, check this exact file doesn't already exist """ - with Path(self.input_doc.original_file).open("rb") as f: - checksum = hashlib.md5(f.read()).hexdigest() + checksum = compute_checksum(Path(self.input_doc.original_file)) existing_doc = Document.global_objects.filter( Q(checksum=checksum) | Q(archive_checksum=checksum), ) diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py index b8ccca0ab..cd1cee6b3 100644 --- a/src/documents/management/commands/document_exporter.py +++ b/src/documents/management/commands/document_exporter.py @@ -56,6 +56,7 @@ from documents.models import WorkflowTrigger from documents.settings import EXPORTER_ARCHIVE_NAME from documents.settings import EXPORTER_FILE_NAME from documents.settings import EXPORTER_THUMBNAIL_NAME +from documents.utils import compute_checksum from documents.utils import copy_file_with_basic_stats from paperless import version from paperless.models import ApplicationConfiguration @@ -693,7 +694,7 @@ class Command(CryptMixin, PaperlessCommand): source_stat = source.stat() target_stat = target.stat() if self.compare_checksums and source_checksum: - target_checksum = hashlib.md5(target.read_bytes()).hexdigest() + target_checksum = compute_checksum(target) perform_copy = target_checksum != source_checksum elif ( source_stat.st_mtime != target_stat.st_mtime diff --git a/src/documents/migrations/0016_sha256_checksums.py b/src/documents/migrations/0016_sha256_checksums.py new file mode 100644 index 000000000..de1c6c596 --- /dev/null +++ b/src/documents/migrations/0016_sha256_checksums.py @@ -0,0 +1,130 @@ +import hashlib +import logging +from pathlib import Path + +from django.conf import settings +from django.db import migrations +from django.db import models + +logger = logging.getLogger("paperless.migrations") + +_CHUNK_SIZE = 65536 # 64 KiB — avoids loading entire files into memory +_BATCH_SIZE = 500 # documents per bulk_update call +_PROGRESS_INTERVAL = 500 # log a progress line every N documents + + +def _sha256(path: Path) -> str: + h = hashlib.sha256() + with path.open("rb") as fh: + while chunk := fh.read(_CHUNK_SIZE): + h.update(chunk) + return h.hexdigest() + + +def recompute_checksums(apps, schema_editor): + """Recompute all document checksums from MD5 to SHA256.""" + Document = apps.get_model("documents", "Document") + + total = Document.objects.count() + if total == 0: + return + + logger.info("Recomputing SHA-256 checksums for %d document(s)...", total) + + batch: list = [] + processed = 0 + + for doc in Document.objects.only( + "pk", + "filename", + "checksum", + "archive_filename", + "archive_checksum", + ).iterator(chunk_size=_BATCH_SIZE): + updated_fields: list[str] = [] + + # Reconstruct source path the same way Document.source_path does + fname = str(doc.filename) if doc.filename else f"{doc.pk:07}.pdf" + source_path = (settings.ORIGINALS_DIR / Path(fname)).resolve() + + if source_path.exists(): + doc.checksum = _sha256(source_path) + updated_fields.append("checksum") + else: + logger.warning( + "Document %s: original file %s not found, checksum not updated.", + doc.pk, + source_path, + ) + + # Mirror Document.has_archive_version: archive_filename is not None + if doc.archive_filename is not None: + archive_path = ( + settings.ARCHIVE_DIR / Path(str(doc.archive_filename)) + ).resolve() + if archive_path.exists(): + doc.archive_checksum = _sha256(archive_path) + updated_fields.append("archive_checksum") + else: + logger.warning( + "Document %s: archive file %s not found, checksum not updated.", + doc.pk, + archive_path, + ) + + if updated_fields: + batch.append(doc) + + processed += 1 + + if len(batch) >= _BATCH_SIZE: + Document.objects.bulk_update(batch, ["checksum", "archive_checksum"]) + batch.clear() + + if processed % _PROGRESS_INTERVAL == 0: + logger.info( + "SHA-256 checksum progress: %d/%d (%d%%)", + processed, + total, + processed * 100 // total, + ) + + if batch: + Document.objects.bulk_update(batch, ["checksum", "archive_checksum"]) + + logger.info( + "SHA-256 checksum recomputation complete: %d document(s) processed.", + total, + ) + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0015_document_version_index_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="document", + name="checksum", + field=models.CharField( + editable=False, + help_text="The checksum of the original document.", + max_length=64, + verbose_name="checksum", + ), + ), + migrations.AlterField( + model_name="document", + name="archive_checksum", + field=models.CharField( + blank=True, + editable=False, + help_text="The checksum of the archived document.", + max_length=64, + null=True, + verbose_name="archive checksum", + ), + ), + migrations.RunPython(recompute_checksums, migrations.RunPython.noop), + ] diff --git a/src/documents/models.py b/src/documents/models.py index 6147ac001..08f995ff6 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -216,14 +216,14 @@ class Document(SoftDeleteModel, ModelWithOwner): # type: ignore[django-manager- checksum = models.CharField( _("checksum"), - max_length=32, + max_length=64, editable=False, help_text=_("The checksum of the original document."), ) archive_checksum = models.CharField( _("archive checksum"), - max_length=32, + max_length=64, editable=False, blank=True, null=True, diff --git a/src/documents/sanity_checker.py b/src/documents/sanity_checker.py index ef0d37e7d..b53ed8cfb 100644 --- a/src/documents/sanity_checker.py +++ b/src/documents/sanity_checker.py @@ -11,7 +11,6 @@ is an identity function that adds no overhead. from __future__ import annotations -import hashlib import logging import uuid from collections import defaultdict @@ -30,6 +29,7 @@ from django.utils import timezone from documents.models import Document from documents.models import PaperlessTask +from documents.utils import compute_checksum from paperless.config import GeneralConfig logger = logging.getLogger("paperless.sanity_checker") @@ -218,7 +218,7 @@ def _check_original( present_files.discard(source_path) try: - checksum = hashlib.md5(source_path.read_bytes()).hexdigest() + checksum = compute_checksum(source_path) except OSError as e: messages.error(doc.pk, f"Cannot read original file of document: {e}") else: @@ -255,7 +255,7 @@ def _check_archive( present_files.discard(archive_path) try: - checksum = hashlib.md5(archive_path.read_bytes()).hexdigest() + checksum = compute_checksum(archive_path) except OSError as e: messages.error( doc.pk, diff --git a/src/documents/tasks.py b/src/documents/tasks.py index 20351a49d..adf1f016c 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -1,5 +1,4 @@ import datetime -import hashlib import logging import shutil import uuid @@ -61,6 +60,7 @@ from documents.signals import document_updated from documents.signals.handlers import cleanup_document_deletion from documents.signals.handlers import run_workflows from documents.signals.handlers import send_websocket_document_updated +from documents.utils import compute_checksum from documents.workflows.utils import get_workflows_for_trigger from paperless.config import AIConfig from paperless.parsers import ParserContext @@ -328,8 +328,7 @@ def update_document_content_maybe_archive_file(document_id) -> None: with transaction.atomic(): oldDocument = Document.objects.get(pk=document.pk) if parser.get_archive_path(): - with Path(parser.get_archive_path()).open("rb") as f: - checksum = hashlib.md5(f.read()).hexdigest() + checksum = compute_checksum(parser.get_archive_path()) # I'm going to save first so that in case the file move # fails, the database is rolled back. # We also don't use save() since that triggers the filehandling diff --git a/src/documents/tests/conftest.py b/src/documents/tests/conftest.py index a33771fd1..7e75b9194 100644 --- a/src/documents/tests/conftest.py +++ b/src/documents/tests/conftest.py @@ -82,8 +82,8 @@ def sample_doc( return DocumentFactory( title="test", - checksum="42995833e01aea9b3edee44bbfdd7ce1", - archive_checksum="62acb0bcbfbcaa62ca6ad3668e4e404b", + checksum="1093cf6e32adbd16b06969df09215d42c4a3a8938cc18b39455953f08d1ff2ab", + archive_checksum="706124ecde3c31616992fa979caed17a726b1c9ccdba70e82a4ff796cea97ccf", content="test content", pk=1, filename="0000001.pdf", diff --git a/src/documents/tests/factories.py b/src/documents/tests/factories.py index d1d88587c..b0fd68428 100644 --- a/src/documents/tests/factories.py +++ b/src/documents/tests/factories.py @@ -60,7 +60,7 @@ class DocumentFactory(DjangoModelFactory): model = Document title = factory.Faker("sentence", nb_words=4) - checksum = factory.Faker("md5") + checksum = factory.Faker("sha256") content = factory.Faker("paragraph") correspondent = None document_type = None diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index df4c7d9c4..165b27e0b 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -261,8 +261,14 @@ class TestConsumer( self.assertIsFile(document.archive_path) - self.assertEqual(document.checksum, "42995833e01aea9b3edee44bbfdd7ce1") - self.assertEqual(document.archive_checksum, "62acb0bcbfbcaa62ca6ad3668e4e404b") + self.assertEqual( + document.checksum, + "1093cf6e32adbd16b06969df09215d42c4a3a8938cc18b39455953f08d1ff2ab", + ) + self.assertEqual( + document.archive_checksum, + "706124ecde3c31616992fa979caed17a726b1c9ccdba70e82a4ff796cea97ccf", + ) self.assertIsNotFile(filename) diff --git a/src/documents/tests/test_management_exporter.py b/src/documents/tests/test_management_exporter.py index 9307bab45..fb9effa0e 100644 --- a/src/documents/tests/test_management_exporter.py +++ b/src/documents/tests/test_management_exporter.py @@ -63,8 +63,8 @@ class TestExportImport( self.d1 = Document.objects.create( content="Content", - checksum="42995833e01aea9b3edee44bbfdd7ce1", - archive_checksum="62acb0bcbfbcaa62ca6ad3668e4e404b", + checksum="1093cf6e32adbd16b06969df09215d42c4a3a8938cc18b39455953f08d1ff2ab", + archive_checksum="706124ecde3c31616992fa979caed17a726b1c9ccdba70e82a4ff796cea97ccf", title="wow1", filename="0000001.pdf", mime_type="application/pdf", @@ -72,21 +72,21 @@ class TestExportImport( ) self.d2 = Document.objects.create( content="Content", - checksum="9c9691e51741c1f4f41a20896af31770", + checksum="550d1bae0f746d4f7c6be07054eb20cc2f11988a58ef64ceae45e98f85e92a5b", title="wow2", filename="0000002.pdf", mime_type="application/pdf", ) self.d3 = Document.objects.create( content="Content", - checksum="d38d7ed02e988e072caf924e0f3fcb76", + checksum="f1ba6b7ff8548214a75adec228f5468a14fe187f445bc0b9485cbf1c35b15915", title="wow2", filename="0000003.pdf", mime_type="application/pdf", ) self.d4 = Document.objects.create( content="Content", - checksum="82186aaa94f0b98697d704b90fd1c072", + checksum="a81b16b6b313cfd7e60eb7b12598d1343b58622b4030cfa19a2724a02e98db1b", title="wow_dec", filename="0000004.pdf", mime_type="application/pdf", @@ -239,7 +239,7 @@ class TestExportImport( ) with Path(fname).open("rb") as f: - checksum = hashlib.md5(f.read()).hexdigest() + checksum = hashlib.sha256(f.read()).hexdigest() self.assertEqual(checksum, element["fields"]["checksum"]) # Generated field "content_length" should not be exported, @@ -253,7 +253,7 @@ class TestExportImport( self.assertIsFile(fname) with Path(fname).open("rb") as f: - checksum = hashlib.md5(f.read()).hexdigest() + checksum = hashlib.sha256(f.read()).hexdigest() self.assertEqual(checksum, element["fields"]["archive_checksum"]) elif element["model"] == "documents.note": diff --git a/src/documents/tests/test_management_importer.py b/src/documents/tests/test_management_importer.py index ef20cf895..a890718a1 100644 --- a/src/documents/tests/test_management_importer.py +++ b/src/documents/tests/test_management_importer.py @@ -277,8 +277,8 @@ class TestCommandImport( Document.objects.create( content="Content", - checksum="42995833e01aea9b3edee44bbfdd7ce1", - archive_checksum="62acb0bcbfbcaa62ca6ad3668e4e404b", + checksum="1093cf6e32adbd16b06969df09215d42c4a3a8938cc18b39455953f08d1ff2ab", + archive_checksum="706124ecde3c31616992fa979caed17a726b1c9ccdba70e82a4ff796cea97ccf", title="wow1", filename="0000001.pdf", mime_type="application/pdf", diff --git a/src/documents/tests/test_migration_sha256_checksums.py b/src/documents/tests/test_migration_sha256_checksums.py new file mode 100644 index 000000000..4a53b724c --- /dev/null +++ b/src/documents/tests/test_migration_sha256_checksums.py @@ -0,0 +1,132 @@ +import hashlib +import shutil +import tempfile +from pathlib import Path + +from django.conf import settings +from django.db import connection +from django.test import override_settings + +from documents.tests.utils import TestMigrations + + +def _sha256(data: bytes) -> str: + return hashlib.sha256(data).hexdigest() + + +class TestSha256ChecksumDataMigration(TestMigrations): + """recompute_checksums correctly updates document checksums from MD5 to SHA256.""" + + migrate_from = "0015_document_version_index_and_more" + migrate_to = "0016_sha256_checksums" + reset_sequences = True + + ORIGINAL_CONTENT = b"original file content for sha256 migration test" + ARCHIVE_CONTENT = b"archive file content for sha256 migration test" + + def setUpBeforeMigration(self, apps) -> None: + self._originals_dir = Path(tempfile.mkdtemp()) + self._archive_dir = Path(tempfile.mkdtemp()) + self._settings_override = override_settings( + ORIGINALS_DIR=self._originals_dir, + ARCHIVE_DIR=self._archive_dir, + ) + self._settings_override.enable() + Document = apps.get_model("documents", "Document") + + # doc1: original file present, no archive + (settings.ORIGINALS_DIR / "doc1.txt").write_bytes(self.ORIGINAL_CONTENT) + self.doc1_id = Document.objects.create( + title="Doc 1", + mime_type="text/plain", + filename="doc1.txt", + checksum="a" * 32, + ).pk + + # doc2: original and archive both present + (settings.ORIGINALS_DIR / "doc2.txt").write_bytes(self.ORIGINAL_CONTENT) + (settings.ARCHIVE_DIR / "doc2.pdf").write_bytes(self.ARCHIVE_CONTENT) + self.doc2_id = Document.objects.create( + title="Doc 2", + mime_type="text/plain", + filename="doc2.txt", + checksum="b" * 32, + archive_filename="doc2.pdf", + archive_checksum="c" * 32, + ).pk + + # doc3: original file missing — checksum must stay unchanged + self.doc3_id = Document.objects.create( + title="Doc 3", + mime_type="text/plain", + filename="missing_original.txt", + checksum="d" * 32, + ).pk + + # doc4: original present, archive_filename set but archive file missing + (settings.ORIGINALS_DIR / "doc4.txt").write_bytes(self.ORIGINAL_CONTENT) + self.doc4_id = Document.objects.create( + title="Doc 4", + mime_type="text/plain", + filename="doc4.txt", + checksum="e" * 32, + archive_filename="missing_archive.pdf", + archive_checksum="f" * 32, + ).pk + + # doc5: original present, archive_filename is None — archive_checksum must stay null + (settings.ORIGINALS_DIR / "doc5.txt").write_bytes(self.ORIGINAL_CONTENT) + self.doc5_id = Document.objects.create( + title="Doc 5", + mime_type="text/plain", + filename="doc5.txt", + checksum="0" * 32, + archive_filename=None, + archive_checksum=None, + ).pk + + def _fixture_teardown(self) -> None: + super()._fixture_teardown() + # Django's SQLite backend returns [] from sequence_reset_sql(), so + # reset_sequences=True flushes rows but never clears sqlite_sequence. + # Explicitly delete the entry so subsequent tests start from pk=1. + if connection.vendor == "sqlite": + with connection.cursor() as cursor: + cursor.execute( + "DELETE FROM sqlite_sequence WHERE name='documents_document'", + ) + + def tearDown(self) -> None: + super().tearDown() + self._settings_override.disable() + shutil.rmtree(self._originals_dir, ignore_errors=True) + shutil.rmtree(self._archive_dir, ignore_errors=True) + + def test_original_checksum_updated_to_sha256_when_file_exists(self) -> None: + Document = self.apps.get_model("documents", "Document") + doc = Document.objects.get(pk=self.doc1_id) + self.assertEqual(doc.checksum, _sha256(self.ORIGINAL_CONTENT)) + + def test_both_checksums_updated_when_original_and_archive_exist(self) -> None: + Document = self.apps.get_model("documents", "Document") + doc = Document.objects.get(pk=self.doc2_id) + self.assertEqual(doc.checksum, _sha256(self.ORIGINAL_CONTENT)) + self.assertEqual(doc.archive_checksum, _sha256(self.ARCHIVE_CONTENT)) + + def test_checksum_unchanged_when_original_file_missing(self) -> None: + Document = self.apps.get_model("documents", "Document") + doc = Document.objects.get(pk=self.doc3_id) + self.assertEqual(doc.checksum, "d" * 32) + + def test_archive_checksum_unchanged_when_archive_file_missing(self) -> None: + Document = self.apps.get_model("documents", "Document") + doc = Document.objects.get(pk=self.doc4_id) + # Original was updated (file exists) + self.assertEqual(doc.checksum, _sha256(self.ORIGINAL_CONTENT)) + # Archive was not updated (file missing) + self.assertEqual(doc.archive_checksum, "f" * 32) + + def test_archive_checksum_stays_null_when_no_archive_filename(self) -> None: + Document = self.apps.get_model("documents", "Document") + doc = Document.objects.get(pk=self.doc5_id) + self.assertIsNone(doc.archive_checksum) diff --git a/src/documents/utils.py b/src/documents/utils.py index 2b6a60749..975185a5f 100644 --- a/src/documents/utils.py +++ b/src/documents/utils.py @@ -1,3 +1,4 @@ +import hashlib import logging import shutil from os import utime @@ -128,3 +129,28 @@ def get_boolean(boolstr: str) -> bool: Return a boolean value from a string representation. """ return bool(boolstr.lower() in ("yes", "y", "1", "t", "true")) + + +def compute_checksum(path: Path, chunk_size: int = 65536) -> str: + """ + Compute the SHA-256 checksum of a file. + + Reads the file in chunks to avoid loading the entire file into memory. + + Args: + path (Path): Path to the file to hash. + chunk_size (int, optional): Number of bytes to read per chunk. + Defaults to 65536. + + Returns: + str: Hexadecimal SHA-256 digest of the file contents. + + Raises: + FileNotFoundError: If the file does not exist. + OSError: If the file cannot be read. + """ + h = hashlib.sha256() + with path.open("rb") as f: + while chunk := f.read(chunk_size): + h.update(chunk) + return h.hexdigest() From 129da3ade756642a4ca7e5c115f8b35f4381e1a8 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 28 Mar 2026 13:58:33 -0700 Subject: [PATCH 074/113] Tweakhancement: show file extension in StoragePath test (#12452) --- src/documents/tests/test_api_objects.py | 48 +++++++++++++++++-------- src/documents/views.py | 6 ++++ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/documents/tests/test_api_objects.py b/src/documents/tests/test_api_objects.py index 008d2824d..91faa585f 100644 --- a/src/documents/tests/test_api_objects.py +++ b/src/documents/tests/test_api_objects.py @@ -360,7 +360,7 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "path/Something") + self.assertEqual(response.data, "path/Something.pdf") def test_test_storage_path_respects_none_placeholder_setting(self) -> None: """ @@ -390,7 +390,7 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "folder/none/Something") + self.assertEqual(response.data, "folder/none/Something.pdf") with override_settings(FILENAME_FORMAT_REMOVE_NONE=True): response = self.client.post( @@ -399,7 +399,7 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "folder/Something") + self.assertEqual(response.data, "folder/Something.pdf") def test_test_storage_path_requires_document_view_permission(self) -> None: owner = User.objects.create_user(username="owner") @@ -447,7 +447,27 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "path/Shared") + self.assertEqual(response.data, "path/Shared.pdf") + + def test_test_storage_path_prefers_existing_filename_extension(self) -> None: + document = Document.objects.create( + mime_type="image/jpeg", + filename="existing/Document.jpeg", + title="Something", + checksum="123", + ) + response = self.client.post( + f"{self.ENDPOINT}test/", + json.dumps( + { + "document": document.id, + "path": "path/{{ title }}", + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, "path/Something.jpeg") def test_test_storage_path_exposes_basic_document_context_but_not_sensitive_owner_data( self, @@ -478,12 +498,12 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "owner") + self.assertEqual(response.data, "owner.pdf") for expression, expected in ( - ("{{ document.content }}", "Top secret content"), - ("{{ document.id }}", str(document.id)), - ("{{ document.page_count }}", "2"), + ("{{ document.content }}", "Top secret content.pdf"), + ("{{ document.id }}", f"{document.id}.pdf"), + ("{{ document.page_count }}", "2.pdf"), ): response = self.client.post( f"{self.ENDPOINT}test/", @@ -545,7 +565,7 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "Private Correspondent") + self.assertEqual(response.data, "Private Correspondent.pdf") response = self.client.post( f"{self.ENDPOINT}test/", @@ -560,7 +580,7 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "Private Correspondent") + self.assertEqual(response.data, "Private Correspondent.pdf") def test_test_storage_path_superuser_can_view_private_related_objects(self) -> None: owner = User.objects.create_user(username="owner") @@ -589,7 +609,7 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "Private Correspondent") + self.assertEqual(response.data, "Private Correspondent.pdf") def test_test_storage_path_includes_doc_type_storage_path_and_tags( self, @@ -636,7 +656,7 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "Private Type/private/path/Private Tag") + self.assertEqual(response.data, "Private Type/private/path/Private Tag.pdf") response = self.client.post( f"{self.ENDPOINT}test/", @@ -649,7 +669,7 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "Private Type/Private Tag") + self.assertEqual(response.data, "Private Type/Private Tag.pdf") def test_test_storage_path_includes_custom_fields_for_visible_document( self, @@ -685,7 +705,7 @@ class TestApiStoragePaths(DirectoriesMixin, APITestCase): content_type="application/json", ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, "42") + self.assertEqual(response.data, "42.pdf") class TestBulkEditObjects(APITestCase): diff --git a/src/documents/views.py b/src/documents/views.py index 600acf078..6c4e52ba9 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -3290,6 +3290,12 @@ class StoragePathViewSet(PermissionsAwareDocumentCountMixin, ModelViewSet): path = serializer.validated_data.get("path") result = format_filename(document, path) + if result: + extension = ( + Path(str(document.filename)).suffix if document.filename else "" + ) or document.file_type + result_path = Path(result) + result = str(result_path.with_name(f"{result_path.name}{extension}")) return Response(result) From 62f79c088e075c657f0d16c6a1251a22e16cedc8 Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 28 Mar 2026 21:00:05 +0000 Subject: [PATCH 075/113] Auto translate strings --- src/locale/en_US/LC_MESSAGES/django.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index 36caa615f..b41e8a333 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-26 14:37+0000\n" +"POT-Creation-Date: 2026-03-28 20:59+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -1341,7 +1341,7 @@ msgstr "" msgid "Duplicate document identifiers are not allowed." msgstr "" -#: documents/serialisers.py:2587 documents/views.py:3599 +#: documents/serialisers.py:2587 documents/views.py:3605 #, python-format msgid "Documents not found: %(ids)s" msgstr "" @@ -1613,20 +1613,20 @@ msgstr "" msgid "Invalid more_like_id" msgstr "" -#: documents/views.py:3611 +#: documents/views.py:3617 #, python-format msgid "Insufficient permissions to share document %(id)s." msgstr "" -#: documents/views.py:3654 +#: documents/views.py:3660 msgid "Bundle is already being processed." msgstr "" -#: documents/views.py:3711 +#: documents/views.py:3717 msgid "The share link bundle is still being prepared. Please try again later." msgstr "" -#: documents/views.py:3721 +#: documents/views.py:3727 msgid "The share link bundle is unavailable." msgstr "" From 85e0d1842a55a1b6b19d0b8770dd2cadbdbb5ad3 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sun, 29 Mar 2026 15:31:18 +0200 Subject: [PATCH 076/113] Tests: add regression test for redis URL with empty username (#12460) * Tests: add regression test for redis URL with empty username and password Covers the unix://:SECRET@/path.sock format (empty username, password only), which was missing from the existing test cases for PR #12239. * Update src/paperless/tests/settings/test_custom_parsers.py --------- Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com> --- src/paperless/tests/settings/test_custom_parsers.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/paperless/tests/settings/test_custom_parsers.py b/src/paperless/tests/settings/test_custom_parsers.py index 06299abb3..6fa7ad8eb 100644 --- a/src/paperless/tests/settings/test_custom_parsers.py +++ b/src/paperless/tests/settings/test_custom_parsers.py @@ -79,6 +79,15 @@ class TestRedisSocketConversion: ), id="celery_style_socket_with_credentials", ), + # Empty username, password only: unix://:SECRET@/path.sock + pytest.param( + "unix://:SECRET@/run/redis/paperless.sock", + ( + "redis+socket://:SECRET@/run/redis/paperless.sock", + "unix://:SECRET@/run/redis/paperless.sock", + ), + id="redis_py_style_socket_with_password_only", + ), ], ) def test_redis_socket_parsing( From 3d4353dc2b07504a55f44ae0175ba26a107f1ad9 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 29 Mar 2026 17:16:44 -0700 Subject: [PATCH 077/113] Security: pin GitHub Actions to specific SHAs (#12465) --- .github/workflows/ci-backend.yml | 22 ++++++------ .github/workflows/ci-docker.yml | 24 ++++++------- .github/workflows/ci-docs.yml | 16 ++++----- .github/workflows/ci-frontend.yml | 48 ++++++++++++------------- .github/workflows/ci-lint.yml | 6 ++-- .github/workflows/ci-release.yml | 28 +++++++-------- .github/workflows/cleanup-tags.yml | 4 +-- .github/workflows/codeql-analysis.yml | 6 ++-- .github/workflows/crowdin.yml | 4 +-- .github/workflows/pr-bot.yml | 12 +++---- .github/workflows/project-actions.yml | 2 +- .github/workflows/repo-maintenance.yml | 10 +++--- .github/workflows/translate-strings.yml | 14 ++++---- 13 files changed, 98 insertions(+), 98 deletions(-) diff --git a/.github/workflows/ci-backend.yml b/.github/workflows/ci-backend.yml index 3203d7291..82c4bb9bd 100644 --- a/.github/workflows/ci-backend.yml +++ b/.github/workflows/ci-backend.yml @@ -21,7 +21,7 @@ jobs: backend_changed: ${{ steps.force.outputs.run_all == 'true' || steps.filter.outputs.backend == 'true' }} steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 - name: Decide run mode @@ -49,7 +49,7 @@ jobs: - name: Detect changes id: filter if: steps.force.outputs.run_all != 'true' - uses: dorny/paths-filter@v3.0.2 + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 with: base: ${{ steps.range.outputs.base }} ref: ${{ steps.range.outputs.ref }} @@ -71,18 +71,18 @@ jobs: fail-fast: false steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Start containers run: | docker compose --file docker/compose/docker-compose.ci-test.yml pull --quiet docker compose --file docker/compose/docker-compose.ci-test.yml up --detach - name: Set up Python id: setup-python - uses: actions/setup-python@v6.2.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: "${{ matrix.python-version }}" - name: Install uv - uses: astral-sh/setup-uv@v7.3.1 + uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: true @@ -119,13 +119,13 @@ jobs: pytest - name: Upload test results to Codecov if: always() - uses: codecov/codecov-action@v5.5.2 + uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2 with: flags: backend-python-${{ matrix.python-version }} files: junit.xml report_type: test_results - name: Upload coverage to Codecov - uses: codecov/codecov-action@v5.5.2 + uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2 with: flags: backend-python-${{ matrix.python-version }} files: coverage.xml @@ -144,14 +144,14 @@ jobs: DEFAULT_PYTHON: "3.12" steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Python id: setup-python - uses: actions/setup-python@v6.2.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: "${{ env.DEFAULT_PYTHON }}" - name: Install uv - uses: astral-sh/setup-uv@v7.3.1 + uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: true @@ -173,7 +173,7 @@ jobs: check \ src/ - name: Cache Mypy - uses: actions/cache@v5.0.3 + uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: .mypy_cache # Keyed by OS, Python version, and dependency hashes diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 2d6da2da9..cc02b48bf 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -41,7 +41,7 @@ jobs: ref-name: ${{ steps.ref.outputs.name }} steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Determine ref name id: ref run: | @@ -104,9 +104,9 @@ jobs: echo "repository=${repo_name}" echo "name=${repo_name}" >> $GITHUB_OUTPUT - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4.0.0 + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - name: Login to GitHub Container Registry - uses: docker/login-action@v4.0.0 + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -119,7 +119,7 @@ jobs: sudo rm -rf "$AGENT_TOOLSDIRECTORY" - name: Docker metadata id: docker-meta - uses: docker/metadata-action@v6.0.0 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 with: images: | ${{ env.REGISTRY }}/${{ steps.repo.outputs.name }} @@ -130,7 +130,7 @@ jobs: type=semver,pattern={{major}}.{{minor}} - name: Build and push by digest id: build - uses: docker/build-push-action@v7.0.0 + uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0 with: context: . file: ./Dockerfile @@ -152,7 +152,7 @@ jobs: echo "${digest}" > "/tmp/digests/digest-${{ matrix.arch }}.txt" - name: Upload digest if: steps.check-push.outputs.should-push == 'true' - uses: actions/upload-artifact@v7.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: digests-${{ matrix.arch }} path: /tmp/digests/digest-${{ matrix.arch }}.txt @@ -169,7 +169,7 @@ jobs: packages: write steps: - name: Download digests - uses: actions/download-artifact@v8.0.0 + uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 with: path: /tmp/digests pattern: digest-*.txt @@ -179,29 +179,29 @@ jobs: echo "Downloaded digests:" ls -la /tmp/digests/ - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4.0.0 + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - name: Login to GitHub Container Registry - uses: docker/login-action@v4.0.0 + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Login to Docker Hub if: needs.build-arch.outputs.push-external == 'true' - uses: docker/login-action@v4.0.0 + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to Quay.io if: needs.build-arch.outputs.push-external == 'true' - uses: docker/login-action@v4.0.0 + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_ROBOT_TOKEN }} - name: Docker metadata id: docker-meta - uses: docker/metadata-action@v6.0.0 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 with: images: | ${{ env.REGISTRY }}/${{ needs.build-arch.outputs.repository }} diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 81d31dffe..b14de9627 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -23,7 +23,7 @@ jobs: docs_changed: ${{ steps.force.outputs.run_all == 'true' || steps.filter.outputs.docs == 'true' }} steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 - name: Decide run mode @@ -51,7 +51,7 @@ jobs: - name: Detect changes id: filter if: steps.force.outputs.run_all != 'true' - uses: dorny/paths-filter@v3.0.2 + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 with: base: ${{ steps.range.outputs.base }} ref: ${{ steps.range.outputs.ref }} @@ -68,16 +68,16 @@ jobs: name: Build Documentation runs-on: ubuntu-24.04 steps: - - uses: actions/configure-pages@v5.0.0 + - uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Python id: setup-python - uses: actions/setup-python@v6.2.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - name: Install uv - uses: astral-sh/setup-uv@v7.3.1 + uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: true @@ -93,7 +93,7 @@ jobs: --frozen \ zensical build --clean - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v4.0.0 + uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0 with: path: site name: github-pages-${{ github.run_id }}-${{ github.run_attempt }} @@ -107,7 +107,7 @@ jobs: url: ${{ steps.deployment.outputs.page_url }} steps: - name: Deploy GitHub Pages - uses: actions/deploy-pages@v4.0.5 + uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5 id: deployment with: artifact_name: github-pages-${{ github.run_id }}-${{ github.run_attempt }} diff --git a/.github/workflows/ci-frontend.yml b/.github/workflows/ci-frontend.yml index bfd2ee5e4..19600b512 100644 --- a/.github/workflows/ci-frontend.yml +++ b/.github/workflows/ci-frontend.yml @@ -18,7 +18,7 @@ jobs: frontend_changed: ${{ steps.force.outputs.run_all == 'true' || steps.filter.outputs.frontend == 'true' }} steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 - name: Decide run mode @@ -46,7 +46,7 @@ jobs: - name: Detect changes id: filter if: steps.force.outputs.run_all != 'true' - uses: dorny/paths-filter@v3.0.2 + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 with: base: ${{ steps.range.outputs.base }} ref: ${{ steps.range.outputs.ref }} @@ -61,20 +61,20 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install pnpm - uses: pnpm/action-setup@v4.2.0 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Use Node.js 24 - uses: actions/setup-node@v6.3.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 24.x cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies id: cache-frontend-deps - uses: actions/cache@v5.0.3 + uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: | ~/.pnpm-store @@ -89,19 +89,19 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install pnpm - uses: pnpm/action-setup@v4.2.0 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Use Node.js 24 - uses: actions/setup-node@v6.3.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 24.x cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies - uses: actions/cache@v5.0.3 + uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: | ~/.pnpm-store @@ -124,19 +124,19 @@ jobs: shard-count: [4] steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install pnpm - uses: pnpm/action-setup@v4.2.0 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Use Node.js 24 - uses: actions/setup-node@v6.3.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 24.x cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies - uses: actions/cache@v5.0.3 + uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: | ~/.pnpm-store @@ -148,13 +148,13 @@ jobs: run: cd src-ui && pnpm run test --max-workers=2 --shard=${{ matrix.shard-index }}/${{ matrix.shard-count }} - name: Upload test results to Codecov if: always() - uses: codecov/codecov-action@v5.5.2 + uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2 with: flags: frontend-node-${{ matrix.node-version }} directory: src-ui/ report_type: test_results - name: Upload coverage to Codecov - uses: codecov/codecov-action@v5.5.2 + uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2 with: flags: frontend-node-${{ matrix.node-version }} directory: src-ui/coverage/ @@ -175,19 +175,19 @@ jobs: shard-count: [2] steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install pnpm - uses: pnpm/action-setup@v4.2.0 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Use Node.js 24 - uses: actions/setup-node@v6.3.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 24.x cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies - uses: actions/cache@v5.0.3 + uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: | ~/.pnpm-store @@ -206,21 +206,21 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 2 - name: Install pnpm - uses: pnpm/action-setup@v4.2.0 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Use Node.js 24 - uses: actions/setup-node@v6.3.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 24.x cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies - uses: actions/cache@v5.0.3 + uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: | ~/.pnpm-store diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml index c4df7d893..3d37579da 100644 --- a/.github/workflows/ci-lint.yml +++ b/.github/workflows/ci-lint.yml @@ -15,10 +15,10 @@ jobs: runs-on: ubuntu-slim steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install Python - uses: actions/setup-python@v6.2.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: "3.14" - name: Run prek - uses: j178/prek-action@v1.1.1 + uses: j178/prek-action@0bb87d7f00b0c99306c8bcb8b8beba1eb581c037 # v1.1.1 diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index bbd9e6b09..0eef7eb23 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Wait for Docker build - uses: lewagon/wait-on-check-action@v1.5.0 + uses: lewagon/wait-on-check-action@74049309dfeff245fe8009a0137eacf28136cb3c # v1.5.0 with: ref: ${{ github.sha }} check-name: 'Build Docker Image' @@ -28,14 +28,14 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # ---- Frontend Build ---- - name: Install pnpm - uses: pnpm/action-setup@v4.2.0 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Use Node.js 24 - uses: actions/setup-node@v6.3.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 24.x cache: 'pnpm' @@ -47,11 +47,11 @@ jobs: # ---- Backend Setup ---- - name: Set up Python id: setup-python - uses: actions/setup-python@v6.2.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - name: Install uv - uses: astral-sh/setup-uv@v7.3.1 + uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: true @@ -118,7 +118,7 @@ jobs: sudo chown -R 1000:1000 paperless-ngx/ tar -cJf paperless-ngx.tar.xz paperless-ngx/ - name: Upload release artifact - uses: actions/upload-artifact@v7.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: release path: dist/paperless-ngx.tar.xz @@ -133,7 +133,7 @@ jobs: version: ${{ steps.get-version.outputs.version }} steps: - name: Download release artifact - uses: actions/download-artifact@v8.0.0 + uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 with: name: release path: ./ @@ -148,7 +148,7 @@ jobs: fi - name: Create release and changelog id: create-release - uses: release-drafter/release-drafter@v6.2.0 + uses: release-drafter/release-drafter@6db134d15f3909ccc9eefd369f02bd1e9cffdf97 # v6.2.0 with: name: Paperless-ngx ${{ steps.get-version.outputs.version }} tag: ${{ steps.get-version.outputs.version }} @@ -159,7 +159,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload release archive - uses: shogo82148/actions-upload-release-asset@v1.9.2 + uses: shogo82148/actions-upload-release-asset@8f6863c6c894ba46f9e676ef5cccec4752723c1e # v1.9.2 with: github_token: ${{ secrets.GITHUB_TOKEN }} upload_url: ${{ steps.create-release.outputs.upload_url }} @@ -176,16 +176,16 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: main - name: Set up Python id: setup-python - uses: actions/setup-python@v6.2.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - name: Install uv - uses: astral-sh/setup-uv@v7.3.1 + uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: true @@ -218,7 +218,7 @@ jobs: git commit -am "Changelog ${{ needs.publish-release.outputs.version }} - GHA" git push origin ${{ needs.publish-release.outputs.version }}-changelog - name: Create pull request - uses: actions/github-script@v8.0.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | const { repo, owner } = context.repo; diff --git a/.github/workflows/cleanup-tags.yml b/.github/workflows/cleanup-tags.yml index bc2ae655f..426554777 100644 --- a/.github/workflows/cleanup-tags.yml +++ b/.github/workflows/cleanup-tags.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Clean temporary images if: "${{ env.TOKEN != '' }}" - uses: stumpylog/image-cleaner-action/ephemeral@v0.12.0 + uses: stumpylog/image-cleaner-action/ephemeral@4fe057d991d63b8f6d5d22c40f17c1bca2226537 # v0.12.0 with: token: "${{ env.TOKEN }}" owner: "${{ github.repository_owner }}" @@ -53,7 +53,7 @@ jobs: steps: - name: Clean untagged images if: "${{ env.TOKEN != '' }}" - uses: stumpylog/image-cleaner-action/untagged@v0.12.0 + uses: stumpylog/image-cleaner-action/untagged@4fe057d991d63b8f6d5d22c40f17c1bca2226537 # v0.12.0 with: token: "${{ env.TOKEN }}" owner: "${{ github.repository_owner }}" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 32b1fc638..08c2bc1a2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -34,10 +34,10 @@ jobs: # Learn more about CodeQL language support at https://git.io/codeql-language-support steps: - name: Checkout repository - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v4.32.5 + uses: github/codeql-action/init@c793b717bc78562f491db7b0e93a3a178b099162 # v4.32.5 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -45,4 +45,4 @@ jobs: # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.32.5 + uses: github/codeql-action/analyze@c793b717bc78562f491db7b0e93a3a178b099162 # v4.32.5 diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml index 63853f6c5..38e73bbb5 100644 --- a/.github/workflows/crowdin.yml +++ b/.github/workflows/crowdin.yml @@ -13,11 +13,11 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: token: ${{ secrets.PNGX_BOT_PAT }} - name: crowdin action - uses: crowdin/github-action@v2.15.0 + uses: crowdin/github-action@8818ff65bfc4322384f983ea37e3926948c11745 # v2.15.0 with: upload_translations: false download_translations: true diff --git a/.github/workflows/pr-bot.yml b/.github/workflows/pr-bot.yml index f36e9cd9f..e9f976608 100644 --- a/.github/workflows/pr-bot.yml +++ b/.github/workflows/pr-bot.yml @@ -10,7 +10,7 @@ jobs: issues: read pull-requests: write steps: - - uses: peakoss/anti-slop@v0.2.1 + - uses: peakoss/anti-slop@85daca1880e9e1af197fc06ea03349daf08f4202 # v0.2.1 with: max-failures: 4 failure-add-pr-labels: 'ai' @@ -23,11 +23,11 @@ jobs: steps: - name: Label PR by file path or branch name # see .github/labeler.yml for the labeler config - uses: actions/labeler@v6.0.1 + uses: actions/labeler@634933edcd8ababfe52f92936142cc22ac488b1b # v6.0.1 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Label by size - uses: Gascon1/pr-size-labeler@v1.3.0 + uses: Gascon1/pr-size-labeler@deff8ed00a76639a7c0f197525bafa3350ba4c36 # v1.3.0 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} xs_label: 'small-change' @@ -37,7 +37,7 @@ jobs: fail_if_xl: 'false' excluded_files: /\.lock$/ /\.txt$/ ^src-ui/pnpm-lock\.yaml$ ^src-ui/messages\.xlf$ ^src/locale/en_US/LC_MESSAGES/django\.po$ - name: Label by PR title - uses: actions/github-script@v8.0.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | const pr = context.payload.pull_request; @@ -63,7 +63,7 @@ jobs: } - name: Label bot-generated PRs if: ${{ contains(github.actor, 'dependabot') || contains(github.actor, 'crowdin-bot') }} - uses: actions/github-script@v8.0.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | const pr = context.payload.pull_request; @@ -88,7 +88,7 @@ jobs: } - name: Welcome comment if: ${{ !contains(github.actor, 'bot') }} - uses: actions/github-script@v8.0.0 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | const pr = context.payload.pull_request; diff --git a/.github/workflows/project-actions.yml b/.github/workflows/project-actions.yml index 289a83115..519a1f562 100644 --- a/.github/workflows/project-actions.yml +++ b/.github/workflows/project-actions.yml @@ -19,6 +19,6 @@ jobs: if: github.event_name == 'pull_request_target' && (github.event.action == 'opened' || github.event.action == 'reopened') && github.event.pull_request.user.login != 'dependabot' steps: - name: Label PR with release-drafter - uses: release-drafter/release-drafter@v6.2.0 + uses: release-drafter/release-drafter@6db134d15f3909ccc9eefd369f02bd1e9cffdf97 # v6.2.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/repo-maintenance.yml b/.github/workflows/repo-maintenance.yml index 93d41f5a6..1d4903193 100644 --- a/.github/workflows/repo-maintenance.yml +++ b/.github/workflows/repo-maintenance.yml @@ -15,7 +15,7 @@ jobs: if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-24.04 steps: - - uses: actions/stale@v10.2.0 + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0 with: days-before-stale: 7 days-before-close: 14 @@ -37,7 +37,7 @@ jobs: if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-24.04 steps: - - uses: dessant/lock-threads@v6.0.0 + - uses: dessant/lock-threads@7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7 # v6.0.0 with: issue-inactive-days: '30' pr-inactive-days: '30' @@ -57,7 +57,7 @@ jobs: if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-24.04 steps: - - uses: actions/github-script@v8.0.0 + - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | function sleep(ms) { @@ -114,7 +114,7 @@ jobs: if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-24.04 steps: - - uses: actions/github-script@v8.0.0 + - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | function sleep(ms) { @@ -206,7 +206,7 @@ jobs: if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-24.04 steps: - - uses: actions/github-script@v8.0.0 + - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | function sleep(ms) { diff --git a/.github/workflows/translate-strings.yml b/.github/workflows/translate-strings.yml index 220aee9cc..bfd6cd84e 100644 --- a/.github/workflows/translate-strings.yml +++ b/.github/workflows/translate-strings.yml @@ -11,7 +11,7 @@ jobs: contents: write steps: - name: Checkout code - uses: actions/checkout@v6.0.2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 env: GH_REF: ${{ github.ref }} # sonar rule:githubactions:S7630 - avoid injection with: @@ -19,13 +19,13 @@ jobs: ref: ${{ env.GH_REF }} - name: Set up Python id: setup-python - uses: actions/setup-python@v6.2.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - name: Install system dependencies run: | sudo apt-get update -qq sudo apt-get install -qq --no-install-recommends gettext - name: Install uv - uses: astral-sh/setup-uv@v7.3.1 + uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 with: enable-cache: true - name: Install backend python dependencies @@ -36,18 +36,18 @@ jobs: - name: Generate backend translation strings run: cd src/ && uv run manage.py makemessages -l en_US -i "samples*" - name: Install pnpm - uses: pnpm/action-setup@v4.2.0 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 with: version: 10 - name: Use Node.js 24 - uses: actions/setup-node@v6.3.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 24.x cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies id: cache-frontend-deps - uses: actions/cache@v5.0.3 + uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: | ~/.pnpm-store @@ -63,7 +63,7 @@ jobs: cd src-ui pnpm run ng extract-i18n - name: Commit changes - uses: stefanzweifel/git-auto-commit-action@v7.1.0 + uses: stefanzweifel/git-auto-commit-action@04702edda442b2e678b25b537cec683a1493fcb9 # v7.1.0 with: file_pattern: 'src-ui/messages.xlf src/locale/en_US/LC_MESSAGES/django.po' commit_message: "Auto translate strings" From 5b755528dafe2e4772abed64bb065e5b8f7abdc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 08:51:24 -0700 Subject: [PATCH 078/113] Chore(deps): Bump cryptography in the uv group across 1 directory (#12458) Bumps the uv group with 1 update in the / directory: [cryptography](https://github.com/pyca/cryptography). Updates `cryptography` from 46.0.5 to 46.0.6 - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/46.0.5...46.0.6) --- updated-dependencies: - dependency-name: cryptography dependency-version: 46.0.6 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 86 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/uv.lock b/uv.lock index 53cbeb689..0e1ab08cf 100644 --- a/uv.lock +++ b/uv.lock @@ -730,54 +730,54 @@ toml = [ [[package]] name = "cryptography" -version = "46.0.5" +version = "46.0.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "(platform_python_implementation != 'PyPy' and sys_platform == 'darwin') or (platform_python_implementation != 'PyPy' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/ba/04b1bd4218cbc58dc90ce967106d51582371b898690f3ae0402876cc4f34/cryptography-46.0.6.tar.gz", hash = "sha256:27550628a518c5c6c903d84f637fbecf287f6cb9ced3804838a1295dc1fd0759", size = 750542, upload-time = "2026-03-25T23:34:53.396Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, - { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, - { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, - { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, - { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, - { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, - { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, - { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, - { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, - { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, - { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, - { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, - { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, - { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, - { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, - { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, - { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, - { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, - { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, - { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, - { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, - { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, - { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, - { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, - { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, - { url = "https://files.pythonhosted.org/packages/eb/dd/2d9fdb07cebdf3d51179730afb7d5e576153c6744c3ff8fded23030c204e/cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c", size = 3476964, upload-time = "2026-02-10T19:18:20.687Z" }, - { url = "https://files.pythonhosted.org/packages/e9/6f/6cc6cc9955caa6eaf83660b0da2b077c7fe8ff9950a3c5e45d605038d439/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a", size = 4218321, upload-time = "2026-02-10T19:18:22.349Z" }, - { url = "https://files.pythonhosted.org/packages/3e/5d/c4da701939eeee699566a6c1367427ab91a8b7088cc2328c09dbee940415/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356", size = 4381786, upload-time = "2026-02-10T19:18:24.529Z" }, - { url = "https://files.pythonhosted.org/packages/ac/97/a538654732974a94ff96c1db621fa464f455c02d4bb7d2652f4edc21d600/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da", size = 4217990, upload-time = "2026-02-10T19:18:25.957Z" }, - { url = "https://files.pythonhosted.org/packages/ae/11/7e500d2dd3ba891197b9efd2da5454b74336d64a7cc419aa7327ab74e5f6/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257", size = 4381252, upload-time = "2026-02-10T19:18:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/47/23/9285e15e3bc57325b0a72e592921983a701efc1ee8f91c06c5f0235d86d9/cryptography-46.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:64235194bad039a10bb6d2d930ab3323baaec67e2ce36215fd0952fad0930ca8", size = 7176401, upload-time = "2026-03-25T23:33:22.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/f8/e61f8f13950ab6195b31913b42d39f0f9afc7d93f76710f299b5ec286ae6/cryptography-46.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:26031f1e5ca62fcb9d1fcb34b2b60b390d1aacaa15dc8b895a9ed00968b97b30", size = 4275275, upload-time = "2026-03-25T23:33:23.844Z" }, + { url = "https://files.pythonhosted.org/packages/19/69/732a736d12c2631e140be2348b4ad3d226302df63ef64d30dfdb8db7ad1c/cryptography-46.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9a693028b9cbe51b5a1136232ee8f2bc242e4e19d456ded3fa7c86e43c713b4a", size = 4425320, upload-time = "2026-03-25T23:33:25.703Z" }, + { url = "https://files.pythonhosted.org/packages/d4/12/123be7292674abf76b21ac1fc0e1af50661f0e5b8f0ec8285faac18eb99e/cryptography-46.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:67177e8a9f421aa2d3a170c3e56eca4e0128883cf52a071a7cbf53297f18b175", size = 4278082, upload-time = "2026-03-25T23:33:27.423Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ba/d5e27f8d68c24951b0a484924a84c7cdaed7502bac9f18601cd357f8b1d2/cryptography-46.0.6-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:d9528b535a6c4f8ff37847144b8986a9a143585f0540fbcb1a98115b543aa463", size = 4926514, upload-time = "2026-03-25T23:33:29.206Z" }, + { url = "https://files.pythonhosted.org/packages/34/71/1ea5a7352ae516d5512d17babe7e1b87d9db5150b21f794b1377eac1edc0/cryptography-46.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:22259338084d6ae497a19bae5d4c66b7ca1387d3264d1c2c0e72d9e9b6a77b97", size = 4457766, upload-time = "2026-03-25T23:33:30.834Z" }, + { url = "https://files.pythonhosted.org/packages/01/59/562be1e653accee4fdad92c7a2e88fced26b3fdfce144047519bbebc299e/cryptography-46.0.6-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:760997a4b950ff00d418398ad73fbc91aa2894b5c1db7ccb45b4f68b42a63b3c", size = 3986535, upload-time = "2026-03-25T23:33:33.02Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8b/b1ebfeb788bf4624d36e45ed2662b8bd43a05ff62157093c1539c1288a18/cryptography-46.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:3dfa6567f2e9e4c5dceb8ccb5a708158a2a871052fa75c8b78cb0977063f1507", size = 4277618, upload-time = "2026-03-25T23:33:34.567Z" }, + { url = "https://files.pythonhosted.org/packages/dd/52/a005f8eabdb28df57c20f84c44d397a755782d6ff6d455f05baa2785bd91/cryptography-46.0.6-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:cdcd3edcbc5d55757e5f5f3d330dd00007ae463a7e7aa5bf132d1f22a4b62b19", size = 4890802, upload-time = "2026-03-25T23:33:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/ec/4d/8e7d7245c79c617d08724e2efa397737715ca0ec830ecb3c91e547302555/cryptography-46.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:d4e4aadb7fc1f88687f47ca20bb7227981b03afaae69287029da08096853b738", size = 4457425, upload-time = "2026-03-25T23:33:38.904Z" }, + { url = "https://files.pythonhosted.org/packages/1d/5c/f6c3596a1430cec6f949085f0e1a970638d76f81c3ea56d93d564d04c340/cryptography-46.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2b417edbe8877cda9022dde3a008e2deb50be9c407eef034aeeb3a8b11d9db3c", size = 4405530, upload-time = "2026-03-25T23:33:40.842Z" }, + { url = "https://files.pythonhosted.org/packages/7e/c9/9f9cea13ee2dbde070424e0c4f621c091a91ffcc504ffea5e74f0e1daeff/cryptography-46.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:380343e0653b1c9d7e1f55b52aaa2dbb2fdf2730088d48c43ca1c7c0abb7cc2f", size = 4667896, upload-time = "2026-03-25T23:33:42.781Z" }, + { url = "https://files.pythonhosted.org/packages/01/41/3a578f7fd5c70611c0aacba52cd13cb364a5dee895a5c1d467208a9380b0/cryptography-46.0.6-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:2ef9e69886cbb137c2aef9772c2e7138dc581fad4fcbcf13cc181eb5a3ab6275", size = 7117147, upload-time = "2026-03-25T23:33:48.249Z" }, + { url = "https://files.pythonhosted.org/packages/fa/87/887f35a6fca9dde90cad08e0de0c89263a8e59b2d2ff904fd9fcd8025b6f/cryptography-46.0.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7f417f034f91dcec1cb6c5c35b07cdbb2ef262557f701b4ecd803ee8cefed4f4", size = 4266221, upload-time = "2026-03-25T23:33:49.874Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a8/0a90c4f0b0871e0e3d1ed126aed101328a8a57fd9fd17f00fb67e82a51ca/cryptography-46.0.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d24c13369e856b94892a89ddf70b332e0b70ad4a5c43cf3e9cb71d6d7ffa1f7b", size = 4408952, upload-time = "2026-03-25T23:33:52.128Z" }, + { url = "https://files.pythonhosted.org/packages/16/0b/b239701eb946523e4e9f329336e4ff32b1247e109cbab32d1a7b61da8ed7/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:aad75154a7ac9039936d50cf431719a2f8d4ed3d3c277ac03f3339ded1a5e707", size = 4270141, upload-time = "2026-03-25T23:33:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a8/976acdd4f0f30df7b25605f4b9d3d89295351665c2091d18224f7ad5cdbf/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:3c21d92ed15e9cfc6eb64c1f5a0326db22ca9c2566ca46d845119b45b4400361", size = 4904178, upload-time = "2026-03-25T23:33:55.725Z" }, + { url = "https://files.pythonhosted.org/packages/b1/1b/bf0e01a88efd0e59679b69f42d4afd5bced8700bb5e80617b2d63a3741af/cryptography-46.0.6-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:4668298aef7cddeaf5c6ecc244c2302a2b8e40f384255505c22875eebb47888b", size = 4441812, upload-time = "2026-03-25T23:33:57.364Z" }, + { url = "https://files.pythonhosted.org/packages/bb/8b/11df86de2ea389c65aa1806f331cae145f2ed18011f30234cc10ca253de8/cryptography-46.0.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:8ce35b77aaf02f3b59c90b2c8a05c73bac12cea5b4e8f3fbece1f5fddea5f0ca", size = 3963923, upload-time = "2026-03-25T23:33:59.361Z" }, + { url = "https://files.pythonhosted.org/packages/91/e0/207fb177c3a9ef6a8108f234208c3e9e76a6aa8cf20d51932916bd43bda0/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c89eb37fae9216985d8734c1afd172ba4927f5a05cfd9bf0e4863c6d5465b013", size = 4269695, upload-time = "2026-03-25T23:34:00.909Z" }, + { url = "https://files.pythonhosted.org/packages/21/5e/19f3260ed1e95bced52ace7501fabcd266df67077eeb382b79c81729d2d3/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:ed418c37d095aeddf5336898a132fba01091f0ac5844e3e8018506f014b6d2c4", size = 4869785, upload-time = "2026-03-25T23:34:02.796Z" }, + { url = "https://files.pythonhosted.org/packages/10/38/cd7864d79aa1d92ef6f1a584281433419b955ad5a5ba8d1eb6c872165bcb/cryptography-46.0.6-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:69cf0056d6947edc6e6760e5f17afe4bea06b56a9ac8a06de9d2bd6b532d4f3a", size = 4441404, upload-time = "2026-03-25T23:34:04.35Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/4fe7a8d25fed74419f91835cf5829ade6408fd1963c9eae9c4bce390ecbb/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e7304c4f4e9490e11efe56af6713983460ee0780f16c63f219984dab3af9d2d", size = 4397549, upload-time = "2026-03-25T23:34:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a0/7d738944eac6513cd60a8da98b65951f4a3b279b93479a7e8926d9cd730b/cryptography-46.0.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b928a3ca837c77a10e81a814a693f2295200adb3352395fad024559b7be7a736", size = 4651874, upload-time = "2026-03-25T23:34:07.916Z" }, + { url = "https://files.pythonhosted.org/packages/c4/cc/f330e982852403da79008552de9906804568ae9230da8432f7496ce02b71/cryptography-46.0.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:12cae594e9473bca1a7aceb90536060643128bb274fcea0fc459ab90f7d1ae7a", size = 7162776, upload-time = "2026-03-25T23:34:13.308Z" }, + { url = "https://files.pythonhosted.org/packages/49/b3/dc27efd8dcc4bff583b3f01d4a3943cd8b5821777a58b3a6a5f054d61b79/cryptography-46.0.6-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:639301950939d844a9e1c4464d7e07f902fe9a7f6b215bb0d4f28584729935d8", size = 4270529, upload-time = "2026-03-25T23:34:15.019Z" }, + { url = "https://files.pythonhosted.org/packages/e6/05/e8d0e6eb4f0d83365b3cb0e00eb3c484f7348db0266652ccd84632a3d58d/cryptography-46.0.6-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ed3775295fb91f70b4027aeba878d79b3e55c0b3e97eaa4de71f8f23a9f2eb77", size = 4414827, upload-time = "2026-03-25T23:34:16.604Z" }, + { url = "https://files.pythonhosted.org/packages/2f/97/daba0f5d2dc6d855e2dcb70733c812558a7977a55dd4a6722756628c44d1/cryptography-46.0.6-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8927ccfbe967c7df312ade694f987e7e9e22b2425976ddbf28271d7e58845290", size = 4271265, upload-time = "2026-03-25T23:34:18.586Z" }, + { url = "https://files.pythonhosted.org/packages/89/06/fe1fce39a37ac452e58d04b43b0855261dac320a2ebf8f5260dd55b201a9/cryptography-46.0.6-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:b12c6b1e1651e42ab5de8b1e00dc3b6354fdfd778e7fa60541ddacc27cd21410", size = 4916800, upload-time = "2026-03-25T23:34:20.561Z" }, + { url = "https://files.pythonhosted.org/packages/ff/8a/b14f3101fe9c3592603339eb5d94046c3ce5f7fc76d6512a2d40efd9724e/cryptography-46.0.6-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:063b67749f338ca9c5a0b7fe438a52c25f9526b851e24e6c9310e7195aad3b4d", size = 4448771, upload-time = "2026-03-25T23:34:22.406Z" }, + { url = "https://files.pythonhosted.org/packages/01/b3/0796998056a66d1973fd52ee89dc1bb3b6581960a91ad4ac705f182d398f/cryptography-46.0.6-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:02fad249cb0e090b574e30b276a3da6a149e04ee2f049725b1f69e7b8351ec70", size = 3978333, upload-time = "2026-03-25T23:34:24.281Z" }, + { url = "https://files.pythonhosted.org/packages/c5/3d/db200af5a4ffd08918cd55c08399dc6c9c50b0bc72c00a3246e099d3a849/cryptography-46.0.6-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e6142674f2a9291463e5e150090b95a8519b2fb6e6aaec8917dd8d094ce750d", size = 4271069, upload-time = "2026-03-25T23:34:25.895Z" }, + { url = "https://files.pythonhosted.org/packages/d7/18/61acfd5b414309d74ee838be321c636fe71815436f53c9f0334bf19064fa/cryptography-46.0.6-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:456b3215172aeefb9284550b162801d62f5f264a081049a3e94307fe20792cfa", size = 4878358, upload-time = "2026-03-25T23:34:27.67Z" }, + { url = "https://files.pythonhosted.org/packages/8b/65/5bf43286d566f8171917cae23ac6add941654ccf085d739195a4eacf1674/cryptography-46.0.6-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:341359d6c9e68834e204ceaf25936dffeafea3829ab80e9503860dcc4f4dac58", size = 4448061, upload-time = "2026-03-25T23:34:29.375Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/7e49c0fa7205cf3597e525d156a6bce5b5c9de1fd7e8cb01120e459f205a/cryptography-46.0.6-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9a9c42a2723999a710445bc0d974e345c32adfd8d2fac6d8a251fa829ad31cfb", size = 4399103, upload-time = "2026-03-25T23:34:32.036Z" }, + { url = "https://files.pythonhosted.org/packages/44/46/466269e833f1c4718d6cd496ffe20c56c9c8d013486ff66b4f69c302a68d/cryptography-46.0.6-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6617f67b1606dfd9fe4dbfa354a9508d4a6d37afe30306fe6c101b7ce3274b72", size = 4659255, upload-time = "2026-03-25T23:34:33.679Z" }, + { url = "https://files.pythonhosted.org/packages/2e/84/7ccff00ced5bac74b775ce0beb7d1be4e8637536b522b5df9b73ada42da2/cryptography-46.0.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:2ea0f37e9a9cf0df2952893ad145fd9627d326a59daec9b0802480fa3bcd2ead", size = 3475444, upload-time = "2026-03-25T23:34:38.944Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1f/4c926f50df7749f000f20eede0c896769509895e2648db5da0ed55db711d/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a3e84d5ec9ba01f8fd03802b2147ba77f0c8f2617b2aff254cedd551844209c8", size = 4218227, upload-time = "2026-03-25T23:34:40.871Z" }, + { url = "https://files.pythonhosted.org/packages/c6/65/707be3ffbd5f786028665c3223e86e11c4cda86023adbc56bd72b1b6bab5/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:12f0fa16cc247b13c43d56d7b35287ff1569b5b1f4c5e87e92cc4fcc00cd10c0", size = 4381399, upload-time = "2026-03-25T23:34:42.609Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6d/73557ed0ef7d73d04d9aba745d2c8e95218213687ee5e76b7d236a5030fc/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:50575a76e2951fe7dbd1f56d181f8c5ceeeb075e9ff88e7ad997d2f42af06e7b", size = 4217595, upload-time = "2026-03-25T23:34:44.205Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c5/e1594c4eec66a567c3ac4400008108a415808be2ce13dcb9a9045c92f1a0/cryptography-46.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:90e5f0a7b3be5f40c3a0a0eafb32c681d8d2c181fc2a1bdabe9b3f611d9f6b1a", size = 4380912, upload-time = "2026-03-25T23:34:46.328Z" }, ] [[package]] From 0292edbee7a8e9f98fcada61f2398f76dcd630b0 Mon Sep 17 00:00:00 2001 From: Jan Kleine Date: Mon, 30 Mar 2026 18:30:22 +0200 Subject: [PATCH 079/113] Fixhancement: include trashed documents in document exporter/importer (#12425) --- .../management/commands/document_exporter.py | 15 +++--- .../management/commands/document_importer.py | 4 +- .../tests/test_management_exporter.py | 48 ++++++++++++++++++- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py index cd1cee6b3..ee3b44e0c 100644 --- a/src/documents/management/commands/document_exporter.py +++ b/src/documents/management/commands/document_exporter.py @@ -385,10 +385,10 @@ class Command(CryptMixin, PaperlessCommand): "workflow_webhook_actions": WorkflowActionWebhook.objects.all(), "workflows": Workflow.objects.all(), "custom_fields": CustomField.objects.all(), - "custom_field_instances": CustomFieldInstance.objects.all(), + "custom_field_instances": CustomFieldInstance.global_objects.all(), "app_configs": ApplicationConfiguration.objects.all(), - "notes": Note.objects.all(), - "documents": Document.objects.order_by("id").all(), + "notes": Note.global_objects.all(), + "documents": Document.global_objects.order_by("id").all(), "social_accounts": SocialAccount.objects.all(), "social_apps": SocialApp.objects.all(), "social_tokens": SocialToken.objects.all(), @@ -443,7 +443,7 @@ class Command(CryptMixin, PaperlessCommand): writer.write_batch(batch) document_map: dict[int, Document] = { - d.pk: d for d in Document.objects.order_by("id") + d.pk: d for d in Document.global_objects.order_by("id") } # 3. Export files from each document @@ -619,12 +619,15 @@ class Command(CryptMixin, PaperlessCommand): """Write per-document manifest file for --split-manifest mode.""" content = [document_dict] content.extend( - serializers.serialize("python", Note.objects.filter(document=document)), + serializers.serialize( + "python", + Note.global_objects.filter(document=document), + ), ) content.extend( serializers.serialize( "python", - CustomFieldInstance.objects.filter(document=document), + CustomFieldInstance.global_objects.filter(document=document), ), ) manifest_name = base_name.with_name(f"{base_name.stem}-manifest.json") diff --git a/src/documents/management/commands/document_importer.py b/src/documents/management/commands/document_importer.py index c0056c062..4572b4617 100644 --- a/src/documents/management/commands/document_importer.py +++ b/src/documents/management/commands/document_importer.py @@ -125,7 +125,7 @@ class Command(CryptMixin, PaperlessCommand): "Found existing user(s), this might indicate a non-empty installation", ), ) - if Document.objects.count() != 0: + if Document.global_objects.count() != 0: self.stdout.write( self.style.WARNING( "Found existing documents(s), this might indicate a non-empty installation", @@ -376,7 +376,7 @@ class Command(CryptMixin, PaperlessCommand): ] for record in self.track(document_records, description="Copying files..."): - document = Document.objects.get(pk=record["pk"]) + document = Document.global_objects.get(pk=record["pk"]) doc_file = record[EXPORTER_FILE_NAME] document_path = self.source / doc_file diff --git a/src/documents/tests/test_management_exporter.py b/src/documents/tests/test_management_exporter.py index fb9effa0e..a214ef51d 100644 --- a/src/documents/tests/test_management_exporter.py +++ b/src/documents/tests/test_management_exporter.py @@ -389,7 +389,7 @@ class TestExportImport( self.assertIsFile( str(self.target / doc_from_manifest[EXPORTER_FILE_NAME]), ) - self.d3.delete() + self.d3.hard_delete() manifest = self._do_export() self.assertRaises( @@ -868,6 +868,52 @@ class TestExportImport( for obj in manifest: self.assertNotEqual(obj["model"], "auditlog.logentry") + def test_export_import_soft_deleted_document(self) -> None: + """ + GIVEN: + - A document with a note and custom field instance has been soft-deleted + WHEN: + - Export and re-import are performed + THEN: + - The soft-deleted document, note, and custom field instance + survive the round-trip with deleted_at preserved + """ + shutil.rmtree(Path(self.dirs.media_dir) / "documents") + shutil.copytree( + Path(__file__).parent / "samples" / "documents", + Path(self.dirs.media_dir) / "documents", + ) + + # d1 has self.note and self.cfi1 attached via setUp + self.d1.delete() + + self._do_export() + + with paperless_environment(): + Document.global_objects.all().hard_delete() + Correspondent.objects.all().delete() + DocumentType.objects.all().delete() + Tag.objects.all().delete() + + call_command( + "document_importer", + "--no-progress-bar", + self.target, + skip_checks=True, + ) + + self.assertEqual(Document.global_objects.count(), 4) + reimported_doc = Document.global_objects.get(pk=self.d1.pk) + self.assertIsNotNone(reimported_doc.deleted_at) + + self.assertEqual(Note.global_objects.count(), 1) + reimported_note = Note.global_objects.get(pk=self.note.pk) + self.assertIsNotNone(reimported_note.deleted_at) + + self.assertEqual(CustomFieldInstance.global_objects.count(), 1) + reimported_cfi = CustomFieldInstance.global_objects.get(pk=self.cfi1.pk) + self.assertIsNotNone(reimported_cfi.deleted_at) + def test_export_data_only(self) -> None: """ GIVEN: From f715533770f6bfefdd1a9bb4d5f577a7c18a5910 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 30 Mar 2026 09:38:52 -0700 Subject: [PATCH 080/113] Performance: support passing selection data with filtered document requests (#12300) --- .../e2e/dashboard/requests/api-dashboard1.har | 2 +- .../e2e/dashboard/requests/api-dashboard2.har | 4 +- .../e2e/dashboard/requests/api-dashboard3.har | 2 +- .../requests/api-document-detail2.har | 4 +- .../e2e/document-list/document-list.spec.ts | 2 +- .../requests/api-document-list1.har | 30 ++--- .../requests/api-document-list2.har | 24 ++-- .../requests/api-document-list3.har | 8 +- .../requests/api-document-list4.har | 40 +++---- .../requests/api-document-list5.har | 4 +- .../requests/api-document-list6.har | 4 +- .../filterable-dropdown.component.ts | 2 +- .../bulk-editor/bulk-editor.component.spec.ts | 36 +++--- .../bulk-editor/bulk-editor.component.ts | 2 +- .../filter-editor/filter-editor.component.ts | 7 +- src-ui/src/app/data/results.ts | 19 ++++ .../document-list-view.service.spec.ts | 104 +++++++----------- .../services/document-list-view.service.ts | 21 +--- .../src/app/services/rest/document.service.ts | 15 +-- src/documents/tests/test_api_documents.py | 50 +++++++++ src/documents/tests/test_api_search.py | 40 +++++++ src/documents/views.py | 89 +++++++++++++++ 22 files changed, 328 insertions(+), 181 deletions(-) diff --git a/src-ui/e2e/dashboard/requests/api-dashboard1.har b/src-ui/e2e/dashboard/requests/api-dashboard1.har index 07ff8ef9e..d39787c30 100644 --- a/src-ui/e2e/dashboard/requests/api-dashboard1.har +++ b/src-ui/e2e/dashboard/requests/api-dashboard1.har @@ -468,7 +468,7 @@ "time": 0.951, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__in=9", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__in=9", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ diff --git a/src-ui/e2e/dashboard/requests/api-dashboard2.har b/src-ui/e2e/dashboard/requests/api-dashboard2.har index 912fbf308..0918eba8f 100644 --- a/src-ui/e2e/dashboard/requests/api-dashboard2.har +++ b/src-ui/e2e/dashboard/requests/api-dashboard2.har @@ -534,7 +534,7 @@ "time": 0.793, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -594,7 +594,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, diff --git a/src-ui/e2e/dashboard/requests/api-dashboard3.har b/src-ui/e2e/dashboard/requests/api-dashboard3.har index 6c441970c..fbd31c37c 100644 --- a/src-ui/e2e/dashboard/requests/api-dashboard3.har +++ b/src-ui/e2e/dashboard/requests/api-dashboard3.har @@ -534,7 +534,7 @@ "time": 0.653, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=9", + "url": "http://localhost:8000/api/documents/?page=1&page_size=10&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=9", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ diff --git a/src-ui/e2e/document-detail/requests/api-document-detail2.har b/src-ui/e2e/document-detail/requests/api-document-detail2.har index ee3166211..1aeb6dc55 100644 --- a/src-ui/e2e/document-detail/requests/api-document-detail2.har +++ b/src-ui/e2e/document-detail/requests/api-document-detail2.har @@ -883,7 +883,7 @@ "time": 0.93, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=4", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=4", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -961,7 +961,7 @@ "time": -1, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=4", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=4", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ diff --git a/src-ui/e2e/document-list/document-list.spec.ts b/src-ui/e2e/document-list/document-list.spec.ts index 9aa4d2fdc..700304186 100644 --- a/src-ui/e2e/document-list/document-list.spec.ts +++ b/src-ui/e2e/document-list/document-list.spec.ts @@ -16,7 +16,7 @@ test('basic filtering', async ({ page }) => { await expect(page).toHaveURL(/tags__id__all=9/) await expect(page.locator('pngx-document-list')).toHaveText(/8 documents/) await page.getByRole('button', { name: 'Document type' }).click() - await page.getByRole('menuitem', { name: 'Invoice Test 3' }).click() + await page.getByRole('menuitem', { name: /^Invoice Test/ }).click() await expect(page).toHaveURL(/document_type__id__in=1/) await expect(page.locator('pngx-document-list')).toHaveText(/3 documents/) await page.getByRole('button', { name: 'Reset filters' }).first().click() diff --git a/src-ui/e2e/document-list/requests/api-document-list1.har b/src-ui/e2e/document-list/requests/api-document-list1.har index 6a4aa9ac1..35ce0537c 100644 --- a/src-ui/e2e/document-list/requests/api-document-list1.har +++ b/src-ui/e2e/document-list/requests/api-document-list1.har @@ -260,7 +260,7 @@ "time": 1.023, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -320,7 +320,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -3545,7 +3545,7 @@ "time": 0.933, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=9", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=9", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -3687,7 +3687,7 @@ "time": 0.597, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=9&document_type__id__in=1", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=9&document_type__id__in=1", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -3833,7 +3833,7 @@ "time": 0.771, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -3893,7 +3893,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -3971,7 +3971,7 @@ "time": 0.55, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&correspondent__id__in=1", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&correspondent__id__in=1", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4113,7 +4113,7 @@ "time": 0.554, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&correspondent__id__in=12,1", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&correspondent__id__in=12,1", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4255,7 +4255,7 @@ "time": 0.759, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&correspondent__id__none=12,1", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&correspondent__id__none=12,1", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4319,7 +4319,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":54,\"next\":\"http://localhost:8000/api/documents/?correspondent__id__none=12%2C1&ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,298,290,277,268,261,260,252,243,223,284,220,204,175,196,177,176,181,205,206,191,227,180,3,224,233,312,258,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":54,\"next\":\"http://localhost:8000/api/documents/?correspondent__id__none=12%2C1&ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,298,290,277,268,261,260,252,243,223,284,220,204,175,196,177,176,181,205,206,191,227,180,3,224,233,312,258,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -4789,7 +4789,7 @@ "time": 0.754, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4849,7 +4849,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -4927,7 +4927,7 @@ "time": 0.659, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&storage_path__id__in=5", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&storage_path__id__in=5", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -5069,7 +5069,7 @@ "time": 0.8, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -5129,7 +5129,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, diff --git a/src-ui/e2e/document-list/requests/api-document-list2.har b/src-ui/e2e/document-list/requests/api-document-list2.har index 65de66d17..3cbc9e8a6 100644 --- a/src-ui/e2e/document-list/requests/api-document-list2.har +++ b/src-ui/e2e/document-list/requests/api-document-list2.har @@ -260,7 +260,7 @@ "time": 1.729, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -320,7 +320,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -3545,7 +3545,7 @@ "time": 1.091, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&title_content=test", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&title_content=test", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4303,7 +4303,7 @@ "time": 0.603, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&title__icontains=test", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&title__icontains=test", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4445,7 +4445,7 @@ "time": 0.602, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&query=test", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&query=test", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4587,7 +4587,7 @@ "time": 0.523, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&archive_serial_number=test", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&archive_serial_number=test", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4664,7 +4664,7 @@ "time": 1.59, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&archive_serial_number=1123", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&archive_serial_number=1123", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4806,7 +4806,7 @@ "time": 1.859, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&archive_serial_number__gt=1123", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&archive_serial_number__gt=1123", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4948,7 +4948,7 @@ "time": 0.571, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&archive_serial_number__lt=1123", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&archive_serial_number__lt=1123", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -5089,7 +5089,7 @@ "time": 0.757, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&archive_serial_number__isnull=1", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&archive_serial_number__isnull=1", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -5153,7 +5153,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":55,\"next\":\"http://localhost:8000/api/documents/?archive_serial_number__isnull=1&ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,176,5,181,205,191,227,180,224,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]}]}" + "text": "{\"count\":55,\"next\":\"http://localhost:8000/api/documents/?archive_serial_number__isnull=1&ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,176,5,181,205,191,227,180,224,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]}]}" }, "headersSize": -1, "bodySize": -1, @@ -5231,7 +5231,7 @@ "time": 0.574, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&archive_serial_number__isnull=0", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&archive_serial_number__isnull=0", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ diff --git a/src-ui/e2e/document-list/requests/api-document-list3.har b/src-ui/e2e/document-list/requests/api-document-list3.har index 291915a65..9872331de 100644 --- a/src-ui/e2e/document-list/requests/api-document-list3.har +++ b/src-ui/e2e/document-list/requests/api-document-list3.har @@ -260,7 +260,7 @@ "time": 0.944, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -320,7 +320,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -3545,7 +3545,7 @@ "time": 0.828, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&query=created:%5B-3%20month%20to%20now%5D", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&query=created:%5B-3%20month%20to%20now%5D", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -3687,7 +3687,7 @@ "time": 1.501, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&created__date__gte=2022-12-11", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&created__date__gte=2022-12-11", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ diff --git a/src-ui/e2e/document-list/requests/api-document-list4.har b/src-ui/e2e/document-list/requests/api-document-list4.har index 60657e3c9..a9e8815dd 100644 --- a/src-ui/e2e/document-list/requests/api-document-list4.har +++ b/src-ui/e2e/document-list/requests/api-document-list4.har @@ -260,7 +260,7 @@ "time": 0.803, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -320,7 +320,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -3545,7 +3545,7 @@ "time": 1.454, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-archive_serial_number&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-archive_serial_number&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -3605,7 +3605,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-archive_serial_number&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[298,206,177,7,4,3,5,175,176,179,180,181,191,196,204,205,219,220,223,224,225,227,228,230,231,232,233,234,235,236,237,238,241,242,243,244,246,247,248,249,250,251,252,254,255,256,258,259,260,261,268,277,278,284,290,295,296,297,307,310,312],\"results\":[{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-archive_serial_number&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[298,206,177,7,4,3,5,175,176,179,180,181,191,196,204,205,219,220,223,224,225,227,228,230,231,232,233,234,235,236,237,238,241,242,243,244,246,247,248,249,250,251,252,254,255,256,258,259,260,261,268,277,278,284,290,295,296,297,307,310,312],\"results\":[{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]}]}" }, "headersSize": -1, "bodySize": -1, @@ -4299,7 +4299,7 @@ "time": 0.695, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-correspondent__name&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-correspondent__name&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4359,7 +4359,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-correspondent__name&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[4,179,296,196,5,7,295,297,3,180,181,191,205,206,243,252,220,223,298,310,175,176,177,204,219,224,225,227,228,230,231,232,233,234,235,236,237,238,241,242,244,246,247,248,249,250,251,254,255,256,258,259,260,261,268,277,278,284,290,307,312],\"results\":[{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-correspondent__name&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[4,179,296,196,5,7,295,297,3,180,181,191,205,206,243,252,220,223,298,310,175,176,177,204,219,224,225,227,228,230,231,232,233,234,235,236,237,238,241,242,244,246,247,248,249,250,251,254,255,256,258,259,260,261,268,277,278,284,290,307,312],\"results\":[{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -4437,7 +4437,7 @@ "time": 0.804, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-title&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-title&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4497,7 +4497,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-title&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[219,284,307,179,295,7,5,177,176,3,224,205,206,191,204,233,235,236,237,175,196,290,181,310,312,228,227,296,259,260,298,225,223,220,180,232,230,231,238,234,277,242,241,243,244,246,4,254,250,249,261,268,258,278,255,252,256,251,248,297,247],\"results\":[{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-title&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[219,284,307,179,295,7,5,177,176,3,224,205,206,191,204,233,235,236,237,175,196,290,181,310,312,228,227,296,259,260,298,225,223,220,180,232,230,231,238,234,277,242,241,243,244,246,4,254,250,249,261,268,258,278,255,252,256,251,248,297,247],\"results\":[{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -4575,7 +4575,7 @@ "time": 0.72, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-document_type__name&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-document_type__name&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4635,7 +4635,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-document_type__name&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[3,180,181,220,223,243,277,296,310,176,4,5,7,175,177,179,191,196,204,205,206,219,224,225,227,228,230,231,232,233,234,235,236,237,238,241,242,244,246,247,248,249,250,251,252,254,255,256,258,259,260,261,268,278,284,290,295,297,298,307,312],\"results\":[{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-document_type__name&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[3,180,181,220,223,243,277,296,310,176,4,5,7,175,177,179,191,196,204,205,206,219,224,225,227,228,230,231,232,233,234,235,236,237,238,241,242,244,246,247,248,249,250,251,252,254,255,256,258,259,260,261,268,278,284,290,295,297,298,307,312],\"results\":[{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -4713,7 +4713,7 @@ "time": 0.651, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4773,7 +4773,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -4851,7 +4851,7 @@ "time": 0.74, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-added&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-added&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4911,7 +4911,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-added&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[312,310,307,298,297,296,295,290,284,278,277,268,261,260,259,258,256,255,254,252,251,250,249,248,247,246,244,243,242,241,238,237,236,235,234,233,232,231,230,228,227,225,224,223,220,219,206,205,204,196,191,181,180,179,177,176,175,7,5,4,3],\"results\":[{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-added&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[312,310,307,298,297,296,295,290,284,278,277,268,261,260,259,258,256,255,254,252,251,250,249,248,247,246,244,243,242,241,238,237,236,235,234,233,232,231,230,228,227,225,224,223,220,219,206,205,204,196,191,181,180,179,177,176,175,7,5,4,3],\"results\":[{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -4989,7 +4989,7 @@ "time": 0.747, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-modified&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-modified&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -5049,7 +5049,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-modified&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[296,278,298,312,310,290,231,307,297,176,223,277,175,3,295,191,205,5,181,252,180,284,243,233,260,261,268,4,220,224,219,259,206,258,256,255,254,251,250,249,248,247,246,244,242,241,238,237,236,235,234,232,230,228,227,225,204,196,177,7,179],\"results\":[{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-modified&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[296,278,298,312,310,290,231,307,297,176,223,277,175,3,295,191,205,5,181,252,180,284,243,233,260,261,268,4,220,224,219,259,206,258,256,255,254,251,250,249,248,247,246,244,242,241,238,237,236,235,234,232,230,228,227,225,204,196,177,7,179],\"results\":[{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -5127,7 +5127,7 @@ "time": 0.837, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-num_notes&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-num_notes&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -5187,7 +5187,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-num_notes&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[277,175,296,7,3,176,231,261,297,298,307,4,5,177,179,180,181,191,196,204,205,206,219,220,223,224,225,227,228,230,232,233,234,235,236,237,238,241,242,243,244,246,247,248,249,250,251,252,254,255,256,258,259,260,268,278,284,290,295,310,312],\"results\":[{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-num_notes&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[277,175,296,7,3,176,231,261,297,298,307,4,5,177,179,180,181,191,196,204,205,206,219,220,223,224,225,227,228,230,232,233,234,235,236,237,238,241,242,243,244,246,247,248,249,250,251,252,254,255,256,258,259,260,268,278,284,290,295,310,312],\"results\":[{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":231,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Knee Emergency Radiol\",\"content\":\"CHAPTER IV-3\\n\\nLower Extremity: Patient 3\\n\\nKnee pain in two patients\\nfollowing minor trauma\\n\\nPATIENT 3A A 62-year-old woman\\ntwisted her knee two days earlier\\nwhile moving a sofa at her home.\\nHer pain persisted and she needed a\\ncane to walk.\\n\\nOn examination, the lateral as-\\npect of her knee was tender and\\nthere was a small effusion. Flexion\\nwas limited to 60(cid:2). There was no\\ntenderness over the patella. Her\\nquadriceps strength was good and\\nthere was no ligamentous instability.\\n\\nPATIENT 3B A 24-year-old woman\\nwas struck on the lateral aspect o\",\"tags\":[],\"created\":\"2000-11-01T00:00:00Z\",\"created_date\":\"2000-11-01\",\"modified\":\"2023-03-18T20:53:39.573447Z\",\"added\":\"2022-03-13T15:56:11.171627Z\",\"archive_serial_number\":null,\"original_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"archived_file_name\":\"2000-11-01 Knee Emergency Radiol.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":35,\"note\":\"Add one\",\"created\":\"2023-03-18T20:53:47.946025Z\",\"document\":231,\"user\":2}]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, @@ -5265,7 +5265,7 @@ "time": 0.759, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=num_notes&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=num_notes&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -5325,7 +5325,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=num_notes&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[4,5,177,179,180,181,191,196,204,205,206,219,220,223,224,225,227,228,230,232,233,234,235,236,237,238,241,242,243,244,246,247,248,249,250,251,252,254,255,256,258,259,260,268,278,284,290,295,310,312,3,176,231,261,297,298,307,7,175,296,277],\"results\":[{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=num_notes&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[4,5,177,179,180,181,191,196,204,205,206,219,220,223,224,225,227,228,230,232,233,234,235,236,237,238,241,242,243,244,246,247,248,249,250,251,252,254,255,256,258,259,260,268,278,284,290,295,310,312,3,176,231,261,297,298,307,7,175,296,277],\"results\":[{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":225,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Sabaté-2003-The contribution of\",\"content\":\"The contribution of vegetarian diets to health and disease: a\\nparadigm shift?1–3\\n\\nJoan Sabaté\\n\\nABSTRACT\\nAdvances in nutrition research during the past\\nfew decades have changed scientists’ understanding of the contri-\\nbution of vegetarian diets to human health and disease. Diets largely\\nbased on plant foods, such as well-balanced vegetarian diets, could\\nbest prevent nutrient deficiencies as well as diet-related chronic dis-\\neases. However, restrictive or unbalanced vegetarian diets may lead\\nto nutritional deficiencies, particularly in situations \",\"tags\":[],\"created\":\"1990-03-13T00:00:00Z\",\"created_date\":\"1990-03-13\",\"modified\":\"2022-03-13T15:53:35.781177Z\",\"added\":\"2022-03-13T15:53:35.501205Z\",\"archive_serial_number\":null,\"original_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"archived_file_name\":\"1990-03-13 Sabaté-2003-The contribution of.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":228,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Wenrich-Cheerleader to Coach\",\"content\":\"Moderator: Paul A. Hemmer, MD, MPH\\n\\nFeedback in Teaching and Learning\\n\\nFrom Cheerleader to Coach: The Developmental \\nProgression of Bedside Teachers in Giving \\nFeedback to Early Learners\\nMarjorie D. Wenrich, MPH, Molly Blackley Jackson, MD, Ramoncita R. Maestas, MD, \\nIneke H.A.P. Wolfhagen, PhD, and Albert J.J. Scherpbier, MD, PhD\\n\\nAbstract\\n\\nBackground\\nMedical students learn clinical skills at the \\nbedside from teaching clinicians, who \\noften learn to teach by teaching. Little is \\nknown about the process of becoming an \\neffective clinical teach\",\"tags\":[4],\"created\":\"2007-03-01T00:00:00Z\",\"created_date\":\"2007-03-01\",\"modified\":\"2022-03-13T15:55:00.200623Z\",\"added\":\"2022-03-13T15:54:59.957066Z\",\"archive_serial_number\":null,\"original_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"archived_file_name\":\"2007-03-01 Wenrich-Cheerleader to Coach.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":230,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Lara-2010-Diffuse-alveolar-hemorrhage\",\"content\":\"CHEST Recent Advances in Chest Medicine\\n\\nDiffuse Alveolar Hemorrhage \\n\\nAbigail R. Lara , MD ; and Marvin I. Schwarz , MD , FCCP \\n\\nDiffuse alveolar hemorrhage (DAH) is often a catastrophic clinical syndrome causing respiratory \\nfailure. Recognition of DAH often requires BAL as symptoms are nonspecifi c, hemoptysis is \\nabsent in up to one-third of patients, and radiographic imaging is also nonspecifi c and similar to \\nother acute alveolar fi lling processes. Once the diagnosis is established, the underlying cause \\nmust be established in order to ini\",\"tags\":[4],\"created\":\"2009-08-27T00:00:00Z\",\"created_date\":\"2009-08-27\",\"modified\":\"2022-03-13T15:55:56.127564Z\",\"added\":\"2022-03-13T15:55:55.717855Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"archived_file_name\":\"2009-08-27 Lara-2010-Diffuse-alveolar-hemorrhage.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":235,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jama_zhong_2019_oi_190019\",\"content\":\"Research\\n\\nJAMA | Original Investigation\\nAssociations of Dietary Cholesterol or Egg Consumption\\nWith Incident Cardiovascular Disease and Mortality\\n\\nVictor W. Zhong, PhD; Linda Van Horn, PhD; Marilyn C. Cornelis, PhD; John T. Wilkins, MD, MS; Hongyan Ning, MD, MS;\\nMercedes R. Carnethon, PhD; Philip Greenland, MD; Robert J. Mentz, MD; Katherine L. Tucker, PhD; Lihui Zhao, PhD;\\nArnita F. Norwood, PhD; Donald M. Lloyd-Jones, MD, ScM; Norrina B. Allen, PhD\\n\\nIMPORTANCE Cholesterol is a common nutrient in the human diet and eggs are a major source\\nof d\",\"tags\":[],\"created\":\"1985-03-25T00:00:00Z\",\"created_date\":\"1985-03-25\",\"modified\":\"2022-03-13T15:58:20.036498Z\",\"added\":\"2022-03-13T15:58:19.509334Z\",\"archive_serial_number\":null,\"original_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"archived_file_name\":\"1985-03-25 jama_zhong_2019_oi_190019.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":238,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Jauch-2013-Guidelines for the Early Management\",\"content\":\"AHA/ASA Guideline\\n\\nGuidelines for the Early Management of Patients \\nWith Acute Ischemic Stroke\\nA Guideline for Healthcare Professionals From the American Heart \\nAssociation/American Stroke Association\\nThe American Academy of Neurology affirms the value of this guideline as an educational \\ntool for neurologists.\\n\\nEndorsed by the American Association of Neurological Surgeons and Congress \\nof Neurological Surgeons\\n\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\nD\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nw\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\nl\\no\\no\\no\\no\\no\\no\\no\\no\\no\\no\\na\\na\\na\\na\\na\\na\\na\\n\",\"tags\":[4],\"created\":\"2009-03-01T00:00:00Z\",\"created_date\":\"2009-03-01\",\"modified\":\"2022-03-13T15:59:12.744798Z\",\"added\":\"2022-03-13T15:59:10.560640Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"archived_file_name\":\"2009-03-01 Jauch-2013-Guidelines for the Early Management.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":241,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Glassick 2000 Acad Med Boyers expanded def of scholarship\",\"content\":\"Boyer’s Expanded Definitions of Scholarship, the\\nStandards for Assessing Scholarship, and the\\nElusiveness of the Scholarship of Teaching\\n\\nA R T I C L E\\n\\nCharles E. Glassick, PhD\\n\\nABSTRACT\\n\\nDebate about faculty roles and rewards in higher educa-\\ntion during the past decade has been fueled by the work\\nof the Carnegie Foundation for the Advancement of\\nTeaching, principally Scholarship Reconsidered and Schol-\\narship Assessed. The author summarizes those publications\\nand reviews the more recent work of Lee Shulman on the\\nscholarship of teaching.\\n\\nIn \",\"tags\":[],\"created\":\"1989-03-01T00:00:00Z\",\"created_date\":\"1989-03-01\",\"modified\":\"2022-03-13T15:59:25.008092Z\",\"added\":\"2022-03-13T15:59:24.865834Z\",\"archive_serial_number\":null,\"original_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"archived_file_name\":\"1989-03-01 Glassick 2000 Acad Med Boyers expanded def of scholarship.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":244,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Ericsson_Deliberate Practice_Med Educ_2007\",\"content\":\"clinical performance\\n\\nAn expert-performance perspective of research on\\nmedical expertise: the study of clinical performance\\n\\nK ANDERS ERICSSON\\n\\nCONTEXT Three decades ago Elstein et al. pub-\\nlished their classic book on medical expertise, in\\nwhich they described their failure to identify superior\\nperformance by peer-nominated diagnosticians using\\nhigh- and low-fidelity simulations of the everyday\\npractice of doctors.\\n\\nOBJECTIVE This paper reviews the results of\\nsubsequent research, with a particular emphasis on\\nthe progress toward Elstein et al.(\",\"tags\":[],\"created\":\"2004-03-01T00:00:00Z\",\"created_date\":\"2004-03-01\",\"modified\":\"2022-03-13T16:00:13.891872Z\",\"added\":\"2022-03-13T16:00:13.671286Z\",\"archive_serial_number\":null,\"original_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"archived_file_name\":\"2004-03-01 Ericsson_Deliberate Practice_Med Educ_2007.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":251,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1777.full\",\"content\":\"C l i n i c a l C a r e / E d u c a t i o n / N u t r i t i o n\\n\\nO R I G I N A L\\n\\nA R T I C L E\\n\\nA Low-Fat Vegan Diet Improves Glycemic\\nControl and Cardiovascular Risk Factors in\\na Randomized Clinical Trial in Individuals\\nWith Type 2 Diabetes\\n\\n1,2\\n\\n1\\n\\nNEAL D. BARNARD, MD\\nJOSHUA COHEN, MD\\n3\\nDAVID J.A. JENKINS, MD, PHD\\nGABRIELLE TURNER-MCGRIEVY, MS, RD\\nLISE GLOEDE, RD, CDE\\n\\n5\\n\\n4\\n\\n2\\n\\nBRENT JASTER, MD\\n2\\nKIM SEIDL, MS, RD\\nAMBER A. GREEN, RD\\nSTANLEY TALPERS, MD\\n\\n2\\n\\n1\\n\\nOBJECTIVE — We sought to investigate whether a low-fat vegan diet improves glycemic\",\"tags\":[4],\"created\":\"2006-03-20T00:00:00Z\",\"created_date\":\"2006-03-20\",\"modified\":\"2022-03-15T07:48:33.046219Z\",\"added\":\"2022-03-15T07:48:32.734784Z\",\"archive_serial_number\":null,\"original_file_name\":\"2006-03-20 1777.full.pdf\",\"archived_file_name\":\"2006-03-20 1777.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":256,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"1995-Tissue plasminogen activator for acute is\",\"content\":\"\\n\\nCopyright, 1995, by the Massachusetts Medical Society\\n\\nVolume 333\\n\\nDECEMBER 14, 1995\\n\\nNumber 24\\n\\nTISSUE PLASMINOGEN ACTIVATOR FOR ACUTE ISCHEMIC STROKE\\n\\nT\\n\\nHE\\n\\nN\\n\\nATIONAL\\n\\nNSTITUTE\\n\\nOF\\n\\nEUROLOGICAL\\n\\nISORDERS\\n\\nAND\\n\\nTROKE\\n\\n\\n\\nS\\n\\nrt-PA S\\n\\nTROKE\\n\\nS\\n\\nTUDY\\n\\nG\\n\\nROUP\\n\\n*\\n\\n\\n\\nN\\n\\nD\\n\\nI\\n\\nMethods.\\n\\nBackground.\\n\\nAbstract\\nThrombolytic therapy for acute\\nischemic stroke has been approached cautiously be-\\ncause there were high rates of intracerebral hemorrhage\\nin early clinical trials. We performed a randomized, dou-\\nble-blind trial of intravenous recombinant ti\",\"tags\":[],\"created\":\"1995-12-14T00:00:00Z\",\"created_date\":\"1995-12-14\",\"modified\":\"2022-03-15T15:26:36.261713Z\",\"added\":\"2022-03-15T15:26:35.956683Z\",\"archive_serial_number\":null,\"original_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"archived_file_name\":\"1995-12-14 1995-Tissue plasminogen activator for acute is.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":259,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Testing Old Date 2\",\"content\":\"Release Notes \\n\\nSimba ODBC Driver for SQL Server 1.2.3 \\n\\nThe release notes provide details of enhancements, features, and known issues in Simba ODBC \\nDriver for SQL Server 1.2.3, as well as the version history. \\n\\nResolved Issues \\n\\nThe following issues have been resolved in Simba ODBC Driver for SQL Server 1.2.3. \\n\\nWhen querying large SQL_NUMERIC or SQL_DECIMAL values and retrieving the values as \\nSQL_C_SBIGINT data, an error occurs \\n\\nThis issue has been resolved. You can now retrieve SQL_NUMERIC or SQL_DECIMAL values as \\nSQL_C_SBIGINT data. \\n\\nK\",\"tags\":[6],\"created\":\"1972-01-31T06:16:54Z\",\"created_date\":\"1972-01-31\",\"modified\":\"2022-05-16T05:48:28.628441Z\",\"added\":\"2022-03-16T03:49:02.104010Z\",\"archive_serial_number\":null,\"original_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"archived_file_name\":\"1972-01-31 Testing Old Date 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, diff --git a/src-ui/e2e/document-list/requests/api-document-list5.har b/src-ui/e2e/document-list/requests/api-document-list5.har index 8e96ed962..edfde924e 100644 --- a/src-ui/e2e/document-list/requests/api-document-list5.har +++ b/src-ui/e2e/document-list/requests/api-document-list5.har @@ -260,7 +260,7 @@ "time": 0.944, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -320,7 +320,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[5],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9,5],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, diff --git a/src-ui/e2e/document-list/requests/api-document-list6.har b/src-ui/e2e/document-list/requests/api-document-list6.har index 194b2f7b7..5e0125a99 100644 --- a/src-ui/e2e/document-list/requests/api-document-list6.har +++ b/src-ui/e2e/document-list/requests/api-document-list6.har @@ -260,7 +260,7 @@ "time": 0.871, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -320,7 +320,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" + "text": "{\"count\":61,\"next\":\"http://localhost:8000/api/documents/?ordering=-created&page=2&page_size=50&truncate_content=true&include_selection_data=true\",\"previous\":null,\"all\":[310,307,297,298,296,290,277,268,261,260,252,243,223,284,220,204,179,175,196,177,176,7,5,181,205,206,191,227,180,3,224,4,233,312,258,295,236,254,242,278,246,255,232,234,219,250,248,249,247,237,230,238,228,251,244,231,256,225,241,235,259],\"results\":[{\"id\":310,\"correspondent\":3,\"document_type\":1,\"storage_path\":null,\"title\":\"[paperless] test post-owner\",\"content\":\"Medical Teacher\\r\\n\\r\\nISSN: 0142-159X (Print) 1466-187X (Online) Journal homepage: http://www.tandfonline.com/loi/imte20\\r\\n\\r\\nHas the new Kirkpatrick generation built a better\\r\\nhammer for our evaluation toolbox?\\r\\n\\r\\nKatherine A. Moreau\\r\\n\\r\\nTo cite this article: Katherine A. Moreau (2017) Has the new Kirkpatrick generation built\\r\\na better hammer for our evaluation toolbox?, Medical Teacher, 39:9, 999-1001, DOI:\\r\\n10.1080/0142159X.2017.1337874\\r\\n\\r\\nTo link to this article: https://doi.org/10.1080/0142159X.2017.1337874\\r\\n\\r\\nPublished online: 26 Jun 2017.\\r\\n\\r\\nS\",\"tags\":[9,2,20],\"created\":\"2023-03-26T00:00:00Z\",\"created_date\":\"2023-03-26\",\"modified\":\"2023-04-27T21:13:54.604887Z\",\"added\":\"2022-12-14T06:20:26.891909Z\",\"archive_serial_number\":null,\"original_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"archived_file_name\":\"2023-03-26 Corresp Owned by Test [paperless] test post-owner.pdf\",\"owner\":15,\"user_can_change\":false,\"notes\":[]},{\"id\":307,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"tablerates\",\"content\":\"Country,Region/State,\\\"Zip/Postal Code\\\",\\\"Weight (and above)\\\",\\\"Shipping Price\\\"\",\"tags\":[],\"created\":\"2022-12-12T00:00:00Z\",\"created_date\":\"2022-12-12\",\"modified\":\"2023-03-18T20:45:15.922135Z\",\"added\":\"2022-12-12T21:23:06.607087Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-12-12 tablerates.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":34,\"note\":\"Hiya\",\"created\":\"2023-03-18T20:45:15.231332Z\",\"document\":307,\"user\":2}]},{\"id\":297,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"1 Testing New Title Updated 2\",\"content\":\"one,1.0\\nfive,5.0\",\"tags\":[4,9],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-03-18T03:22:11.771968Z\",\"added\":\"2022-10-03T00:53:12.731161Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-03 Correspondent 9 1 Testing New Title Updated 2.txt\",\"archived_file_name\":null,\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":65,\"note\":\"hiya\",\"created\":\"2023-04-29T07:10:13.732931Z\",\"document\":297,\"user\":2}]},{\"id\":298,\"correspondent\":3,\"document_type\":null,\"storage_path\":null,\"title\":\"Sample100.csv\",\"content\":\"Serial Number,Company Name,Employee Markme,Description,Leave\\r\\n9788189999599,TALES OF SHIVA,Mark,mark,0\\r\\n9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0\\r\\n9780198082897,MY KUMAN,Mark,Mark,0\\r\\n9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2\\r\\n9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0\\r\\n9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0\\r\\n9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0\\r\\n9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0\\r\\n9780743234801,THE POWER OF POSITIV\",\"tags\":[9,10,2],\"created\":\"2022-10-03T00:00:00Z\",\"created_date\":\"2022-10-03\",\"modified\":\"2023-05-04T06:35:51.600152Z\",\"added\":\"2022-10-03T06:54:52.615096Z\",\"archive_serial_number\":112412326,\"original_file_name\":\"2022-10-03 Corresp Owned by Test Sample100.csv.csv\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":64,\"note\":\"testing\",\"created\":\"2023-04-29T06:50:02.993401Z\",\"document\":298,\"user\":2}]},{\"id\":296,\"correspondent\":1,\"document_type\":1,\"storage_path\":null,\"title\":\"UM_PPBE_en_v29\",\"content\":\"PowerPanel® Business Edition \\nUser’s Manual \\n\\nRev. 29 \\n\\n2018/04 \\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nELECTRONIC END USER LICENSE AGREEMENT FOR CYBERPOWER POWERPANEL BUSINESS \\n\\nEDITION \\n\\nNOTICE TO USER: \\n\\nTHIS IS A CONTRACT. BY INSTALLING THIS SOFTWARE YOU ACCEPT ALL THE TERMS AND \\n\\nCONDITIONS OF THIS AGREEMENT. The End User License Agreement and copyright of CyberPower \\n\\nPowerPanel® Business Edition product and related explanatory materials (\\\"Software\\\") are owned by Cyber \\n\\nPower Systems (USA), Inc. The term \\\"Software\\\" also shall include any upgrades, modified\",\"tags\":[4,9],\"created\":\"2022-10-02T00:00:00Z\",\"created_date\":\"2022-10-02\",\"modified\":\"2023-05-12T06:11:20.780276Z\",\"added\":\"2022-10-02T07:17:09.462696Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"archived_file_name\":\"2022-10-02 Test Correspondent 1 UM_PPBE_en_v29.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[{\"id\":58,\"note\":\"add another\",\"created\":\"2023-04-29T05:59:04.944315Z\",\"document\":296,\"user\":2},{\"id\":59,\"note\":\"test again\",\"created\":\"2023-04-29T05:59:26.727002Z\",\"document\":296,\"user\":2},{\"id\":67,\"note\":\"This is a new note\",\"created\":\"2023-05-12T16:17:07.202260Z\",\"document\":296,\"user\":2},{\"id\":68,\"note\":\"Testing another note\",\"created\":\"2023-05-12T16:51:30.556198Z\",\"document\":296,\"user\":2}]},{\"id\":290,\"correspondent\":null,\"document_type\":null,\"storage_path\":2,\"title\":\"drylab Test\",\"content\":\"Drylab(cid:78)(cid:101)(cid:119)(cid:115)\\n\\n(cid:102)(cid:111)(cid:114)(cid:32)(cid:105)(cid:110)(cid:118)(cid:101)(cid:115)(cid:116)(cid:111)(cid:114)(cid:115)(cid:32)(cid:38)(cid:32)(cid:102)(cid:114)(cid:105)(cid:101)(cid:110)(cid:100)(cid:115)(cid:32)(cid:225)(cid:32)(cid:77)(cid:97)(cid:121)(cid:32)(cid:50)(cid:48)(cid:49)(cid:55)\\n\\nWelcome to our 昀椀rst newsletter of 2017! It's\\nbeen a while since the last one, and a lot has\\nhappened. We promise to keep them coming\\nevery two months hereafter, and permit\\nourselves to make this one rather long.\",\"tags\":[9],\"created\":\"2022-09-12T00:00:00Z\",\"created_date\":\"2022-09-12\",\"modified\":\"2023-03-31T20:29:00.967776Z\",\"added\":\"2022-09-12T18:50:37.033041Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-09-12 drylab Test.pdf\",\"archived_file_name\":\"2022-09-12 drylab Test.pdf\",\"owner\":2,\"user_can_change\":true,\"notes\":[]},{\"id\":277,\"correspondent\":null,\"document_type\":1,\"storage_path\":2,\"title\":\"InDesign 2022 Scripting Read Me\",\"content\":\"Adobe® InDesign® 2022 Scripting ReadMe\\n\\nThis document contains information about scripting in Adobe InDesign 2022, including:\\n\\n•\\n\\n•\\n\\n•\\n\\n•\\n\\nA summary of the InDesign scripting documentation (see “InDesign Scripting Documentation” on \\npage 1).\\n\\nDirections for running a script (see “Running Scripts” on page 2).\\n\\nA list and brief description of InDesign sample scripts (see “Sample Scripts” on page 2).\\n\\nA list of known issues in InDesign scripting (see “Known Issues Related to InDesign Scripting” on \\npage 9).\\n\\nFor more information on InDesign script\",\"tags\":[4,9,10,14,2,3,5,19],\"created\":\"2022-06-10T00:00:00Z\",\"created_date\":\"2022-06-10\",\"modified\":\"2023-03-04T03:59:21.797338Z\",\"added\":\"2022-06-10T20:11:42.076216Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"archived_file_name\":\"2022-06-10 InDesign 2022 Scripting Read Me.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":30,\"note\":\"One more time\",\"created\":\"2023-03-17T22:02:14.357575Z\",\"document\":277,\"user\":2},{\"id\":31,\"note\":\"We're gonna celebrate\",\"created\":\"2023-03-17T22:02:24.321943Z\",\"document\":277,\"user\":2},{\"id\":32,\"note\":\"And again\",\"created\":\"2023-03-17T22:04:57.074641Z\",\"document\":277,\"user\":2},{\"id\":33,\"note\":\"All good\",\"created\":\"2023-03-17T22:05:01.631415Z\",\"document\":277,\"user\":2},{\"id\":36,\"note\":\"This is a comment with some markdown. Watch this:\\n\\n- [Here's a doc link](http://localhost:4200/documents/278)\",\"created\":\"2023-03-19T06:44:05.380252Z\",\"document\":277,\"user\":2},{\"id\":37,\"note\":\"1. Markdown\\n2. Is cool\\n3. But how important is it?\",\"created\":\"2023-03-19T06:48:14.739706Z\",\"document\":277,\"user\":2}]},{\"id\":268,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2019-08-04 DSA Questionnaire 5-8-19\",\"content\":\"\",\"tags\":[4,5],\"created\":\"2022-04-29T07:00:00Z\",\"created_date\":\"2022-04-29\",\"modified\":\"2022-06-21T17:22:34.753362Z\",\"added\":\"2022-04-29T04:01:09.925272Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-04-29 2019-08-04 DSA Questionnaire 5-8-19.pdf\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":261,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"2sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus \\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie \\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus \\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas. \\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex \\neget ex. Duis dignissim lacus vitae velit laoreet, vi\",\"tags\":[4,5],\"created\":\"2022-03-28T07:00:00Z\",\"created_date\":\"2022-03-28\",\"modified\":\"2022-06-23T14:42:32.862290Z\",\"added\":\"2022-03-29T06:13:00.346932Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"archived_file_name\":\"2022-03-28 2sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":3,\"note\":\"Testing a new comment\",\"created\":\"2022-09-12T15:28:39.485497Z\",\"document\":261,\"user\":2}]},{\"id\":260,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"Sonstige ScanPC2022 03-24_081058\",\"content\":\"This is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a test for the double space character issue \\n\\nThis is a \",\"tags\":[],\"created\":\"2022-03-24T15:19:32Z\",\"created_date\":\"2022-03-24\",\"modified\":\"2022-06-23T14:42:36.111030Z\",\"added\":\"2022-03-24T15:20:10.112852Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"archived_file_name\":\"2022-03-24 Sonstige ScanPC2022 03-24_081058.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":252,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"2011 BP Pie 2\",\"content\":\"Patient BP Distribution 2011\\n\\nIsolated Systolic \\nHypertension, 31, 6% \\n\\nStage 2 \\nHypertension,\\n44, 9% \\n\\nStage 1 Hypertension,\\n65, 13%\\n\\nNormal, 150, 30% \\n\\nPre-hypertension , 212, 42%\",\"tags\":[],\"created\":\"2022-03-15T07:00:00Z\",\"created_date\":\"2022-03-15\",\"modified\":\"2022-08-24T20:55:46.025466Z\",\"added\":\"2022-03-15T07:48:42.746115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"archived_file_name\":\"2022-03-15 Correspondent 2 2011 BP Pie 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":243,\"correspondent\":2,\"document_type\":1,\"storage_path\":5,\"title\":\"French Country Bread Revised.docx\",\"content\":\"French Country Bread\\n\\nFor the Leaven\\n1 heaped tablespoon mature sourdough starter (20-30 grams)\\n100 grams Water (80 degrees),\\n50 grams whole wheat bread flour\\n50 grams white bread flour\\n\\nThe night before you plan to make the dough, place 1-2 tablespoon of the matured\\nstarter in a bowl. Feed with 100 grams flour blend and the 100 grams water. Cover with\\na kitchen towel. Let rest in a cool, dark place for 10-12 hours. To test leaven's readiness,\\ndrop a spoonful into a bowl of room-temperature water. If it sinks, it is not ready and\\nneeds more time t\",\"tags\":[5],\"created\":\"2022-03-13T08:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2022-08-07T02:33:15.003110Z\",\"added\":\"2022-03-13T15:59:33.299799Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 2 French Country Bread Revised.docx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":223,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"Review-of-New-York-Federal-Petitions-article\",\"content\":\"Review of New York Federal Petitions for Confirmation\\nof Arbitral Awards Shows Swift Resolutions and\\n\\nCertainty of Awards\\n\\nBy Tim McCarthy, David Hoffman, and Ryham Ragab\\n\\nIntroduction\\nTo allay any possible concern that American liti-\\ngiousness could make New York a difficult venue for\\nexpeditious confirmation of arbitral awards,' the authors\\nundertook a review of post-award proceedings in the\\nUnited States District Court for the Southern District of\\nNew York, under the auspices of the Arbitration Commit-\\ntee of the New York City Bar Associatio\",\"tags\":[4,10,6,2,15,3,1,18,13],\"created\":\"2022-03-13T00:00:00Z\",\"created_date\":\"2022-03-13\",\"modified\":\"2023-03-04T04:44:05.347425Z\",\"added\":\"2022-03-13T15:53:15.665948Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"archived_file_name\":\"2022-03-13 Correspondent 14 Review-of-New-York-Federal-Petitions-article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":284,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_letter\",\"content\":\"Test Name \\n\\n123-456-7890 \\n\\nJanuary 2, 2022 \\nJuly 14, 1984 \\nApril 22, 2013 \\n\\nTrenz Pruca \\nCompany Name \\n4321 First Street \\nAnytown, State ZIP \\n\\nDear Trenz, \\n\\nHere9s a date: 4/22/2013 \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor incidunt et \\nlabore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in \\nreprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis \\nnostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \\ndol\",\"tags\":[4],\"created\":\"2022-01-02T08:00:00Z\",\"created_date\":\"2022-01-02\",\"modified\":\"2022-08-07T14:47:05.879898Z\",\"added\":\"2022-08-07T14:47:05.640920Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-02 test_letter.pdf\",\"archived_file_name\":\"2022-01-02 test_letter.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":220,\"correspondent\":17,\"document_type\":1,\"storage_path\":5,\"title\":\"ReadMe Test\",\"content\":\"Contact Sheet Demo\\n\\nGiven a set of image files (JPEG, GIF, PNG), this script will open a new Illustrator document and create a \\ncontact sheet with the images laid out in a grid. \\n\\nTo run the script, drag a folder with images onto the script. Select the horizontal and vertical grid \\ndimensions, and the script will do the rest.\",\"tags\":[4],\"created\":\"2022-01-01T16:52:03Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-06-06T16:50:48.298610Z\",\"added\":\"2022-03-13T15:52:27.469883Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"archived_file_name\":\"2022-01-01 Correspondent 14 ReadMe Test.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":204,\"correspondent\":null,\"document_type\":null,\"storage_path\":5,\"title\":\"multi-page-mixedxx\",\"content\":\"This is a multi page document. Page 1.\\n\\nThis is a multi page document. Page 2.\\n\\nThis is a multi page document. Page 3.\\n\\nThis is a multi page document. Page 4.\\n\\nThis is a multi page document. Page 5.\\n\\nThis is a multi page document. Page 6.\",\"tags\":[4],\"created\":\"2022-01-01T08:00:00Z\",\"created_date\":\"2022-01-01\",\"modified\":\"2022-03-11T16:11:09.714031Z\",\"added\":\"2022-02-20T09:35:34.970457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"archived_file_name\":\"2022-01-01 multi-page-mixedxx.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":179,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"simple txt file\",\"content\":\"This is a test file.\",\"tags\":[4],\"created\":\"2021-03-06T22:31:53.716035Z\",\"created_date\":\"2021-03-06\",\"modified\":\"2022-02-17T22:14:18.110787Z\",\"added\":\"2021-03-06T22:31:55.141629Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-03-06 Test Correspondent 1 simple txt file.txt\",\"archived_file_name\":null,\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":175,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"file-sample_150kBs\",\"content\":\"Lorem ipsum\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing\\nelit. Nunc ac faucibus odio.\\n\\nVestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut\\nvarius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum\\ncondimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus\\nconvallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis,\\nvulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus\\nnisl blandit. Integer lacinia ante ac\",\"tags\":[4],\"created\":\"2021-02-15T00:00:00Z\",\"created_date\":\"2021-02-15\",\"modified\":\"2023-02-17T22:25:47.449036Z\",\"added\":\"2021-01-26T22:46:32.447764Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"archived_file_name\":\"2021-02-15 file-sample_150kBs.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":70,\"note\":\"This is a second note\",\"created\":\"2023-05-12T17:04:50.873017Z\",\"document\":175,\"user\":2},{\"id\":71,\"note\":\"And a third\",\"created\":\"2023-05-12T17:04:54.027561Z\",\"document\":175,\"user\":2},{\"id\":72,\"note\":\"One more\",\"created\":\"2023-05-12T17:04:57.581521Z\",\"document\":175,\"user\":2},{\"id\":73,\"note\":\"This is a new note\",\"created\":\"2023-05-14T06:05:17.715744Z\",\"document\":175,\"user\":2}]},{\"id\":196,\"correspondent\":4,\"document_type\":null,\"storage_path\":8,\"title\":\"f_combineds\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et \\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean \\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada \\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus. \\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer \\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non s\",\"tags\":[4,7],\"created\":\"2021-02-07T08:00:00Z\",\"created_date\":\"2021-02-07\",\"modified\":\"2022-02-18T07:49:07.123474Z\",\"added\":\"2021-03-14T15:14:11.879665Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"archived_file_name\":\"2021-02-07 Newest Correspondent f_combineds.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":177,\"correspondent\":null,\"document_type\":null,\"storage_path\":8,\"title\":\"sample-pdf-download-10-mb-longer-title\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4,5],\"created\":\"2021-01-26T22:46:26Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2022-02-18T07:18:15.696906Z\",\"added\":\"2021-01-26T22:47:02.320418Z\",\"archive_serial_number\":112412324,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb-longer-title.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":176,\"correspondent\":null,\"document_type\":2,\"storage_path\":null,\"title\":\"sample-pdf-download-10-mb copy_red\",\"content\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vitae fringilla nunc. Phasellus et\\nnulla ipsum. Vestibulum quis ex lacus. Mauris sit amet mi a lacus interdum accumsan. Aenean\\nfermentum tempus ante sed rutrum. Aenean et magna elementum, suscipit tellus non, malesuada\\nturpis. Ut eleifend urna eget nisl fermentum, consequat ullamcorper ex rhoncus.\\n\\nIn tincidunt elit id dignissim facilisis. Nunc iaculis odio nisl, sit amet sagittis turpis aliquet eu. Integer\\nvestibulum, ipsum vel volutpat varius, augue arcu pulvinar urna, non sceler\",\"tags\":[4],\"created\":\"2021-01-26T00:00:00Z\",\"created_date\":\"2021-01-26\",\"modified\":\"2023-03-16T07:40:27.863487Z\",\"added\":\"2021-01-26T22:46:43.688020Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"archived_file_name\":\"2021-01-26 sample-pdf-download-10-mb copy_red.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":28,\"note\":\"This is one\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":176,\"user\":2}]},{\"id\":7,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-with-images\",\"content\":\"Curabitur bibendum ante urna, sed blandit libero egestas id. Pellentesque rhoncus elit in lacus\\nultrices fringilla. Nam ac metus eu turpis mattis rutrum. Mauris mattis sem ex, facilisis molestie\\nsapien luctus non. Vestibulum tincidunt urna at odio suscipit, vel congue felis cursus. Etiam tellus\\nmagna, egestas ac suscipit in, laoreet quis felis. Proin non orci id dui tincidunt egestas.\\n\\nVestibulum eleifend, ligula a scelerisque vehicula, risus justo ultricies ligula, et interdum lorem ex\\neget ex. Duis dignissim lacus vitae velit laoreet, vitae p\",\"tags\":[4,3],\"created\":\"2021-01-21T03:28:33Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-02-18T06:42:05.282698Z\",\"added\":\"2021-01-21T03:28:54.056068Z\",\"archive_serial_number\":112412322,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-with-images.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":18,\"note\":\"Here's one\",\"created\":\"2023-03-17T04:58:18.085861Z\",\"document\":7,\"user\":2},{\"id\":19,\"note\":\"Adding another\",\"created\":\"2023-03-17T04:58:52.076411Z\",\"document\":7,\"user\":2},{\"id\":26,\"note\":\"Hiya man\",\"created\":\"2023-03-17T05:27:55.315286Z\",\"document\":7,\"user\":2}]},{\"id\":5,\"correspondent\":12,\"document_type\":null,\"storage_path\":5,\"title\":\"sample-pdf-file\",\"content\":\"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been\\nthe industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of\\ntype and scrambled it to make a type specimen book. It has survived not only five centuries, but also\\nthe leap into electronic typesetting, remaining essentially unchanged. It was popularised in the\\n1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with\\ndesktop publishing software like Aldus PageMaker including \",\"tags\":[4,3,1],\"created\":\"2021-01-21T00:00:00Z\",\"created_date\":\"2021-01-21\",\"modified\":\"2022-12-11T01:01:50.525990Z\",\"added\":\"2021-01-21T03:28:38.587225Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"archived_file_name\":\"2021-01-21 Correspondent 9 sample-pdf-file.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":181,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"asample\",\"content\":\"A Simple PDF File \\r\\n\\r\\nThis is a small demonstration .pdf file - \\r\\n\\r\\njust for use in the Virtual Mechanics tutorials. More text. And more \\r\\ntext. And more text. And more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\r\\nmore text. And more text. And more text. And more text. And more text. \\r\\nAnd more text. And more text. \\r\\n\\r\\nAnd more text. And more text. And more text. And more text. And more \\r\\ntext. And more text. And more text.\",\"tags\":[4,1],\"created\":\"2021-01-20T00:00:00Z\",\"created_date\":\"2021-01-20\",\"modified\":\"2022-12-08T10:43:22.071931Z\",\"added\":\"2021-03-14T14:50:24.567268Z\",\"archive_serial_number\":null,\"original_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"archived_file_name\":\"2021-01-20 Correspondent 2 asample.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":205,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 5 10.24.48\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[4,3],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-12T19:38:36.183758Z\",\"added\":\"2022-02-22T09:46:25.736288Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 5 10.24.48.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":206,\"correspondent\":2,\"document_type\":null,\"storage_path\":null,\"title\":\"pdf-sample 210.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,2,1],\"created\":\"2020-12-28T06:23:56Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-05-16T05:46:58.682191Z\",\"added\":\"2022-02-22T09:46:25.737479Z\",\"archive_serial_number\":112412325,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 210.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":191,\"correspondent\":2,\"document_type\":null,\"storage_path\":2,\"title\":\"pdf-sample 1 11.24.48 PM\",\"content\":\"Adobe Acrobat PDF Files\\n\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\nthe application and platform used to create it.\\n\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\nproblems commonly encountered with electronic file sharing.\\n\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\nReader. Recipients of other file formats sometimes can't open files because they\\n\",\"tags\":[4,7,2],\"created\":\"2020-12-28T00:00:00Z\",\"created_date\":\"2020-12-28\",\"modified\":\"2022-12-13T05:39:04.690271Z\",\"added\":\"2021-03-14T14:54:17.851803Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"archived_file_name\":\"2020-12-28 Correspondent 2 pdf-sample 1 11.24.48 PM.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":227,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"USC Fact sheet \",\"content\":\"Accreditation Status Change Toolkit \\n\\n\\nThis fact sheet and frequently asked questions (FAQ) are intended to help our leaders answer questions \\nthey may receive about accreditation status changes. This toolkit is being shared with KSOM chairs, \\nHealth System leadership, faculty council members, faculty and other leaders likely to get questions. \\n\\nThis toolkit is for internal use only and is not to be posted publicly. \\n\\n& What It Means \\n\\no \\n\\n\\n\\n\\n\\n\\n\\n \\n\\n The ACGME has decided to withdraw accreditation of our Cardiovascular Disease (Medicine) \\nWhat\",\"tags\":[4],\"created\":\"2020-06-30T00:00:00Z\",\"created_date\":\"2020-06-30\",\"modified\":\"2022-03-13T15:54:16.009200Z\",\"added\":\"2022-03-13T15:54:15.419431Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"archived_file_name\":\"2020-06-30 USC Fact sheet .pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":180,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"New Title Test 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,1],\"created\":\"2020-05-21T07:00:00Z\",\"created_date\":\"2020-05-21\",\"modified\":\"2022-08-13T14:11:41.449660Z\",\"added\":\"2021-03-14T14:50:18.505435Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"archived_file_name\":\"2020-05-21 Correspondent 2 New Title Test 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":3,\"correspondent\":2,\"document_type\":1,\"storage_path\":null,\"title\":\"sample 2\",\"content\":\"A Simple PDF File \\n\\nThis is a small demonstration .pdf file - \\n\\njust for use in the Virtual Mechanics tutorials. More text. And more \\ntext. And more text. And more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. Boring, zzzzz. And more text. And more text. And \\nmore text. And more text. And more text. And more text. And more text. \\nAnd more text. And more text. \\n\\nAnd more text. And more text. And more text. And more text. And more \\ntext. And more text. And more text. Even more. C\",\"tags\":[4,5],\"created\":\"2020-05-10T20:52:02.204000Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-12-14T08:27:30.532148Z\",\"added\":\"2021-01-20T23:38:34.225574Z\",\"archive_serial_number\":1123,\"original_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"archived_file_name\":\"2020-05-10 Correspondent 2 sample 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[{\"id\":29,\"note\":\"\",\"created\":\"2023-03-17T07:03:50.248390Z\",\"document\":3,\"user\":2}]},{\"id\":224,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"rotated\",\"content\":\"This is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text. This is the text that\\nappears on the first page. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text.\\nThis is the text that appears on the first page. It’s a lot of text. This is the text that appears on the first\\npage. It’s a lot of text. This is the text that appears on the first page. It’s a lot of text\",\"tags\":[],\"created\":\"2020-05-10T16:45:49Z\",\"created_date\":\"2020-05-10\",\"modified\":\"2022-05-22T15:35:49.553530Z\",\"added\":\"2022-03-13T15:53:17.058938Z\",\"archive_serial_number\":null,\"original_file_name\":\"2020-05-10 rotated.pdf\",\"archived_file_name\":\"2020-05-10 rotated.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":4,\"correspondent\":1,\"document_type\":null,\"storage_path\":null,\"title\":\"A Sample PDF 2\",\"content\":\"Lorem Ipsum \\n\\n\\\"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...\\\" \\n\\n\\\"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain...\\\" \\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris vitae erat nibh. Morbi imperdiet \\nscelerisque massa, non ornare turpis elementum consectetur. Praesent laoreet vitae libero eget \\npulvinar. Fusce malesuada massa at tincidunt tincidunt. Orci varius natoque penatibus et magnis dis \\nparturient montes, nascetur r\",\"tags\":[2],\"created\":\"2020-02-03T23:37:58Z\",\"created_date\":\"2020-02-03\",\"modified\":\"2022-06-18T04:15:43.853057Z\",\"added\":\"2021-01-20T23:38:36.441384Z\",\"archive_serial_number\":112412321,\"original_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"archived_file_name\":\"2020-02-03 Test Correspondent 1 A Sample PDF 2.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":233,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"jgme-11-01-15_1\",\"content\":\"TO THE EDITOR\\n\\n‘‘Future-Proofing’’\\nCommunication Skills\\nfor Future Physician\\nLearners\\n\\nI have often cringed at depictions of physicians in\\n\\nthe media. The classic depiction of physicians\\nhas been marked by a detached, cold disregard,\\nand truly awful communication skills. Though much\\nhas changed over the years, this caricature persists\\nwell beyond the era of cigarette-wielding physicians\\ndiagnosing ‘‘hysteria.’’ This pejorative stereotype\\nalways seemed so wrong to me, entirely at odds with\\nthe people with whom I work and know to be warm\\nand thoug\",\"tags\":[],\"created\":\"2018-07-31T07:00:00Z\",\"created_date\":\"2018-07-31\",\"modified\":\"2022-08-07T02:29:02.633532Z\",\"added\":\"2022-03-13T15:56:31.810988Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"archived_file_name\":\"2018-07-31 jgme-11-01-15_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":312,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"[paperless] Owned by Test Not Shared\",\"content\":\"Abstract ID Number: 191092\\r\\nThis Abstract is Best Characterized As: Research Abstract\\r\\nThis Abstract’s Focus is Best Characterized As: Undergraduate Medical Education (UME)\\r\\nMost Appropriate Sub Category: Ultrasound\\r\\n\\r\\nAbstract Title: Medical Students Want More Ultrasound Incorporated Into Their Education\\r\\n\\r\\nAbstract:\\r\\nBackground:\\r\\nUltrasound (US) has become increasingly important in emergency medicine (EM) training, but informal feedback from\\r\\nrotating medical students suggested that many programs have not incorporated US training into their r\",\"tags\":[4,9,2],\"created\":\"2018-07-01T00:00:00Z\",\"created_date\":\"2018-07-01\",\"modified\":\"2023-05-02T07:30:47.939341Z\",\"added\":\"2023-03-01T09:40:10.899460Z\",\"archive_serial_number\":null,\"original_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"archived_file_name\":\"2018-07-01 [paperless] Owned by Test Not Shared.pdf\",\"owner\":15,\"user_can_change\":true,\"notes\":[]},{\"id\":258,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2017.10.20-ICC-NYIAC-MoU\",\"content\":\"MEMORANDUM OF UNDERSTANDING\\nBETWEEN\\nNew York International Arbitration Center\\nAND\\nSICANA, Inc.\\nAND\\nINTERNATIONAL CHAMBER OF COMMERCE\\n\\nThis Memorandum of Understanding (“MOU”) is executed with effect from October 20, 2017,\\n\\nby and\\n\\nbetween New York International Arbitration Center (“ NYIAC “) and SICANA, Inc. (“SICANA”), a DeJaware\\n\\nnonstock corporation and International Chamber of Commerce (“ ICC ”), an association esta\\n\\nblished\\n\\nunder the French law of 1 July 1901 on contract of association, acting on behalf of its working bolly, the\\n\\nInternat\",\"tags\":[],\"created\":\"2017-10-20T00:00:00Z\",\"created_date\":\"2017-10-20\",\"modified\":\"2022-03-15T17:06:34.473466Z\",\"added\":\"2022-03-15T17:06:34.395275Z\",\"archive_serial_number\":null,\"original_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"archived_file_name\":\"2017-10-20 2017.10.20-ICC-NYIAC-MoU.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":295,\"correspondent\":12,\"document_type\":null,\"storage_path\":null,\"title\":\"sample_invoice_pdfa\",\"content\":\"InInvvoicoicee\\n\\nCustomer Name\\nStreet\\nPostcode City\\nCountry\\n\\nInvoice date:\\nInvoice number:\\nPayment due:\\n\\nYesLogic Pty. Ltd.\\n7 / 39 Bouverie St\\nCarlton VIC 3053\\nAustralia\\n\\nwww.yeslogic.com\\nABN 32 101 193 560\\n\\nNov 26, 2016\\n161126\\n30 days after invoice date\\n\\nDescription\\n\\nFrom\\n\\nUntil\\n\\nPrince Upgrades & Support\\n\\nNov 26, 2016\\n\\nNov 26, 2017\\n\\nTotal\\n\\nAmount\\n\\nUSD $950.00\\n\\nUSD $950.00\\n\\nPlease transfer amount to:\\n\\nBank account name:\\nName of Bank:\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank State Branch (BSB):\\nBank account number:\\nBank SWIFT code:\",\"tags\":[4,9],\"created\":\"2016-11-26T00:00:00Z\",\"created_date\":\"2016-11-26\",\"modified\":\"2022-12-14T07:14:09.404545Z\",\"added\":\"2022-09-12T19:09:08.194023Z\",\"archive_serial_number\":null,\"original_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"archived_file_name\":\"2016-11-26 Correspondent 9 sample_invoice_pdfa.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":236,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-7-4-549\",\"content\":\"A Systematic Review and Qualitative Analysis to\\nDetermine Quality Indicators for\\nHealth Professions Education Blogs and Podcasts\\n\\nREVIEWS\\n\\nQuinten S. Paterson\\nBrent Thoma, MD, MA\\nW. Kenneth Milne, MD\\nMichelle Lin, MD\\nTeresa M. Chan, BEd, MD, FRCPC\\n\\nABSTRACT\\n\\nBackground Historically, trainees in undergraduate and graduate health professions education have relied on secondary\\nresources, such as textbooks and lectures, for core learning activities. Recently, blogs and podcasts have entered into mainstream\\nusage, especially for residents and educat\",\"tags\":[],\"created\":\"2015-12-01T00:00:00Z\",\"created_date\":\"2015-12-01\",\"modified\":\"2022-03-13T15:58:36.295789Z\",\"added\":\"2022-03-13T15:58:36.074589Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"archived_file_name\":\"2015-12-01 i1949-8357-7-4-549.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":254,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"501 JGN book Ch4-5 2018\",\"content\":\"Chapter 4 \\nINSTRUCTIONAL STRATEGIES \\n\\nChapter Content \\nSelecting Instructional Strategies \\nTechniques Used in Classroom Settings \\nTechniques Used in Clinical Settings \\nTable Comparing Categories of Competence to Teaching Techniques \\nBibliography \\n\\nSelecting Instructional Strategies \\n\\n\\nInstructional methods or strategies are the tools used to direct the learners' activities toward \\nachieving desired goals and objectives. The success of an instructor in using each tool \\ndepends on how appropriate the tool is for the intended audience and intended\",\"tags\":[8],\"created\":\"2015-10-02T00:00:00Z\",\"created_date\":\"2015-10-02\",\"modified\":\"2022-03-15T07:48:57.018035Z\",\"added\":\"2022-03-15T07:48:55.295562Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"archived_file_name\":\"2015-10-02 501 JGN book Ch4-5 2018.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":242,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Hearing-Checklist-1\",\"content\":\"International Arbitration Pre-Hearing Checklist \\nAníbal Sabater, Chaffetz Lindsey LLP1 \\nJuly 2015 \\n\\n\\n\\n\\nHearing Dates & Location \\n\\n1. On what day is the hearing scheduled to start? \\n\\n2. On what day is the hearing expected to end? \\n\\n3. Are there going to be days “off” between hearing start and end? \\n\\n4. At what time will sessions start and end every day? \\n\\n5. When and for how long are breaks expected to take place during the hearing? \\n\\n6. Are hearing facilities booked with an appropriately sized hearing room? Does this include set-up \\n\\nand break-\",\"tags\":[],\"created\":\"2015-07-01T00:00:00Z\",\"created_date\":\"2015-07-01\",\"modified\":\"2022-03-13T15:59:35.931186Z\",\"added\":\"2022-03-13T15:59:32.142898Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"archived_file_name\":\"2015-07-01 Hearing-Checklist-1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":278,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2015-05-31 i1949-8357-8-2-219\",\"content\":\"EDUCATIONAL INNOVATION\\n\\nApproved Instructional Resources Series: A\\nNational Initiative to Identify Quality Emergency\\nMedicine Blog and Podcast Content for Resident\\nEducation\\n\\nMichelle Lin, MD\\nNikita Joshi, MD\\nAndrew Grock, MD\\nAnand Swaminathan, MD, MPH\\nEric J. Morley, MD, MS\\n\\nABSTRACT\\n\\nJeremy Branzetti, MD\\nTaku Taira, MD\\nFelix Ankel, MD\\nLalena M. Yarris, MD, MCR\\n\\nBackground Emergency medicine (EM) residency programs can provide up to 20% of their planned didactic experiences\\nasynchronously through the Individualized Interactive Instruction (III\",\"tags\":[],\"created\":\"2015-06-01T00:00:00Z\",\"created_date\":\"2015-06-01\",\"modified\":\"2023-05-08T08:35:51.463491Z\",\"added\":\"2022-08-07T04:07:34.590976Z\",\"archive_serial_number\":null,\"original_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"archived_file_name\":\"2015-06-01 2015-05-31 i1949-8357-8-2-219.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":246,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"DRS14program\",\"content\":\"N E W Y O R K S T A T E B A R A S S O C I A T I O N\\n\\nDispute Resolution Section\\nAnnual Meeting\\nThursday, January 30, 2014\\nNew York Hilton Midtown\\n1335 Avenue of the Americas, New York City\\n\\nDRS Executive Committee Meeting\\n8:00 a.m. - 9:00 a.m.\\nMadison, 2nd Floor\\n\\nMCLE Morning Program\\n9:15 a.m. - 12:00 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nMCLE Afternoon Program\\n1:30 p.m. - 4:50 p.m.\\nRendezvous Trianon, 3rd Floor\\n\\nNetworking Luncheon\\n12:00 p.m.\\nDorsey & Whitney LLP, \\n51 West 52nd Street\\n\\nCocktail Reception\\n5:00 p.m. - 7:00 p.m. \\n\\n\\n\\nPaul, Weiss, Ri\",\"tags\":[],\"created\":\"2014-01-30T00:00:00Z\",\"created_date\":\"2014-01-30\",\"modified\":\"2022-03-13T16:00:41.258206Z\",\"added\":\"2022-03-13T16:00:41.171480Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-30 DRS14program.pdf\",\"archived_file_name\":\"2014-01-30 DRS14program.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":255,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"2014 - Hamstra - Acad Med - Reconsidering fide\",\"content\":\"Reconsidering Fidelity in Simulation-Based \\nTraining\\nStanley J. Hamstra, PhD, Ryan Brydges, PhD, Rose Hatala, MD, MSc, \\nBenjamin Zendejas, MD, MSc, and David A. Cook, MD, MHPE\\n\\nPerspective\\n\\nAbstract\\n\\nIn simulation-based health professions \\neducation, the concept of simulator \\nfidelity is usually understood as the \\ndegree to which a simulator looks, \\nfeels, and acts like a human patient. \\nAlthough this can be a useful guide \\nin designing simulators, this definition \\nemphasizes technological advances and \\nphysical resemblance over principles \\nof \",\"tags\":[8],\"created\":\"2014-01-20T00:00:00Z\",\"created_date\":\"2014-01-20\",\"modified\":\"2022-03-15T07:49:19.543577Z\",\"added\":\"2022-03-15T07:49:14.513866Z\",\"archive_serial_number\":null,\"original_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"archived_file_name\":\"2014-01-20 2014 - Hamstra - Acad Med - Reconsidering fide.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":232,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"Litigation-Journal-Article\",\"content\":\"New York\\nA New Home of\\n\\nInternational Arbitration?\\n\\nBRIAN FARKAS AND MARIE CASSARD\\n\\n\\n\\n\\n\\nBrian Farkas is with Goetz Fitzpatrick LLP, and Marie Cassard is an LLM candidate\\n\\nin dispute resolution at Cardozo School of Law. Both are in New York City.\\n\\nParis and London—traditionally the global centers of interna-\\ntional arbitration—should begin to worry. Over the past few\\nyears, New York has undertaken a thoughtful, multifaceted ef-\\nfort to attract more international arbitrations. Collaborative\\nand coincidental initiatives from the private sector, mu\",\"tags\":[],\"created\":\"2013-06-01T00:00:00Z\",\"created_date\":\"2013-06-01\",\"modified\":\"2022-03-13T15:56:14.286468Z\",\"added\":\"2022-03-13T15:56:12.956349Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"archived_file_name\":\"2013-06-01 Litigation-Journal-Article.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":234,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"January-30-press-release\",\"content\":\"FOR IMMEDIATE RELEASE \\n\\n\\n\\n\\n\\nNew York Plans Opening of International Arbitration Center \\nCenter Will Strengthen New York's Role as Premier International Arbitration Site \\n\\n\\nNEW YORK, NY – January 30, 2013 – The New York International Arbitration Center (\\\"NYIAC\\\"), \\nfounded with the support of 33 leading law firms to promote and strengthen the conduct of international \\narbitration in New York, has announced at its launch celebration last week that it will officially open its \\ndoors in late Spring 2013. The Center will enable New York City to enhan\",\"tags\":[],\"created\":\"2013-01-30T00:00:00Z\",\"created_date\":\"2013-01-30\",\"modified\":\"2022-03-13T15:58:07.064428Z\",\"added\":\"2022-03-13T15:58:06.974115Z\",\"archive_serial_number\":null,\"original_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"archived_file_name\":\"2013-01-30 January-30-press-release.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":219,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"test_new_1\",\"content\":\"Adobe Acrobat PDF Files\\r\\n\\r\\nAdobe® Portable Document Format (PDF) is a universal file format that preserves all\\r\\nof the fonts, formatting, colours and graphics of any source document, regardless of\\r\\nthe application and platform used to create it.\\r\\n\\r\\nAdobe PDF is an ideal format for electronic document distribution as it overcomes the\\r\\nproblems commonly encountered with electronic file sharing.\\r\\n\\r\\n• Anyone, anywhere can open a PDF file. All you need is the free Adobe Acrobat\\r\\nReader. Recipients of other file formats sometimes can't open files bec\",\"tags\":[],\"created\":\"2012-11-21T08:00:00Z\",\"created_date\":\"2012-11-21\",\"modified\":\"2022-05-18T10:27:32.623122Z\",\"added\":\"2022-03-11T22:17:10.722995Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-11-21 test_new_1.pdf\",\"archived_file_name\":\"2012-11-21 test_new_1.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":250,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"394_2012_Article_380\",\"content\":\"Eur J Nutr (2012) 51:637–663\\nDOI 10.1007/s00394-012-0380-y\\n\\nR E V I E W\\n\\nCritical review: vegetables and fruit in the prevention of chronic\\ndiseases\\n\\nHeiner Boeing • Angela Bechthold • Achim Bub • Sabine Ellinger •\\nDirk Haller • Anja Kroke • Eva Leschik-Bonnet • Manfred J. Mu¨ ller •\\nHelmut Oberritter • Matthias Schulze • Peter Stehle • Bernhard Watzl\\n\\nReceived: 13 February 2012 / Accepted: 9 May 2012 / Published online: 9 June 2012\\n(cid:2) The Author(s) 2012. This article is published with open access at Springerlink.com\\n\\nAbstract\\nBackground V\",\"tags\":[],\"created\":\"2012-02-13T00:00:00Z\",\"created_date\":\"2012-02-13\",\"modified\":\"2022-03-15T07:47:17.517316Z\",\"added\":\"2022-03-15T07:47:16.764975Z\",\"archive_serial_number\":null,\"original_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"archived_file_name\":\"2012-02-13 394_2012_Article_380.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":248,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"11 Castiglioni fac sucess 2013\",\"content\":\"JGIM\\n\\nPERSPECTIVES\\n\\nSucceeding as a Clinician Educator: Useful Tips\\nand Resources\\n\\nAnalia Castiglioni, MD1, Eva Aagaard, MD2, Abby Spencer, MD, MS3,\\nLaura Nicholson, MD, PhD4,5, Reena Karani, MD6, Carol K. Bates, MD7, Lisa L. Willett, MD8, and\\nShobhina G. Chheda, MD, MPH9\\n1Division of General Internal Medicine( University of Alabama at Birmingham, Birmingham VA Medical Center, Birmingham, AL, USA; 2Division\\nof General Internal Medicine University of Colorado School of Medicine, Aurora, CO, USA; 3Division of General Internal Medicine Temple\\nUniv\",\"tags\":[],\"created\":\"2011-11-26T00:00:00Z\",\"created_date\":\"2011-11-26\",\"modified\":\"2022-03-15T07:44:44.250464Z\",\"added\":\"2022-03-15T07:44:44.042390Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"archived_file_name\":\"2011-11-26 11 Castiglioni fac sucess 2013.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":249,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"38.full\",\"content\":\"Nutrition FYI\\n\\nPreparing to Prescribe Plant-Based Diets for Diabetes \\nPrevention and Treatment\\n\\nCaroline Trapp, MSN, APRN, BC-ADM, CDE, and Susan Levin, MS, RD\\n\\nThe number of people worldwide \\nwith type 2 diabetes is expected \\nto double by 2030.1 In the United \\nStates, diabetes affects ~ 26 \\nmillion people of all ages, about \\none-fourth of whom are not yet \\ndiagnosed.2 Despite the availability \\nof a wide range of pharmacological \\ntreatments and the best efforts of \\ndiabetes educators and other health \\ncare professionals, good control \\nof diabet\",\"tags\":[4],\"created\":\"2011-09-27T00:00:00Z\",\"created_date\":\"2011-09-27\",\"modified\":\"2022-03-15T07:44:56.566398Z\",\"added\":\"2022-03-15T07:44:56.344535Z\",\"archive_serial_number\":null,\"original_file_name\":\"2011-09-27 38.full.pdf\",\"archived_file_name\":\"2011-09-27 38.full.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":247,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"'15 EM Clinics- Crashing PHTN copy\",\"content\":\"M a n a g e m e n t o f C r a s h i n g\\nP a t i e n t s wi t h Pu l m o n a r y\\nH y p e r t e n s i o n\\n\\nJohn C. Greenwood, MD\\n\\na,*, Ryan M. Spangler, MD\\n\\nb\\n\\nKEYWORDS\\n(cid:1) Pulmonary hypertension (cid:1) Right ventricular failure (cid:1) Cardiogenic shock\\n\\nKEY POINTS\\n\\n(cid:1) Management goals for patients with pulmonary hypertension (PH) are to optimize preload\\nand volume status, maintain right ventricular function, prevent right coronary artery mal-\\nperfusion, reduce right ventricular afterload, and reverse the underlying cause whenever\\nposs\",\"tags\":[4],\"created\":\"2010-12-01T00:00:00Z\",\"created_date\":\"2010-12-01\",\"modified\":\"2022-03-15T07:44:35.526159Z\",\"added\":\"2022-03-15T07:44:31.004457Z\",\"archive_serial_number\":null,\"original_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"archived_file_name\":\"2010-12-01 '15 EM Clinics- Crashing PHTN copy.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]},{\"id\":237,\"correspondent\":null,\"document_type\":null,\"storage_path\":null,\"title\":\"i1949-8357-2-2-147\",\"content\":\"E D I T O R I A L\\n\\nBeyond Must: Supporting the Evolving\\nRole of the Designated Institutional Official\\n\\nLisa Bellini, MD\\n\\nDiane Hartmann, MD\\n\\nLawrence Opas, MD\\n\\nWhat Must I Do Today?\\n\\nOur daily schedules often require that we balance our\\nprofessional and personal obligations. Accomplishing the\\ntasks of the day must be done with particular efficiency to\\nensure timely arrival at evening events such as the family meal\\nor an open house at school for one of our children. Barring an\\nunpredictable graduate medical education (GME) crisis (the\\nfrequency \",\"tags\":[4],\"created\":\"2009-09-01T00:00:00Z\",\"created_date\":\"2009-09-01\",\"modified\":\"2022-03-13T15:58:53.272297Z\",\"added\":\"2022-03-13T15:58:51.568000Z\",\"archive_serial_number\":null,\"original_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"archived_file_name\":\"2009-09-01 i1949-8357-2-2-147.pdf\",\"owner\":null,\"user_can_change\":true,\"notes\":[]}]}" }, "headersSize": -1, "bodySize": -1, diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts index 7a2274898..9b6eb11e4 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts +++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts @@ -20,9 +20,9 @@ import { Subject, filter, takeUntil } from 'rxjs' import { NEGATIVE_NULL_FILTER_VALUE } from 'src/app/data/filter-rule-type' import { MatchingModel } from 'src/app/data/matching-model' import { ObjectWithPermissions } from 'src/app/data/object-with-permissions' +import { SelectionDataItem } from 'src/app/data/results' import { FilterPipe } from 'src/app/pipes/filter.pipe' import { HotKeyService } from 'src/app/services/hot-key.service' -import { SelectionDataItem } from 'src/app/services/rest/document.service' import { pngxPopperOptions } from 'src/app/utils/popper-options' import { LoadingComponentWithPermissions } from '../../loading-component/loading.component' import { ClearableBadgeComponent } from '../clearable-badge/clearable-badge.component' diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts index 2cebe47e0..da74da98a 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts @@ -300,7 +300,7 @@ describe('BulkEditorComponent', () => { parameters: { add_tags: [101], remove_tags: [] }, }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -332,7 +332,7 @@ describe('BulkEditorComponent', () => { .expectOne(`${environment.apiBaseUrl}documents/bulk_edit/`) .flush(true) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -423,7 +423,7 @@ describe('BulkEditorComponent', () => { parameters: { correspondent: 101 }, }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -455,7 +455,7 @@ describe('BulkEditorComponent', () => { .expectOne(`${environment.apiBaseUrl}documents/bulk_edit/`) .flush(true) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -521,7 +521,7 @@ describe('BulkEditorComponent', () => { parameters: { document_type: 101 }, }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -553,7 +553,7 @@ describe('BulkEditorComponent', () => { .expectOne(`${environment.apiBaseUrl}documents/bulk_edit/`) .flush(true) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -619,7 +619,7 @@ describe('BulkEditorComponent', () => { parameters: { storage_path: 101 }, }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -651,7 +651,7 @@ describe('BulkEditorComponent', () => { .expectOne(`${environment.apiBaseUrl}documents/bulk_edit/`) .flush(true) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -717,7 +717,7 @@ describe('BulkEditorComponent', () => { parameters: { add_custom_fields: [101], remove_custom_fields: [102] }, }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -749,7 +749,7 @@ describe('BulkEditorComponent', () => { .expectOne(`${environment.apiBaseUrl}documents/bulk_edit/`) .flush(true) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -858,7 +858,7 @@ describe('BulkEditorComponent', () => { documents: [3, 4], }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -951,7 +951,7 @@ describe('BulkEditorComponent', () => { documents: [3, 4], }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -986,7 +986,7 @@ describe('BulkEditorComponent', () => { source_mode: 'latest_version', }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -1027,7 +1027,7 @@ describe('BulkEditorComponent', () => { metadata_document_id: 3, }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -1046,7 +1046,7 @@ describe('BulkEditorComponent', () => { delete_originals: true, }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -1067,7 +1067,7 @@ describe('BulkEditorComponent', () => { archive_fallback: true, }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -1153,7 +1153,7 @@ describe('BulkEditorComponent', () => { }, }) httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` @@ -1460,7 +1460,7 @@ describe('BulkEditorComponent', () => { expect(toastServiceShowInfoSpy).toHaveBeenCalled() expect(listReloadSpy).toHaveBeenCalled() httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) // list reload httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts index c23cd6c5f..b97cc76c4 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -16,6 +16,7 @@ import { first, map, Observable, Subject, switchMap, takeUntil } from 'rxjs' import { ConfirmDialogComponent } from 'src/app/components/common/confirm-dialog/confirm-dialog.component' import { CustomField } from 'src/app/data/custom-field' import { MatchingModel } from 'src/app/data/matching-model' +import { SelectionDataItem } from 'src/app/data/results' import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { DocumentListViewService } from 'src/app/services/document-list-view.service' @@ -32,7 +33,6 @@ import { DocumentBulkEditMethod, DocumentService, MergeDocumentsRequest, - SelectionDataItem, } from 'src/app/services/rest/document.service' import { SavedViewService } from 'src/app/services/rest/saved-view.service' import { ShareLinkBundleService } from 'src/app/services/rest/share-link-bundle.service' diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts index b717c13fc..f7b50181b 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts @@ -76,6 +76,7 @@ import { FILTER_TITLE_CONTENT, NEGATIVE_NULL_FILTER_VALUE, } from 'src/app/data/filter-rule-type' +import { SelectionData, SelectionDataItem } from 'src/app/data/results' import { PermissionAction, PermissionType, @@ -84,11 +85,7 @@ import { import { CorrespondentService } from 'src/app/services/rest/correspondent.service' import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' import { DocumentTypeService } from 'src/app/services/rest/document-type.service' -import { - DocumentService, - SelectionData, - SelectionDataItem, -} from 'src/app/services/rest/document.service' +import { DocumentService } from 'src/app/services/rest/document.service' import { SearchService } from 'src/app/services/rest/search.service' import { StoragePathService } from 'src/app/services/rest/storage-path.service' import { TagService } from 'src/app/services/rest/tag.service' diff --git a/src-ui/src/app/data/results.ts b/src-ui/src/app/data/results.ts index d29a55567..f985ed975 100644 --- a/src-ui/src/app/data/results.ts +++ b/src-ui/src/app/data/results.ts @@ -1,3 +1,5 @@ +import { Document } from './document' + export interface Results { count: number @@ -5,3 +7,20 @@ export interface Results { all: number[] } + +export interface SelectionDataItem { + id: number + document_count: number +} + +export interface SelectionData { + selected_storage_paths: SelectionDataItem[] + selected_correspondents: SelectionDataItem[] + selected_tags: SelectionDataItem[] + selected_document_types: SelectionDataItem[] + selected_custom_fields: SelectionDataItem[] +} + +export interface DocumentResults extends Results { + selection_data?: SelectionData +} diff --git a/src-ui/src/app/services/document-list-view.service.spec.ts b/src-ui/src/app/services/document-list-view.service.spec.ts index da3d06444..2b36fa95f 100644 --- a/src-ui/src/app/services/document-list-view.service.spec.ts +++ b/src-ui/src/app/services/document-list-view.service.spec.ts @@ -127,13 +127,10 @@ describe('DocumentListViewService', () => { expect(documentListViewService.currentPage).toEqual(1) documentListViewService.reload() const req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') req.flush(full_results) - httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/selection_data/` - ) expect(req.request.method).toEqual('GET') expect(documentListViewService.isReloading).toBeFalsy() expect(documentListViewService.activeSavedViewId).toBeNull() @@ -145,12 +142,12 @@ describe('DocumentListViewService', () => { it('should handle error on page request out of range', () => { documentListViewService.currentPage = 50 let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=50&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=50&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') req.flush([], { status: 404, statusText: 'Unexpected error' }) req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') expect(documentListViewService.currentPage).toEqual(1) @@ -167,7 +164,7 @@ describe('DocumentListViewService', () => { ] documentListViewService.setFilterRules(filterRulesAny) let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__in=${tags__id__in}` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__in=${tags__id__in}` ) expect(req.request.method).toEqual('GET') req.flush( @@ -175,13 +172,13 @@ describe('DocumentListViewService', () => { { status: 404, statusText: 'Unexpected error' } ) req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') // reset the list documentListViewService.setFilterRules([]) req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) }) @@ -189,7 +186,7 @@ describe('DocumentListViewService', () => { documentListViewService.currentPage = 1 documentListViewService.sortField = 'custom_field_999' let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-custom_field_999&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-custom_field_999&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') req.flush( @@ -198,7 +195,7 @@ describe('DocumentListViewService', () => { ) // resets itself req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) }) @@ -213,7 +210,7 @@ describe('DocumentListViewService', () => { ] documentListViewService.setFilterRules(filterRulesAny) let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__in=${tags__id__in}` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__in=${tags__id__in}` ) expect(req.request.method).toEqual('GET') req.flush('Generic error', { status: 404, statusText: 'Unexpected error' }) @@ -221,7 +218,7 @@ describe('DocumentListViewService', () => { // reset the list documentListViewService.setFilterRules([]) req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) }) @@ -230,7 +227,7 @@ describe('DocumentListViewService', () => { expect(documentListViewService.sortReverse).toBeTruthy() documentListViewService.setSort('added', false) let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=added&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=added&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') expect(documentListViewService.sortField).toEqual('added') @@ -238,12 +235,12 @@ describe('DocumentListViewService', () => { documentListViewService.sortField = 'created' req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=created&truncate_content=true&include_selection_data=true` ) expect(documentListViewService.sortField).toEqual('created') documentListViewService.sortReverse = true req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') expect(documentListViewService.sortReverse).toBeTruthy() @@ -286,7 +283,7 @@ describe('DocumentListViewService', () => { const req = httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=${page}&page_size=${ documentListViewService.pageSize - }&ordering=${reverse ? '-' : ''}${sort}&truncate_content=true` + }&ordering=${reverse ? '-' : ''}${sort}&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') expect(documentListViewService.currentPage).toEqual(page) @@ -303,7 +300,7 @@ describe('DocumentListViewService', () => { } documentListViewService.loadFromQueryParams(convertToParamMap(params)) let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=${documentListViewService.currentPage}&page_size=${documentListViewService.pageSize}&ordering=-added&truncate_content=true&tags__id__all=${tags__id__all}` + `${environment.apiBaseUrl}documents/?page=${documentListViewService.currentPage}&page_size=${documentListViewService.pageSize}&ordering=-added&truncate_content=true&include_selection_data=true&tags__id__all=${tags__id__all}` ) expect(req.request.method).toEqual('GET') expect(documentListViewService.filterRules).toEqual([ @@ -313,15 +310,12 @@ describe('DocumentListViewService', () => { }, ]) req.flush(full_results) - httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/selection_data/` - ) }) it('should use filter rules to update query params', () => { documentListViewService.setFilterRules(filterRules) const req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=${documentListViewService.currentPage}&page_size=${documentListViewService.pageSize}&ordering=-created&truncate_content=true&tags__id__all=${tags__id__all}` + `${environment.apiBaseUrl}documents/?page=${documentListViewService.currentPage}&page_size=${documentListViewService.pageSize}&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=${tags__id__all}` ) expect(req.request.method).toEqual('GET') }) @@ -330,34 +324,26 @@ describe('DocumentListViewService', () => { documentListViewService.currentPage = 2 let req = httpTestingController.expectOne((request) => request.urlWithParams.startsWith( - `${environment.apiBaseUrl}documents/?page=2&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=2&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) ) expect(req.request.method).toEqual('GET') req.flush(full_results) - req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/selection_data/` - ) - req.flush([]) documentListViewService.setFilterRules(filterRules, true) const filteredReqs = httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=${tags__id__all}` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=${tags__id__all}` ) expect(filteredReqs).toHaveLength(1) filteredReqs[0].flush(full_results) - req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/selection_data/` - ) - req.flush([]) expect(documentListViewService.currentPage).toEqual(1) }) it('should support quick filter', () => { documentListViewService.quickFilter(filterRules) const req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=${documentListViewService.currentPage}&page_size=${documentListViewService.pageSize}&ordering=-created&truncate_content=true&tags__id__all=${tags__id__all}` + `${environment.apiBaseUrl}documents/?page=${documentListViewService.currentPage}&page_size=${documentListViewService.pageSize}&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=${tags__id__all}` ) expect(req.request.method).toEqual('GET') }) @@ -380,21 +366,21 @@ describe('DocumentListViewService', () => { convertToParamMap(params) ) let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=${page}&page_size=${documentListViewService.pageSize}&ordering=-added&truncate_content=true&tags__id__all=${tags__id__all}` + `${environment.apiBaseUrl}documents/?page=${page}&page_size=${documentListViewService.pageSize}&ordering=-added&truncate_content=true&include_selection_data=true&tags__id__all=${tags__id__all}` ) expect(req.request.method).toEqual('GET') // reset the list documentListViewService.currentPage = 1 req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-added&truncate_content=true&tags__id__all=9` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-added&truncate_content=true&include_selection_data=true&tags__id__all=9` ) documentListViewService.setFilterRules([]) req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-added&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-added&truncate_content=true&include_selection_data=true` ) documentListViewService.sortField = 'created' req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) documentListViewService.activateSavedView(null) }) @@ -402,21 +388,18 @@ describe('DocumentListViewService', () => { it('should support navigating next / previous', () => { documentListViewService.setFilterRules([]) let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(documentListViewService.currentPage).toEqual(1) documentListViewService.pageSize = 3 req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=3&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=3&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') req.flush({ count: 3, results: documents.slice(0, 3), }) - httpTestingController - .expectOne(`${environment.apiBaseUrl}documents/selection_data/`) - .flush([]) expect(documentListViewService.hasNext(documents[0].id)).toBeTruthy() expect(documentListViewService.hasPrevious(documents[0].id)).toBeFalsy() documentListViewService.getNext(documents[0].id).subscribe((docId) => { @@ -463,7 +446,7 @@ describe('DocumentListViewService', () => { expect(documentListViewService.currentPage).toEqual(1) documentListViewService.pageSize = 3 httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=3&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=3&ordering=-created&truncate_content=true&include_selection_data=true` ) jest .spyOn(documentListViewService, 'getLastPage') @@ -478,7 +461,7 @@ describe('DocumentListViewService', () => { expect(reloadSpy).toHaveBeenCalled() expect(documentListViewService.currentPage).toEqual(2) const reqs = httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=2&page_size=3&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=2&page_size=3&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(reqs.length).toBeGreaterThan(0) }) @@ -513,11 +496,11 @@ describe('DocumentListViewService', () => { .mockReturnValue(documents) documentListViewService.currentPage = 2 httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=2&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=2&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) documentListViewService.pageSize = 3 httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=2&page_size=3&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=2&page_size=3&ordering=-created&truncate_content=true&include_selection_data=true` ) const reloadSpy = jest.spyOn(documentListViewService, 'reload') documentListViewService.getPrevious(1).subscribe({ @@ -527,7 +510,7 @@ describe('DocumentListViewService', () => { expect(reloadSpy).toHaveBeenCalled() expect(documentListViewService.currentPage).toEqual(1) const reqs = httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=3&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=3&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(reqs.length).toBeGreaterThan(0) }) @@ -540,13 +523,10 @@ describe('DocumentListViewService', () => { it('should support select a document', () => { documentListViewService.reload() const req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') req.flush(full_results) - httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/selection_data/` - ) documentListViewService.toggleSelected(documents[0]) expect(documentListViewService.isSelected(documents[0])).toBeTruthy() documentListViewService.toggleSelected(documents[0]) @@ -568,16 +548,13 @@ describe('DocumentListViewService', () => { it('should support select page', () => { documentListViewService.pageSize = 3 const req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=3&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=3&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') req.flush({ count: 3, results: documents.slice(0, 3), }) - httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/selection_data/` - ) documentListViewService.selectPage() expect(documentListViewService.selected.size).toEqual(3) expect(documentListViewService.isSelected(documents[5])).toBeFalsy() @@ -586,13 +563,10 @@ describe('DocumentListViewService', () => { it('should support select range', () => { documentListViewService.reload() const req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') req.flush(full_results) - httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/selection_data/` - ) documentListViewService.toggleSelected(documents[0]) expect(documentListViewService.isSelected(documents[0])).toBeTruthy() documentListViewService.selectRangeTo(documents[2]) @@ -612,7 +586,7 @@ describe('DocumentListViewService', () => { documentListViewService.setFilterRules(filterRules) httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=9` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=9` ) const reqs = httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id&tags__id__all=9` @@ -628,7 +602,7 @@ describe('DocumentListViewService', () => { const cancelSpy = jest.spyOn(documentListViewService, 'cancelPending') documentListViewService.reload() httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=9` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=9` ) expect(cancelSpy).toHaveBeenCalled() }) @@ -647,7 +621,7 @@ describe('DocumentListViewService', () => { documentListViewService.setFilterRules([]) expect(documentListViewService.sortField).toEqual('created') httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) }) @@ -674,11 +648,11 @@ describe('DocumentListViewService', () => { expect(localStorageSpy).toHaveBeenCalled() // reload triggered httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) documentListViewService.displayFields = null httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(documentListViewService.displayFields).toEqual( DEFAULT_DISPLAY_FIELDS.filter((f) => f.id !== DisplayField.ADDED).map( @@ -718,7 +692,7 @@ describe('DocumentListViewService', () => { it('should generate quick filter URL preserving default state', () => { documentListViewService.reload() httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) const urlTree = documentListViewService.getQuickFilterUrl(filterRules) expect(urlTree).toBeDefined() diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts index f2460add2..86888a088 100644 --- a/src-ui/src/app/services/document-list-view.service.ts +++ b/src-ui/src/app/services/document-list-view.service.ts @@ -1,6 +1,6 @@ import { Injectable, inject } from '@angular/core' import { ParamMap, Router, UrlTree } from '@angular/router' -import { Observable, Subject, first, takeUntil } from 'rxjs' +import { Observable, Subject, takeUntil } from 'rxjs' import { DEFAULT_DISPLAY_FIELDS, DisplayField, @@ -8,6 +8,7 @@ import { Document, } from '../data/document' import { FilterRule } from '../data/filter-rule' +import { DocumentResults, SelectionData } from '../data/results' import { SavedView } from '../data/saved-view' import { DOCUMENT_LIST_SERVICE } from '../data/storage-keys' import { SETTINGS_KEYS } from '../data/ui-settings' @@ -17,7 +18,7 @@ import { isFullTextFilterRule, } from '../utils/filter-rules' import { paramsFromViewState, paramsToViewState } from '../utils/query-params' -import { DocumentService, SelectionData } from './rest/document.service' +import { DocumentService } from './rest/document.service' import { SettingsService } from './settings.service' const LIST_DEFAULT_DISPLAY_FIELDS: DisplayField[] = DEFAULT_DISPLAY_FIELDS.map( @@ -293,27 +294,17 @@ export class DocumentListViewService { activeListViewState.sortField, activeListViewState.sortReverse, activeListViewState.filterRules, - { truncate_content: true } + { truncate_content: true, include_selection_data: true } ) .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe({ next: (result) => { + const resultWithSelectionData = result as DocumentResults this.initialized = true this.isReloading = false activeListViewState.collectionSize = result.count activeListViewState.documents = result.results - - this.documentService - .getSelectionData(result.all) - .pipe(first()) - .subscribe({ - next: (selectionData) => { - this.selectionData = selectionData - }, - error: () => { - this.selectionData = null - }, - }) + this.selectionData = resultWithSelectionData.selection_data ?? null if (updateQueryParams && !this._activeSavedViewId) { let base = ['/documents'] diff --git a/src-ui/src/app/services/rest/document.service.ts b/src-ui/src/app/services/rest/document.service.ts index 971396bac..203b35341 100644 --- a/src-ui/src/app/services/rest/document.service.ts +++ b/src-ui/src/app/services/rest/document.service.ts @@ -12,7 +12,7 @@ import { import { DocumentMetadata } from 'src/app/data/document-metadata' import { DocumentSuggestions } from 'src/app/data/document-suggestions' import { FilterRule } from 'src/app/data/filter-rule' -import { Results } from 'src/app/data/results' +import { Results, SelectionData } from 'src/app/data/results' import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { queryParamsFromFilterRules } from '../../utils/query-params' import { @@ -24,19 +24,6 @@ import { SettingsService } from '../settings.service' import { AbstractPaperlessService } from './abstract-paperless-service' import { CustomFieldsService } from './custom-fields.service' -export interface SelectionDataItem { - id: number - document_count: number -} - -export interface SelectionData { - selected_storage_paths: SelectionDataItem[] - selected_correspondents: SelectionDataItem[] - selected_tags: SelectionDataItem[] - selected_document_types: SelectionDataItem[] - selected_custom_fields: SelectionDataItem[] -} - export enum BulkEditSourceMode { LATEST_VERSION = 'latest_version', EXPLICIT_SELECTION = 'explicit_selection', diff --git a/src/documents/tests/test_api_documents.py b/src/documents/tests/test_api_documents.py index 2dda91e98..538fc6dd3 100644 --- a/src/documents/tests/test_api_documents.py +++ b/src/documents/tests/test_api_documents.py @@ -1144,6 +1144,56 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): self.assertEqual(len(response.data["all"]), 50) self.assertCountEqual(response.data["all"], [d.id for d in docs]) + def test_list_with_include_selection_data(self) -> None: + correspondent = Correspondent.objects.create(name="c1") + doc_type = DocumentType.objects.create(name="dt1") + storage_path = StoragePath.objects.create(name="sp1") + tag = Tag.objects.create(name="tag") + + matching_doc = Document.objects.create( + checksum="A", + correspondent=correspondent, + document_type=doc_type, + storage_path=storage_path, + ) + matching_doc.tags.add(tag) + + non_matching_doc = Document.objects.create(checksum="B") + non_matching_doc.tags.add(Tag.objects.create(name="other")) + + response = self.client.get( + f"/api/documents/?tags__id__in={tag.id}&include_selection_data=true", + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn("selection_data", response.data) + + selected_correspondent = next( + item + for item in response.data["selection_data"]["selected_correspondents"] + if item["id"] == correspondent.id + ) + selected_tag = next( + item + for item in response.data["selection_data"]["selected_tags"] + if item["id"] == tag.id + ) + selected_type = next( + item + for item in response.data["selection_data"]["selected_document_types"] + if item["id"] == doc_type.id + ) + selected_storage_path = next( + item + for item in response.data["selection_data"]["selected_storage_paths"] + if item["id"] == storage_path.id + ) + + self.assertEqual(selected_correspondent["document_count"], 1) + self.assertEqual(selected_tag["document_count"], 1) + self.assertEqual(selected_type["document_count"], 1) + self.assertEqual(selected_storage_path["document_count"], 1) + def test_statistics(self) -> None: doc1 = Document.objects.create( title="none1", diff --git a/src/documents/tests/test_api_search.py b/src/documents/tests/test_api_search.py index 6c2ad1eb8..bd70e60c7 100644 --- a/src/documents/tests/test_api_search.py +++ b/src/documents/tests/test_api_search.py @@ -89,6 +89,46 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): self.assertEqual(len(results), 0) self.assertCountEqual(response.data["all"], []) + def test_search_with_include_selection_data(self) -> None: + correspondent = Correspondent.objects.create(name="c1") + doc_type = DocumentType.objects.create(name="dt1") + storage_path = StoragePath.objects.create(name="sp1") + tag = Tag.objects.create(name="tag") + + matching_doc = Document.objects.create( + title="bank statement", + content="bank content", + checksum="A", + correspondent=correspondent, + document_type=doc_type, + storage_path=storage_path, + ) + matching_doc.tags.add(tag) + + with AsyncWriter(index.open_index()) as writer: + index.update_document(writer, matching_doc) + + response = self.client.get( + "/api/documents/?query=bank&include_selection_data=true", + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn("selection_data", response.data) + + selected_correspondent = next( + item + for item in response.data["selection_data"]["selected_correspondents"] + if item["id"] == correspondent.id + ) + selected_tag = next( + item + for item in response.data["selection_data"]["selected_tags"] + if item["id"] == tag.id + ) + + self.assertEqual(selected_correspondent["document_count"], 1) + self.assertEqual(selected_tag["document_count"], 1) + def test_search_custom_field_ordering(self) -> None: custom_field = CustomField.objects.create( name="Sortable field", diff --git a/src/documents/views.py b/src/documents/views.py index 6c4e52ba9..21ee4dc5e 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -836,6 +836,61 @@ class DocumentViewSet( "custom_field_", ) + def _get_selection_data_for_queryset(self, queryset): + correspondents = Correspondent.objects.annotate( + document_count=Count( + "documents", + filter=Q(documents__in=queryset), + distinct=True, + ), + ) + tags = Tag.objects.annotate( + document_count=Count( + "documents", + filter=Q(documents__in=queryset), + distinct=True, + ), + ) + document_types = DocumentType.objects.annotate( + document_count=Count( + "documents", + filter=Q(documents__in=queryset), + distinct=True, + ), + ) + storage_paths = StoragePath.objects.annotate( + document_count=Count( + "documents", + filter=Q(documents__in=queryset), + distinct=True, + ), + ) + custom_fields = CustomField.objects.annotate( + document_count=Count( + "fields__document", + filter=Q(fields__document__in=queryset), + distinct=True, + ), + ) + + return { + "selected_correspondents": [ + {"id": t.id, "document_count": t.document_count} for t in correspondents + ], + "selected_tags": [ + {"id": t.id, "document_count": t.document_count} for t in tags + ], + "selected_document_types": [ + {"id": t.id, "document_count": t.document_count} for t in document_types + ], + "selected_storage_paths": [ + {"id": t.id, "document_count": t.document_count} for t in storage_paths + ], + "selected_custom_fields": [ + {"id": t.id, "document_count": t.document_count} for t in custom_fields + ], + } + def get_queryset(self): latest_version_content = Subquery( Document.objects.filter(root_document=OuterRef("pk")) @@ -983,6 +1038,25 @@ class DocumentViewSet( return response + def list(self, request, *args, **kwargs): + if not get_boolean( + str(request.query_params.get("include_selection_data", "false")), + ): + return super().list(request, *args, **kwargs) + + queryset = self.filter_queryset(self.get_queryset()) + selection_data = self._get_selection_data_for_queryset(queryset) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.get_serializer(page, many=True) + response = self.get_paginated_response(serializer.data) + response.data["selection_data"] = selection_data + return response + + serializer = self.get_serializer(queryset, many=True) + return Response({"results": serializer.data, "selection_data": selection_data}) + def destroy(self, request, *args, **kwargs): from documents import index @@ -2023,6 +2097,21 @@ class UnifiedSearchViewSet(DocumentViewSet): else None ) + if get_boolean( + str( + request.query_params.get( + "include_selection_data", + "false", + ), + ), + ): + result_ids = response.data.get("all", []) + response.data["selection_data"] = ( + self._get_selection_data_for_queryset( + Document.objects.filter(pk__in=result_ids), + ) + ) + return response except NotFound: raise From 020057e1a403cc6762f0af39db002153904ddb2f Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:40:47 +0000 Subject: [PATCH 081/113] Auto translate strings --- src-ui/messages.xlf | 52 +++++++++++++------------- src/locale/en_US/LC_MESSAGES/django.po | 18 ++++----- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index d324f384f..1db6e0e86 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -1081,7 +1081,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 205 @@ -3029,7 +3029,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 203 + 200 src/app/components/manage/document-attributes/document-attributes.component.ts @@ -7504,7 +7504,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 195 + 192 src/app/data/document.ts @@ -8817,7 +8817,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 200 + 197 src/app/data/document.ts @@ -9020,56 +9020,56 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 195 File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 205 + 202 More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 214 + 211 equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 217 is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 224 + 221 is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 228 + 225 greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 232 + 229 less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 236 + 233 @@ -9078,14 +9078,14 @@ )?.name"/> src/app/components/document-list/filter-editor/filter-editor.component.ts - 277,281 + 274,278 Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 283 + 280 @@ -9094,14 +9094,14 @@ )?.name"/> src/app/components/document-list/filter-editor/filter-editor.component.ts - 289,293 + 286,290 Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 295 + 292 @@ -9110,70 +9110,70 @@ )?.name"/> src/app/components/document-list/filter-editor/filter-editor.component.ts - 301,305 + 298,302 Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 307 + 304 Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311,313 + 308,310 Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 314 Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 321 + 318 Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 324 + 321 ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 327 + 324 Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 330 + 327 Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 333 + 330 Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 336 + 333 diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index b41e8a333..06c56c78c 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-28 20:59+0000\n" +"POT-Creation-Date: 2026-03-30 16:39+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -1300,8 +1300,8 @@ msgid "workflow runs" msgstr "" #: documents/serialisers.py:463 documents/serialisers.py:815 -#: documents/serialisers.py:2501 documents/views.py:1990 -#: documents/views.py:2033 paperless_mail/serialisers.py:143 +#: documents/serialisers.py:2501 documents/views.py:2064 +#: documents/views.py:2122 paperless_mail/serialisers.py:143 msgid "Insufficient permissions." msgstr "" @@ -1341,7 +1341,7 @@ msgstr "" msgid "Duplicate document identifiers are not allowed." msgstr "" -#: documents/serialisers.py:2587 documents/views.py:3605 +#: documents/serialisers.py:2587 documents/views.py:3694 #, python-format msgid "Documents not found: %(ids)s" msgstr "" @@ -1609,24 +1609,24 @@ msgstr "" msgid "Unable to parse URI {value}" msgstr "" -#: documents/views.py:1983 documents/views.py:2030 +#: documents/views.py:2057 documents/views.py:2119 msgid "Invalid more_like_id" msgstr "" -#: documents/views.py:3617 +#: documents/views.py:3706 #, python-format msgid "Insufficient permissions to share document %(id)s." msgstr "" -#: documents/views.py:3660 +#: documents/views.py:3749 msgid "Bundle is already being processed." msgstr "" -#: documents/views.py:3717 +#: documents/views.py:3806 msgid "The share link bundle is still being prepared. Please try again later." msgstr "" -#: documents/views.py:3727 +#: documents/views.py:3816 msgid "The share link bundle is unavailable." msgstr "" From 245514ad10c09c0b19b1fe5fe5d06d0602d83e6b Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 31 Mar 2026 07:55:59 -0700 Subject: [PATCH 082/113] Performance: deprecate and remove usage of `all` in API results (#12309) --- docs/api.md | 3 + .../document-attributes.component.html | 10 +- .../management-list.component.html | 4 +- .../management-list.component.spec.ts | 73 ++++++++++-- .../management-list.component.ts | 53 +++++++-- .../tag-list/tag-list.component.spec.ts | 1 - .../tag-list/tag-list.component.ts | 11 -- src-ui/src/app/data/results.ts | 4 +- .../rest/abstract-name-filter-service.spec.ts | 24 ++++ .../rest/abstract-name-filter-service.ts | 15 ++- src/documents/index.py | 20 ++++ src/documents/serialisers.py | 30 ++++- src/documents/tests/test_api_documents.py | 33 +++++- src/documents/tests/test_api_objects.py | 109 ++++++++++++++++++ src/documents/tests/test_api_search.py | 30 ++++- src/documents/views.py | 57 +++++++-- src/paperless/views.py | 42 ++++--- 17 files changed, 441 insertions(+), 78 deletions(-) diff --git a/docs/api.md b/docs/api.md index bd550c519..21c6b140f 100644 --- a/docs/api.md +++ b/docs/api.md @@ -437,3 +437,6 @@ Initial API version. moved from the bulk edit endpoint to their own individual endpoints. Using these methods via the bulk edit endpoint is still supported for compatibility with versions < 10 until support for API v9 is dropped. +- The `all` parameter of list endpoints is now deprecated and will be removed in a future version. +- The bulk edit objects endpoint now supports `all` and `filters` parameters to avoid having to send + large lists of object IDs for operations affecting many objects. diff --git a/src-ui/src/app/components/manage/document-attributes/document-attributes.component.html b/src-ui/src/app/components/manage/document-attributes/document-attributes.component.html index bee9a29aa..118b61ce3 100644 --- a/src-ui/src/app/components/manage/document-attributes/document-attributes.component.html +++ b/src-ui/src/app/components/manage/document-attributes/document-attributes.component.html @@ -9,8 +9,8 @@
@@ -25,7 +25,7 @@ Select:
- @if (activeManagementList.selectedObjects.size > 0) { + @if (activeManagementList.hasSelection) { @@ -40,11 +40,11 @@
-
@@ -103,13 +103,13 @@ class="btn btn-sm btn-outline-primary" id="dropdownSend" ngbDropdownToggle - [disabled]="disabled || list.selected.size === 0" + [disabled]="disabled || !list.hasSelection || list.allSelected" >
Send
-
@if (emailEnabled) { - } diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts index da74da98a..f283a75f3 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts @@ -13,6 +13,7 @@ import { of, throwError } from 'rxjs' import { Correspondent } from 'src/app/data/correspondent' import { CustomField, CustomFieldDataType } from 'src/app/data/custom-field' import { DocumentType } from 'src/app/data/document-type' +import { FILTER_TITLE } from 'src/app/data/filter-rule-type' import { Results } from 'src/app/data/results' import { StoragePath } from 'src/app/data/storage-path' import { Tag } from 'src/app/data/tag' @@ -273,6 +274,92 @@ describe('BulkEditorComponent', () => { expect(component.customFieldsSelectionModel.selectionSize()).toEqual(1) }) + it('should apply list selection data to tags menu when all filtered documents are selected', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + fixture.detectChanges() + jest + .spyOn(documentListViewService, 'allSelected', 'get') + .mockReturnValue(true) + jest + .spyOn(documentListViewService, 'selectedCount', 'get') + .mockReturnValue(3) + documentListViewService.selectionData = selectionData + const getSelectionDataSpy = jest.spyOn(documentService, 'getSelectionData') + + component.openTagsDropdown() + + expect(getSelectionDataSpy).not.toHaveBeenCalled() + expect(component.tagSelectionModel.selectionSize()).toEqual(1) + }) + + it('should apply list selection data to document types menu when all filtered documents are selected', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + fixture.detectChanges() + jest + .spyOn(documentListViewService, 'allSelected', 'get') + .mockReturnValue(true) + documentListViewService.selectionData = selectionData + const getSelectionDataSpy = jest.spyOn(documentService, 'getSelectionData') + + component.openDocumentTypeDropdown() + + expect(getSelectionDataSpy).not.toHaveBeenCalled() + expect(component.documentTypeDocumentCounts).toEqual( + selectionData.selected_document_types + ) + }) + + it('should apply list selection data to correspondents menu when all filtered documents are selected', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + fixture.detectChanges() + jest + .spyOn(documentListViewService, 'allSelected', 'get') + .mockReturnValue(true) + documentListViewService.selectionData = selectionData + const getSelectionDataSpy = jest.spyOn(documentService, 'getSelectionData') + + component.openCorrespondentDropdown() + + expect(getSelectionDataSpy).not.toHaveBeenCalled() + expect(component.correspondentDocumentCounts).toEqual( + selectionData.selected_correspondents + ) + }) + + it('should apply list selection data to storage paths menu when all filtered documents are selected', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + fixture.detectChanges() + jest + .spyOn(documentListViewService, 'allSelected', 'get') + .mockReturnValue(true) + documentListViewService.selectionData = selectionData + const getSelectionDataSpy = jest.spyOn(documentService, 'getSelectionData') + + component.openStoragePathDropdown() + + expect(getSelectionDataSpy).not.toHaveBeenCalled() + expect(component.storagePathDocumentCounts).toEqual( + selectionData.selected_storage_paths + ) + }) + + it('should apply list selection data to custom fields menu when all filtered documents are selected', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + fixture.detectChanges() + jest + .spyOn(documentListViewService, 'allSelected', 'get') + .mockReturnValue(true) + documentListViewService.selectionData = selectionData + const getSelectionDataSpy = jest.spyOn(documentService, 'getSelectionData') + + component.openCustomFieldsDropdown() + + expect(getSelectionDataSpy).not.toHaveBeenCalled() + expect(component.customFieldDocumentCounts).toEqual( + selectionData.selected_custom_fields + ) + }) + it('should execute modify tags bulk operation', () => { jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) jest @@ -307,6 +394,49 @@ describe('BulkEditorComponent', () => { ) // listAllFilteredIds }) + it('should execute modify tags bulk operation for all filtered documents', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + jest + .spyOn(documentListViewService, 'documents', 'get') + .mockReturnValue([{ id: 3 }, { id: 4 }]) + jest + .spyOn(documentListViewService, 'selected', 'get') + .mockReturnValue(new Set([3, 4])) + jest + .spyOn(documentListViewService, 'allSelected', 'get') + .mockReturnValue(true) + jest + .spyOn(documentListViewService, 'filterRules', 'get') + .mockReturnValue([{ rule_type: FILTER_TITLE, value: 'apple' }]) + jest + .spyOn(documentListViewService, 'selectedCount', 'get') + .mockReturnValue(25) + jest + .spyOn(permissionsService, 'currentUserHasObjectPermissions') + .mockReturnValue(true) + component.showConfirmationDialogs = false + fixture.detectChanges() + + component.setTags({ + itemsToAdd: [{ id: 101 }], + itemsToRemove: [], + }) + + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/bulk_edit/` + ) + req.flush(true) + expect(req.request.body).toEqual({ + all: true, + filters: { title__icontains: 'apple' }, + method: 'modify_tags', + parameters: { add_tags: [101], remove_tags: [] }, + }) + httpTestingController.match( + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` + ) // list reload + }) + it('should execute modify tags bulk operation with confirmation dialog if enabled', () => { let modal: NgbModalRef modalService.activeInstances.subscribe((m) => (modal = m[0])) @@ -1089,22 +1219,39 @@ describe('BulkEditorComponent', () => { component.downloadForm.get('downloadFileTypeArchive').patchValue(true) fixture.detectChanges() let downloadSpy = jest.spyOn(documentService, 'bulkDownload') + downloadSpy.mockReturnValue(of(new Blob())) //archive component.downloadSelected() - expect(downloadSpy).toHaveBeenCalledWith([3, 4], 'archive', false) + expect(downloadSpy).toHaveBeenCalledWith( + { documents: [3, 4] }, + 'archive', + false + ) //originals component.downloadForm.get('downloadFileTypeArchive').patchValue(false) component.downloadForm.get('downloadFileTypeOriginals').patchValue(true) component.downloadSelected() - expect(downloadSpy).toHaveBeenCalledWith([3, 4], 'originals', false) + expect(downloadSpy).toHaveBeenCalledWith( + { documents: [3, 4] }, + 'originals', + false + ) //both component.downloadForm.get('downloadFileTypeArchive').patchValue(true) component.downloadSelected() - expect(downloadSpy).toHaveBeenCalledWith([3, 4], 'both', false) + expect(downloadSpy).toHaveBeenCalledWith( + { documents: [3, 4] }, + 'both', + false + ) //formatting component.downloadForm.get('downloadUseFormatting').patchValue(true) component.downloadSelected() - expect(downloadSpy).toHaveBeenCalledWith([3, 4], 'both', true) + expect(downloadSpy).toHaveBeenCalledWith( + { documents: [3, 4] }, + 'both', + true + ) httpTestingController.match( `${environment.apiBaseUrl}documents/bulk_download/` @@ -1450,6 +1597,7 @@ describe('BulkEditorComponent', () => { expect(modal.componentInstance.customFields.length).toEqual(2) expect(modal.componentInstance.fieldsToAddIds).toEqual([1, 2]) + expect(modal.componentInstance.selection).toEqual({ documents: [3, 4] }) expect(modal.componentInstance.documents).toEqual([3, 4]) modal.componentInstance.failed.emit() diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts index b97cc76c4..a456ec2cb 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -31,6 +31,7 @@ import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service import { DocumentTypeService } from 'src/app/services/rest/document-type.service' import { DocumentBulkEditMethod, + DocumentSelectionQuery, DocumentService, MergeDocumentsRequest, } from 'src/app/services/rest/document.service' @@ -41,6 +42,7 @@ import { TagService } from 'src/app/services/rest/tag.service' import { SettingsService } from 'src/app/services/settings.service' import { ToastService } from 'src/app/services/toast.service' import { flattenTags } from 'src/app/utils/flatten-tags' +import { queryParamsFromFilterRules } from 'src/app/utils/query-params' import { MergeConfirmDialogComponent } from '../../common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component' import { RotateConfirmDialogComponent } from '../../common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component' import { CorrespondentEditDialogComponent } from '../../common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component' @@ -261,17 +263,13 @@ export class BulkEditorComponent modal: NgbModalRef, method: DocumentBulkEditMethod, args: any, - overrideDocumentIDs?: number[] + overrideSelection?: DocumentSelectionQuery ) { if (modal) { modal.componentInstance.buttonsEnabled = false } this.documentService - .bulkEdit( - overrideDocumentIDs ?? Array.from(this.list.selected), - method, - args - ) + .bulkEdit(overrideSelection ?? this.getSelectionQuery(), method, args) .pipe(first()) .subscribe({ next: () => this.handleOperationSuccess(modal), @@ -329,7 +327,7 @@ export class BulkEditorComponent ) { let selectionData = new Map() items.forEach((i) => { - if (i.document_count == this.list.selected.size) { + if (i.document_count == this.list.selectedCount) { selectionData.set(i.id, ToggleableItemState.Selected) } else if (i.document_count > 0) { selectionData.set(i.id, ToggleableItemState.PartiallySelected) @@ -338,7 +336,31 @@ export class BulkEditorComponent selectionModel.init(selectionData) } + private getSelectionQuery(): DocumentSelectionQuery { + if (this.list.allSelected) { + return { + all: true, + filters: queryParamsFromFilterRules(this.list.filterRules), + } + } + + return { + documents: Array.from(this.list.selected), + } + } + + private getSelectionSize(): number { + return this.list.selectedCount + } + openTagsDropdown() { + if (this.list.allSelected) { + const selectionData = this.list.selectionData + this.tagDocumentCounts = selectionData?.selected_tags ?? [] + this.applySelectionData(this.tagDocumentCounts, this.tagSelectionModel) + return + } + this.documentService .getSelectionData(Array.from(this.list.selected)) .pipe(first()) @@ -349,6 +371,17 @@ export class BulkEditorComponent } openDocumentTypeDropdown() { + if (this.list.allSelected) { + const selectionData = this.list.selectionData + this.documentTypeDocumentCounts = + selectionData?.selected_document_types ?? [] + this.applySelectionData( + this.documentTypeDocumentCounts, + this.documentTypeSelectionModel + ) + return + } + this.documentService .getSelectionData(Array.from(this.list.selected)) .pipe(first()) @@ -362,6 +395,17 @@ export class BulkEditorComponent } openCorrespondentDropdown() { + if (this.list.allSelected) { + const selectionData = this.list.selectionData + this.correspondentDocumentCounts = + selectionData?.selected_correspondents ?? [] + this.applySelectionData( + this.correspondentDocumentCounts, + this.correspondentSelectionModel + ) + return + } + this.documentService .getSelectionData(Array.from(this.list.selected)) .pipe(first()) @@ -375,6 +419,17 @@ export class BulkEditorComponent } openStoragePathDropdown() { + if (this.list.allSelected) { + const selectionData = this.list.selectionData + this.storagePathDocumentCounts = + selectionData?.selected_storage_paths ?? [] + this.applySelectionData( + this.storagePathDocumentCounts, + this.storagePathsSelectionModel + ) + return + } + this.documentService .getSelectionData(Array.from(this.list.selected)) .pipe(first()) @@ -388,6 +443,17 @@ export class BulkEditorComponent } openCustomFieldsDropdown() { + if (this.list.allSelected) { + const selectionData = this.list.selectionData + this.customFieldDocumentCounts = + selectionData?.selected_custom_fields ?? [] + this.applySelectionData( + this.customFieldDocumentCounts, + this.customFieldsSelectionModel + ) + return + } + this.documentService .getSelectionData(Array.from(this.list.selected)) .pipe(first()) @@ -437,33 +503,33 @@ export class BulkEditorComponent changedTags.itemsToRemove.length == 0 ) { let tag = changedTags.itemsToAdd[0] - modal.componentInstance.message = $localize`This operation will add the tag "${tag.name}" to ${this.list.selected.size} selected document(s).` + modal.componentInstance.message = $localize`This operation will add the tag "${tag.name}" to ${this.getSelectionSize()} selected document(s).` } else if ( changedTags.itemsToAdd.length > 1 && changedTags.itemsToRemove.length == 0 ) { modal.componentInstance.message = $localize`This operation will add the tags ${this._localizeList( changedTags.itemsToAdd - )} to ${this.list.selected.size} selected document(s).` + )} to ${this.getSelectionSize()} selected document(s).` } else if ( changedTags.itemsToAdd.length == 0 && changedTags.itemsToRemove.length == 1 ) { let tag = changedTags.itemsToRemove[0] - modal.componentInstance.message = $localize`This operation will remove the tag "${tag.name}" from ${this.list.selected.size} selected document(s).` + modal.componentInstance.message = $localize`This operation will remove the tag "${tag.name}" from ${this.getSelectionSize()} selected document(s).` } else if ( changedTags.itemsToAdd.length == 0 && changedTags.itemsToRemove.length > 1 ) { modal.componentInstance.message = $localize`This operation will remove the tags ${this._localizeList( changedTags.itemsToRemove - )} from ${this.list.selected.size} selected document(s).` + )} from ${this.getSelectionSize()} selected document(s).` } else { modal.componentInstance.message = $localize`This operation will add the tags ${this._localizeList( changedTags.itemsToAdd )} and remove the tags ${this._localizeList( changedTags.itemsToRemove - )} on ${this.list.selected.size} selected document(s).` + )} on ${this.getSelectionSize()} selected document(s).` } modal.componentInstance.btnClass = 'btn-warning' @@ -502,9 +568,9 @@ export class BulkEditorComponent }) modal.componentInstance.title = $localize`Confirm correspondent assignment` if (correspondent) { - modal.componentInstance.message = $localize`This operation will assign the correspondent "${correspondent.name}" to ${this.list.selected.size} selected document(s).` + modal.componentInstance.message = $localize`This operation will assign the correspondent "${correspondent.name}" to ${this.getSelectionSize()} selected document(s).` } else { - modal.componentInstance.message = $localize`This operation will remove the correspondent from ${this.list.selected.size} selected document(s).` + modal.componentInstance.message = $localize`This operation will remove the correspondent from ${this.getSelectionSize()} selected document(s).` } modal.componentInstance.btnClass = 'btn-warning' modal.componentInstance.btnCaption = $localize`Confirm` @@ -540,9 +606,9 @@ export class BulkEditorComponent }) modal.componentInstance.title = $localize`Confirm document type assignment` if (documentType) { - modal.componentInstance.message = $localize`This operation will assign the document type "${documentType.name}" to ${this.list.selected.size} selected document(s).` + modal.componentInstance.message = $localize`This operation will assign the document type "${documentType.name}" to ${this.getSelectionSize()} selected document(s).` } else { - modal.componentInstance.message = $localize`This operation will remove the document type from ${this.list.selected.size} selected document(s).` + modal.componentInstance.message = $localize`This operation will remove the document type from ${this.getSelectionSize()} selected document(s).` } modal.componentInstance.btnClass = 'btn-warning' modal.componentInstance.btnCaption = $localize`Confirm` @@ -578,9 +644,9 @@ export class BulkEditorComponent }) modal.componentInstance.title = $localize`Confirm storage path assignment` if (storagePath) { - modal.componentInstance.message = $localize`This operation will assign the storage path "${storagePath.name}" to ${this.list.selected.size} selected document(s).` + modal.componentInstance.message = $localize`This operation will assign the storage path "${storagePath.name}" to ${this.getSelectionSize()} selected document(s).` } else { - modal.componentInstance.message = $localize`This operation will remove the storage path from ${this.list.selected.size} selected document(s).` + modal.componentInstance.message = $localize`This operation will remove the storage path from ${this.getSelectionSize()} selected document(s).` } modal.componentInstance.btnClass = 'btn-warning' modal.componentInstance.btnCaption = $localize`Confirm` @@ -615,33 +681,33 @@ export class BulkEditorComponent changedCustomFields.itemsToRemove.length == 0 ) { let customField = changedCustomFields.itemsToAdd[0] - modal.componentInstance.message = $localize`This operation will assign the custom field "${customField.name}" to ${this.list.selected.size} selected document(s).` + modal.componentInstance.message = $localize`This operation will assign the custom field "${customField.name}" to ${this.getSelectionSize()} selected document(s).` } else if ( changedCustomFields.itemsToAdd.length > 1 && changedCustomFields.itemsToRemove.length == 0 ) { modal.componentInstance.message = $localize`This operation will assign the custom fields ${this._localizeList( changedCustomFields.itemsToAdd - )} to ${this.list.selected.size} selected document(s).` + )} to ${this.getSelectionSize()} selected document(s).` } else if ( changedCustomFields.itemsToAdd.length == 0 && changedCustomFields.itemsToRemove.length == 1 ) { let customField = changedCustomFields.itemsToRemove[0] - modal.componentInstance.message = $localize`This operation will remove the custom field "${customField.name}" from ${this.list.selected.size} selected document(s).` + modal.componentInstance.message = $localize`This operation will remove the custom field "${customField.name}" from ${this.getSelectionSize()} selected document(s).` } else if ( changedCustomFields.itemsToAdd.length == 0 && changedCustomFields.itemsToRemove.length > 1 ) { modal.componentInstance.message = $localize`This operation will remove the custom fields ${this._localizeList( changedCustomFields.itemsToRemove - )} from ${this.list.selected.size} selected document(s).` + )} from ${this.getSelectionSize()} selected document(s).` } else { modal.componentInstance.message = $localize`This operation will assign the custom fields ${this._localizeList( changedCustomFields.itemsToAdd )} and remove the custom fields ${this._localizeList( changedCustomFields.itemsToRemove - )} on ${this.list.selected.size} selected document(s).` + )} on ${this.getSelectionSize()} selected document(s).` } modal.componentInstance.btnClass = 'btn-warning' @@ -779,7 +845,7 @@ export class BulkEditorComponent backdrop: 'static', }) modal.componentInstance.title = $localize`Confirm` - modal.componentInstance.messageBold = $localize`Move ${this.list.selected.size} selected document(s) to the trash?` + modal.componentInstance.messageBold = $localize`Move ${this.getSelectionSize()} selected document(s) to the trash?` modal.componentInstance.message = $localize`Documents can be restored prior to permanent deletion.` modal.componentInstance.btnClass = 'btn-danger' modal.componentInstance.btnCaption = $localize`Move to trash` @@ -789,13 +855,13 @@ export class BulkEditorComponent modal.componentInstance.buttonsEnabled = false this.executeDocumentAction( modal, - this.documentService.deleteDocuments(Array.from(this.list.selected)) + this.documentService.deleteDocuments(this.getSelectionQuery()) ) }) } else { this.executeDocumentAction( null, - this.documentService.deleteDocuments(Array.from(this.list.selected)) + this.documentService.deleteDocuments(this.getSelectionQuery()) ) } } @@ -811,7 +877,7 @@ export class BulkEditorComponent : 'originals' this.documentService .bulkDownload( - Array.from(this.list.selected), + this.getSelectionQuery(), downloadFileType, this.downloadForm.get('downloadUseFormatting').value ) @@ -827,7 +893,7 @@ export class BulkEditorComponent backdrop: 'static', }) modal.componentInstance.title = $localize`Reprocess confirm` - modal.componentInstance.messageBold = $localize`This operation will permanently recreate the archive files for ${this.list.selected.size} selected document(s).` + modal.componentInstance.messageBold = $localize`This operation will permanently recreate the archive files for ${this.getSelectionSize()} selected document(s).` modal.componentInstance.message = $localize`The archive files will be re-generated with the current settings.` modal.componentInstance.btnClass = 'btn-danger' modal.componentInstance.btnCaption = $localize`Proceed` @@ -837,9 +903,7 @@ export class BulkEditorComponent modal.componentInstance.buttonsEnabled = false this.executeDocumentAction( modal, - this.documentService.reprocessDocuments( - Array.from(this.list.selected) - ) + this.documentService.reprocessDocuments(this.getSelectionQuery()) ) }) } @@ -866,7 +930,7 @@ export class BulkEditorComponent }) const rotateDialog = modal.componentInstance as RotateConfirmDialogComponent rotateDialog.title = $localize`Rotate confirm` - rotateDialog.messageBold = $localize`This operation will add rotated versions of the ${this.list.selected.size} document(s).` + rotateDialog.messageBold = $localize`This operation will add rotated versions of the ${this.getSelectionSize()} document(s).` rotateDialog.btnClass = 'btn-danger' rotateDialog.btnCaption = $localize`Proceed` rotateDialog.documentID = Array.from(this.list.selected)[0] @@ -877,7 +941,7 @@ export class BulkEditorComponent this.executeDocumentAction( modal, this.documentService.rotateDocuments( - Array.from(this.list.selected), + this.getSelectionQuery(), rotateDialog.degrees ) ) @@ -890,7 +954,7 @@ export class BulkEditorComponent }) const mergeDialog = modal.componentInstance as MergeConfirmDialogComponent mergeDialog.title = $localize`Merge confirm` - mergeDialog.messageBold = $localize`This operation will merge ${this.list.selected.size} selected documents into a new document.` + mergeDialog.messageBold = $localize`This operation will merge ${this.getSelectionSize()} selected documents into a new document.` mergeDialog.btnCaption = $localize`Proceed` mergeDialog.documentIDs = Array.from(this.list.selected) mergeDialog.confirmClicked @@ -935,7 +999,7 @@ export class BulkEditorComponent (item) => item.id ) - dialog.documents = Array.from(this.list.selected) + dialog.selection = this.getSelectionQuery() dialog.succeeded.subscribe((result) => { this.toastService.showInfo($localize`Custom fields updated.`) this.list.reload() diff --git a/src-ui/src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.spec.ts b/src-ui/src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.spec.ts index 40ec327ba..1e31c0e05 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.spec.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.spec.ts @@ -48,7 +48,7 @@ describe('CustomFieldsBulkEditDialogComponent', () => { .mockReturnValue(of('Success')) const successSpy = jest.spyOn(component.succeeded, 'emit') - component.documents = [1, 2] + component.selection = [1, 2] component.fieldsToAddIds = [1] component.form.controls['1'].setValue('Value 1') component.save() @@ -63,7 +63,7 @@ describe('CustomFieldsBulkEditDialogComponent', () => { .mockReturnValue(throwError(new Error('Error'))) const failSpy = jest.spyOn(component.failed, 'emit') - component.documents = [1, 2] + component.selection = [1, 2] component.fieldsToAddIds = [1] component.form.controls['1'].setValue('Value 1') component.save() diff --git a/src-ui/src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.ts b/src-ui/src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.ts index 8452e5388..7d3878c59 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.ts @@ -17,7 +17,10 @@ import { SelectComponent } from 'src/app/components/common/input/select/select.c import { TextComponent } from 'src/app/components/common/input/text/text.component' import { UrlComponent } from 'src/app/components/common/input/url/url.component' import { CustomField, CustomFieldDataType } from 'src/app/data/custom-field' -import { DocumentService } from 'src/app/services/rest/document.service' +import { + DocumentSelectionQuery, + DocumentService, +} from 'src/app/services/rest/document.service' import { TextAreaComponent } from '../../../common/input/textarea/textarea.component' @Component({ @@ -76,7 +79,11 @@ export class CustomFieldsBulkEditDialogComponent { public form: FormGroup = new FormGroup({}) - public documents: number[] = [] + public selection: DocumentSelectionQuery = { documents: [] } + + public get documents(): number[] { + return this.selection.documents + } initForm() { Object.keys(this.form.controls).forEach((key) => { @@ -91,7 +98,7 @@ export class CustomFieldsBulkEditDialogComponent { public save() { this.documentService - .bulkEdit(this.documents, 'modify_custom_fields', { + .bulkEdit(this.selection, 'modify_custom_fields', { add_custom_fields: this.form.value, remove_custom_fields: this.fieldsToRemoveIds, }) diff --git a/src-ui/src/app/components/document-list/document-list.component.html b/src-ui/src/app/components/document-list/document-list.component.html index 176513663..aadec7d77 100644 --- a/src-ui/src/app/components/document-list/document-list.component.html +++ b/src-ui/src/app/components/document-list/document-list.component.html @@ -2,8 +2,8 @@
@@ -17,7 +17,7 @@ Select:
- @if (list.selected.size > 0) { + @if (list.hasSelection) { @@ -127,11 +127,11 @@
Loading... } - @if (list.selected.size > 0) { - {list.collectionSize, plural, =1 {Selected {{list.selected.size}} of one document} other {Selected {{list.selected.size}} of {{list.collectionSize || 0}} documents}} + @if (list.hasSelection) { + {list.collectionSize, plural, =1 {Selected {{list.selectedCount}} of one document} other {Selected {{list.selectedCount}} of {{list.collectionSize || 0}} documents}} } @if (!list.isReloading) { - @if (list.selected.size === 0) { + @if (!list.hasSelection) { {list.collectionSize, plural, =1 {One document} other {{{list.collectionSize || 0}} documents}} } @if (isFiltered) {  (filtered) @@ -142,7 +142,7 @@ Reset filters } - @if (!list.isReloading && list.selected.size > 0) { + @if (!list.isReloading && list.hasSelection) { diff --git a/src-ui/src/app/components/document-list/document-list.component.spec.ts b/src-ui/src/app/components/document-list/document-list.component.spec.ts index 3ea39ccb0..9ea7f27de 100644 --- a/src-ui/src/app/components/document-list/document-list.component.spec.ts +++ b/src-ui/src/app/components/document-list/document-list.component.spec.ts @@ -388,8 +388,8 @@ describe('DocumentListComponent', () => { it('should support select all, none, page & range', () => { jest.spyOn(documentListService, 'documents', 'get').mockReturnValue(docs) jest - .spyOn(documentService, 'listAllFilteredIds') - .mockReturnValue(of(docs.map((d) => d.id))) + .spyOn(documentListService, 'collectionSize', 'get') + .mockReturnValue(docs.length) fixture.detectChanges() expect(documentListService.selected.size).toEqual(0) const docCards = fixture.debugElement.queryAll( @@ -403,7 +403,8 @@ describe('DocumentListComponent', () => { displayModeButtons[2].triggerEventHandler('click') expect(selectAllSpy).toHaveBeenCalled() fixture.detectChanges() - expect(documentListService.selected.size).toEqual(3) + expect(documentListService.allSelected).toBeTruthy() + expect(documentListService.selectedCount).toEqual(3) docCards.forEach((card) => { expect(card.context.selected).toBeTruthy() }) diff --git a/src-ui/src/app/components/document-list/document-list.component.ts b/src-ui/src/app/components/document-list/document-list.component.ts index 2cd2ccaf3..eb453d4dc 100644 --- a/src-ui/src/app/components/document-list/document-list.component.ts +++ b/src-ui/src/app/components/document-list/document-list.component.ts @@ -240,7 +240,7 @@ export class DocumentListComponent } get isBulkEditing(): boolean { - return this.list.selected.size > 0 + return this.list.hasSelection } toggleDisplayField(field: DisplayField) { @@ -327,7 +327,7 @@ export class DocumentListComponent }) .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { - if (this.list.selected.size > 0) { + if (this.list.hasSelection) { this.list.selectNone() } else if (this.isFiltered) { this.resetFilters() @@ -356,7 +356,7 @@ export class DocumentListComponent .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { if (this.list.documents.length > 0) { - if (this.list.selected.size > 0) { + if (this.list.hasSelection) { this.openDocumentDetail(Array.from(this.list.selected)[0]) } else { this.openDocumentDetail(this.list.documents[0]) diff --git a/src-ui/src/app/services/document-list-view.service.spec.ts b/src-ui/src/app/services/document-list-view.service.spec.ts index 2b36fa95f..30cb8c701 100644 --- a/src-ui/src/app/services/document-list-view.service.spec.ts +++ b/src-ui/src/app/services/document-list-view.service.spec.ts @@ -534,12 +534,16 @@ describe('DocumentListViewService', () => { }) it('should support select all', () => { - documentListViewService.selectAll() - const req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` + documentListViewService.reload() + const reloadReq = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) - expect(req.request.method).toEqual('GET') - req.flush(full_results) + expect(reloadReq.request.method).toEqual('GET') + reloadReq.flush(full_results) + + documentListViewService.selectAll() + expect(documentListViewService.allSelected).toBeTruthy() + expect(documentListViewService.selectedCount).toEqual(documents.length) expect(documentListViewService.selected.size).toEqual(documents.length) expect(documentListViewService.isSelected(documents[0])).toBeTruthy() documentListViewService.selectNone() @@ -575,26 +579,62 @@ describe('DocumentListViewService', () => { expect(documentListViewService.isSelected(documents[3])).toBeTruthy() }) - it('should support selection range reduction', () => { + it('should clear all-selected mode when toggling a single document', () => { + documentListViewService.reload() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` + ) + req.flush(full_results) + documentListViewService.selectAll() + expect(documentListViewService.allSelected).toBeTruthy() + + documentListViewService.toggleSelected(documents[0]) + + expect(documentListViewService.allSelected).toBeFalsy() + expect(documentListViewService.isSelected(documents[0])).toBeFalsy() + }) + + it('should clear all-selected mode when selecting a range', () => { + documentListViewService.reload() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` + ) + req.flush(full_results) + + documentListViewService.selectAll() + documentListViewService.toggleSelected(documents[1]) + documentListViewService.selectAll() + expect(documentListViewService.allSelected).toBeTruthy() + + documentListViewService.selectRangeTo(documents[3]) + + expect(documentListViewService.allSelected).toBeFalsy() + expect(documentListViewService.isSelected(documents[1])).toBeTruthy() + expect(documentListViewService.isSelected(documents[2])).toBeTruthy() + expect(documentListViewService.isSelected(documents[3])).toBeTruthy() + }) + + it('should support selection range reduction', () => { + documentListViewService.reload() let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true` ) expect(req.request.method).toEqual('GET') req.flush(full_results) + + documentListViewService.selectAll() expect(documentListViewService.selected.size).toEqual(6) documentListViewService.setFilterRules(filterRules) - httpTestingController.expectOne( + req = httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&tags__id__all=9` ) - const reqs = httpTestingController.match( - `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id&tags__id__all=9` - ) - reqs[0].flush({ + req.flush({ count: 3, results: documents.slice(0, 3), }) + expect(documentListViewService.allSelected).toBeTruthy() expect(documentListViewService.selected.size).toEqual(3) }) diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts index 86888a088..1d37000bf 100644 --- a/src-ui/src/app/services/document-list-view.service.ts +++ b/src-ui/src/app/services/document-list-view.service.ts @@ -80,6 +80,11 @@ export interface ListViewState { */ selected?: Set + /** + * True if the full filtered result set is selected. + */ + allSelected?: boolean + /** * The page size of the list view. */ @@ -199,6 +204,20 @@ export class DocumentListViewService { sortReverse: true, filterRules: [], selected: new Set(), + allSelected: false, + } + } + + private syncSelectedToCurrentPage() { + if (!this.allSelected) { + return + } + + this.selected.clear() + this.documents?.forEach((doc) => this.selected.add(doc.id)) + + if (!this.collectionSize) { + this.selectNone() } } @@ -305,6 +324,7 @@ export class DocumentListViewService { activeListViewState.collectionSize = result.count activeListViewState.documents = result.results this.selectionData = resultWithSelectionData.selection_data ?? null + this.syncSelectedToCurrentPage() if (updateQueryParams && !this._activeSavedViewId) { let base = ['/documents'] @@ -437,6 +457,20 @@ export class DocumentListViewService { return this.activeListViewState.selected } + get allSelected(): boolean { + return this.activeListViewState.allSelected ?? false + } + + get selectedCount(): number { + return this.allSelected + ? (this.collectionSize ?? this.selected.size) + : this.selected.size + } + + get hasSelection(): boolean { + return this.allSelected || this.selected.size > 0 + } + setSort(field: string, reverse: boolean) { this.activeListViewState.sortField = field this.activeListViewState.sortReverse = reverse @@ -591,11 +625,16 @@ export class DocumentListViewService { } selectNone() { + this.activeListViewState.allSelected = false this.selected.clear() this.rangeSelectionAnchorIndex = this.lastRangeSelectionToIndex = null } reduceSelectionToFilter() { + if (this.allSelected) { + return + } + if (this.selected.size > 0) { this.documentService .listAllFilteredIds(this.filterRules) @@ -610,12 +649,12 @@ export class DocumentListViewService { } selectAll() { - this.documentService - .listAllFilteredIds(this.filterRules) - .subscribe((ids) => ids.forEach((id) => this.selected.add(id))) + this.activeListViewState.allSelected = true + this.syncSelectedToCurrentPage() } selectPage() { + this.activeListViewState.allSelected = false this.selected.clear() this.documents.forEach((doc) => { this.selected.add(doc.id) @@ -623,10 +662,13 @@ export class DocumentListViewService { } isSelected(d: Document) { - return this.selected.has(d.id) + return this.allSelected || this.selected.has(d.id) } toggleSelected(d: Document): void { + if (this.allSelected) { + this.activeListViewState.allSelected = false + } if (this.selected.has(d.id)) this.selected.delete(d.id) else this.selected.add(d.id) this.rangeSelectionAnchorIndex = this.documentIndexInCurrentView(d.id) @@ -634,6 +676,10 @@ export class DocumentListViewService { } selectRangeTo(d: Document) { + if (this.allSelected) { + this.activeListViewState.allSelected = false + } + if (this.rangeSelectionAnchorIndex !== null) { const documentToIndex = this.documentIndexInCurrentView(d.id) const fromIndex = Math.min( diff --git a/src-ui/src/app/services/rest/document.service.spec.ts b/src-ui/src/app/services/rest/document.service.spec.ts index b3a9757ff..711aab743 100644 --- a/src-ui/src/app/services/rest/document.service.spec.ts +++ b/src-ui/src/app/services/rest/document.service.spec.ts @@ -198,7 +198,7 @@ describe(`DocumentService`, () => { const content = 'both' const useFilenameFormatting = false subscription = service - .bulkDownload(ids, content, useFilenameFormatting) + .bulkDownload({ documents: ids }, content, useFilenameFormatting) .subscribe() const req = httpTestingController.expectOne( `${environment.apiBaseUrl}${endpoint}/bulk_download/` @@ -218,7 +218,9 @@ describe(`DocumentService`, () => { add_tags: [15], remove_tags: [6], } - subscription = service.bulkEdit(ids, method, parameters).subscribe() + subscription = service + .bulkEdit({ documents: ids }, method, parameters) + .subscribe() const req = httpTestingController.expectOne( `${environment.apiBaseUrl}${endpoint}/bulk_edit/` ) @@ -230,9 +232,32 @@ describe(`DocumentService`, () => { }) }) + it('should call appropriate api endpoint for bulk edit with all and filters', () => { + const method = 'modify_tags' + const parameters = { + add_tags: [15], + remove_tags: [6], + } + const selection = { + all: true, + filters: { title__icontains: 'apple' }, + } + subscription = service.bulkEdit(selection, method, parameters).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/bulk_edit/` + ) + expect(req.request.method).toEqual('POST') + expect(req.request.body).toEqual({ + all: true, + filters: { title__icontains: 'apple' }, + method, + parameters, + }) + }) + it('should call appropriate api endpoint for delete documents', () => { const ids = [1, 2, 3] - subscription = service.deleteDocuments(ids).subscribe() + subscription = service.deleteDocuments({ documents: ids }).subscribe() const req = httpTestingController.expectOne( `${environment.apiBaseUrl}${endpoint}/delete/` ) @@ -244,7 +269,7 @@ describe(`DocumentService`, () => { it('should call appropriate api endpoint for reprocess documents', () => { const ids = [1, 2, 3] - subscription = service.reprocessDocuments(ids).subscribe() + subscription = service.reprocessDocuments({ documents: ids }).subscribe() const req = httpTestingController.expectOne( `${environment.apiBaseUrl}${endpoint}/reprocess/` ) @@ -256,7 +281,7 @@ describe(`DocumentService`, () => { it('should call appropriate api endpoint for rotate documents', () => { const ids = [1, 2, 3] - subscription = service.rotateDocuments(ids, 90).subscribe() + subscription = service.rotateDocuments({ documents: ids }, 90).subscribe() const req = httpTestingController.expectOne( `${environment.apiBaseUrl}${endpoint}/rotate/` ) diff --git a/src-ui/src/app/services/rest/document.service.ts b/src-ui/src/app/services/rest/document.service.ts index 203b35341..cfee4c405 100644 --- a/src-ui/src/app/services/rest/document.service.ts +++ b/src-ui/src/app/services/rest/document.service.ts @@ -68,6 +68,12 @@ export interface RemovePasswordDocumentsRequest { source_mode?: BulkEditSourceMode } +export interface DocumentSelectionQuery { + documents?: number[] + all?: boolean + filters?: { [key: string]: any } +} + @Injectable({ providedIn: 'root', }) @@ -325,33 +331,37 @@ export class DocumentService extends AbstractPaperlessService { return this.http.get(url.toString()) } - bulkEdit(ids: number[], method: DocumentBulkEditMethod, args: any) { + bulkEdit( + selection: DocumentSelectionQuery, + method: DocumentBulkEditMethod, + args: any + ) { return this.http.post(this.getResourceUrl(null, 'bulk_edit'), { - documents: ids, + ...selection, method: method, parameters: args, }) } - deleteDocuments(ids: number[]) { + deleteDocuments(selection: DocumentSelectionQuery) { return this.http.post(this.getResourceUrl(null, 'delete'), { - documents: ids, + ...selection, }) } - reprocessDocuments(ids: number[]) { + reprocessDocuments(selection: DocumentSelectionQuery) { return this.http.post(this.getResourceUrl(null, 'reprocess'), { - documents: ids, + ...selection, }) } rotateDocuments( - ids: number[], + selection: DocumentSelectionQuery, degrees: number, sourceMode: BulkEditSourceMode = BulkEditSourceMode.LATEST_VERSION ) { return this.http.post(this.getResourceUrl(null, 'rotate'), { - documents: ids, + ...selection, degrees, source_mode: sourceMode, }) @@ -399,14 +409,14 @@ export class DocumentService extends AbstractPaperlessService { } bulkDownload( - ids: number[], + selection: DocumentSelectionQuery, content = 'both', useFilenameFormatting: boolean = false ) { return this.http.post( this.getResourceUrl(null, 'bulk_download'), { - documents: ids, + ...selection, content: content, follow_formatting: useFilenameFormatting, }, diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 8f96f638d..a8beb70c0 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -1558,6 +1558,41 @@ class DocumentListSerializer(serializers.Serializer): return documents +class DocumentSelectionSerializer(DocumentListSerializer): + documents = serializers.ListField( + required=False, + label="Documents", + write_only=True, + child=serializers.IntegerField(), + ) + + all = serializers.BooleanField( + default=False, + required=False, + write_only=True, + ) + + filters = serializers.DictField( + required=False, + allow_empty=True, + write_only=True, + ) + + def validate(self, attrs): + if attrs.get("all", False): + attrs.setdefault("documents", []) + return attrs + + if "documents" not in attrs: + raise serializers.ValidationError( + "documents is required unless all is true.", + ) + + documents = attrs["documents"] + self._validate_document_id_list(documents) + return attrs + + class SourceModeValidationMixin: def validate_source_mode(self, source_mode: str) -> str: if source_mode not in bulk_edit.SourceModeChoices.__dict__.values(): @@ -1565,7 +1600,7 @@ class SourceModeValidationMixin: return source_mode -class RotateDocumentsSerializer(DocumentListSerializer, SourceModeValidationMixin): +class RotateDocumentsSerializer(DocumentSelectionSerializer, SourceModeValidationMixin): degrees = serializers.IntegerField(required=True) source_mode = serializers.CharField( required=False, @@ -1648,17 +1683,17 @@ class RemovePasswordDocumentsSerializer( ) -class DeleteDocumentsSerializer(DocumentListSerializer): +class DeleteDocumentsSerializer(DocumentSelectionSerializer): pass -class ReprocessDocumentsSerializer(DocumentListSerializer): +class ReprocessDocumentsSerializer(DocumentSelectionSerializer): pass class BulkEditSerializer( SerializerWithPerms, - DocumentListSerializer, + DocumentSelectionSerializer, SetPermissionsMixin, SourceModeValidationMixin, ): @@ -1986,6 +2021,19 @@ class BulkEditSerializer( raise serializers.ValidationError("password must be a string") def validate(self, attrs): + attrs = super().validate(attrs) + + if attrs.get("all", False) and attrs["method"] in [ + bulk_edit.merge, + bulk_edit.split, + bulk_edit.delete_pages, + bulk_edit.edit_pdf, + bulk_edit.remove_password, + ]: + raise serializers.ValidationError( + "This method does not support all=true.", + ) + method = attrs["method"] parameters = attrs["parameters"] @@ -2243,7 +2291,7 @@ class DocumentVersionLabelSerializer(serializers.Serializer): return normalized or None -class BulkDownloadSerializer(DocumentListSerializer): +class BulkDownloadSerializer(DocumentSelectionSerializer): content = serializers.ChoiceField( choices=["archive", "originals", "both"], default="archive", diff --git a/src/documents/tests/test_api_bulk_edit.py b/src/documents/tests/test_api_bulk_edit.py index 86ef8bb44..ff780dccd 100644 --- a/src/documents/tests/test_api_bulk_edit.py +++ b/src/documents/tests/test_api_bulk_edit.py @@ -614,6 +614,63 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase): self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(Document.objects.count(), 5) + def test_api_requires_documents_unless_all_is_true(self) -> None: + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "method": "set_storage_path", + "parameters": {"storage_path": self.sp1.id}, + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"documents is required unless all is true", response.content) + + @mock.patch("documents.serialisers.bulk_edit.set_storage_path") + def test_api_bulk_edit_with_all_true_resolves_documents_from_filters( + self, + m, + ) -> None: + self.setup_mock(m, "set_storage_path") + + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "all": True, + "filters": {"title__icontains": "B"}, + "method": "set_storage_path", + "parameters": {"storage_path": self.sp1.id}, + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + m.assert_called_once() + args, kwargs = m.call_args + self.assertEqual(args[0], [self.doc2.id]) + self.assertEqual(kwargs["storage_path"], self.sp1.id) + + def test_api_bulk_edit_with_all_true_rejects_unsupported_methods(self) -> None: + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "all": True, + "method": "merge", + "parameters": {"metadata_document_id": self.doc2.id}, + }, + ), + content_type="application/json", + ) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"This method does not support all=true", response.content) + def test_api_invalid_method(self) -> None: self.assertEqual(Document.objects.count(), 5) response = self.client.post( diff --git a/src/documents/views.py b/src/documents/views.py index 3bcf77430..244e81161 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -2241,7 +2241,36 @@ class SavedViewViewSet(BulkPermissionMixin, PassUserMixin, ModelViewSet): ordering_fields = ("name",) -class DocumentOperationPermissionMixin(PassUserMixin): +class DocumentSelectionMixin: + def _resolve_document_ids( + self, + *, + user: User, + validated_data: dict[str, Any], + permission_codename: str = "view_document", + ) -> list[int]: + if not validated_data.get("all", False): + # if all is not true, just pass through the provided document ids + return validated_data["documents"] + + # otherwise, reconstruct the document list based on the provided filters + filters = validated_data.get("filters") or {} + permitted_documents = get_objects_for_user_owner_aware( + user, + permission_codename, + Document, + ) + return list( + DocumentFilterSet( + data=filters, + queryset=permitted_documents, + ) + .qs.distinct() + .values_list("pk", flat=True), + ) + + +class DocumentOperationPermissionMixin(PassUserMixin, DocumentSelectionMixin): permission_classes = (IsAuthenticated,) parser_classes = (parsers.JSONParser,) METHOD_NAMES_REQUIRING_USER = { @@ -2335,8 +2364,15 @@ class DocumentOperationPermissionMixin(PassUserMixin): validated_data: dict[str, Any], operation_label: str, ): - documents = validated_data["documents"] - parameters = {k: v for k, v in validated_data.items() if k != "documents"} + documents = self._resolve_document_ids( + user=self.request.user, + validated_data=validated_data, + ) + parameters = { + k: v + for k, v in validated_data.items() + if k not in {"documents", "all", "filters"} + } user = self.request.user if method.__name__ in self.METHOD_NAMES_REQUIRING_USER: @@ -2424,7 +2460,10 @@ class BulkEditView(DocumentOperationPermissionMixin): user = self.request.user method = serializer.validated_data.get("method") parameters = serializer.validated_data.get("parameters") - documents = serializer.validated_data.get("documents") + documents = self._resolve_document_ids( + user=user, + validated_data=serializer.validated_data, + ) if method.__name__ in self.METHOD_NAMES_REQUIRING_USER: parameters["user"] = user if not self._has_document_permissions( @@ -3276,7 +3315,7 @@ class StatisticsView(GenericAPIView): ) -class BulkDownloadView(GenericAPIView): +class BulkDownloadView(DocumentSelectionMixin, GenericAPIView): permission_classes = (IsAuthenticated,) serializer_class = BulkDownloadSerializer parser_classes = (parsers.JSONParser,) @@ -3285,7 +3324,10 @@ class BulkDownloadView(GenericAPIView): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) - ids = serializer.validated_data.get("documents") + ids = self._resolve_document_ids( + user=request.user, + validated_data=serializer.validated_data, + ) documents = Document.objects.filter(pk__in=ids) compression = serializer.validated_data.get("compression") content = serializer.validated_data.get("content") From 2aa0c9f0b4337b7e21f36fd2cf68035864c817d1 Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2026 18:25:03 +0000 Subject: [PATCH 086/113] Auto translate strings --- src-ui/messages.xlf | 178 ++++++++++++------------- src/locale/en_US/LC_MESSAGES/django.po | 28 ++-- 2 files changed, 103 insertions(+), 103 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 38fabebe4..1d156d52c 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -1281,7 +1281,7 @@ src/app/components/document-detail/document-detail.component.ts - 1758 + 1760 @@ -2795,19 +2795,19 @@ src/app/components/document-detail/document-detail.component.ts - 1759 + 1761 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 833 + 899 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 871 + 935 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 894 + 958 src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts @@ -3397,27 +3397,27 @@ src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 470 + 536 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 510 + 576 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 548 + 614 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 586 + 652 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 648 + 714 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 781 + 847 @@ -3505,7 +3505,7 @@ src/app/components/document-detail/document-detail.component.ts - 1812 + 1814 @@ -3516,7 +3516,7 @@ src/app/components/document-detail/document-detail.component.ts - 1813 + 1815 @@ -3527,7 +3527,7 @@ src/app/components/document-detail/document-detail.component.ts - 1814 + 1816 @@ -5492,7 +5492,7 @@ src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 785 + 851 @@ -7320,7 +7320,7 @@ src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 415 + 481 this string is used to separate processing, failed and added on the file upload widget @@ -7851,7 +7851,7 @@ src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 783 + 849 @@ -7869,7 +7869,7 @@ src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 829 + 895 @@ -7890,88 +7890,88 @@ Reprocess operation for "" will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1385 + 1387 Error executing operation src/app/components/document-detail/document-detail.component.ts - 1396 + 1398 Error downloading document src/app/components/document-detail/document-detail.component.ts - 1459 + 1461 Page Fit src/app/components/document-detail/document-detail.component.ts - 1539 + 1541 PDF edit operation for "" will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1779 + 1781 Error executing PDF edit operation src/app/components/document-detail/document-detail.component.ts - 1791 + 1793 Please enter the current password before attempting to remove it. src/app/components/document-detail/document-detail.component.ts - 1802 + 1804 Password removal operation for "" will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1836 + 1838 Error executing password removal operation src/app/components/document-detail/document-detail.component.ts - 1850 + 1852 Print failed. src/app/components/document-detail/document-detail.component.ts - 1889 + 1891 Error loading document for printing. src/app/components/document-detail/document-detail.component.ts - 1901 + 1903 An error occurred loading tiff: src/app/components/document-detail/document-detail.component.ts - 1966 + 1968 src/app/components/document-detail/document-detail.component.ts - 1970 + 1972 @@ -8215,25 +8215,25 @@ Error executing bulk operation src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 321 + 319 "" src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 407 + 473 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 413 + 479 "" and "" src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 409 + 475 This is for messages like 'modify "tag1" and "tag2"' @@ -8241,7 +8241,7 @@ and "" src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 417,419 + 483,485 this is for messages like 'modify "tag1", "tag2" and "tag3"' @@ -8249,39 +8249,39 @@ Confirm tags assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 434 + 500 - This operation will add the tag "" to selected document(s). + This operation will add the tag "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 440 + 506 This operation will add the tags to selected document(s). + )"/> to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 445,447 + 511,513 - This operation will remove the tag "" from selected document(s). + This operation will remove the tag "" from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 453 + 519 This operation will remove the tags from selected document(s). + )"/> from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 458,460 + 524,526 @@ -8289,112 +8289,112 @@ changedTags.itemsToAdd )"/> and remove the tags on selected document(s). + )"/> on selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 462,466 + 528,532 Confirm correspondent assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 503 + 569 - This operation will assign the correspondent "" to selected document(s). + This operation will assign the correspondent "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 505 + 571 - This operation will remove the correspondent from selected document(s). + This operation will remove the correspondent from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 507 + 573 Confirm document type assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 541 + 607 - This operation will assign the document type "" to selected document(s). + This operation will assign the document type "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 543 + 609 - This operation will remove the document type from selected document(s). + This operation will remove the document type from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 545 + 611 Confirm storage path assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 579 + 645 - This operation will assign the storage path "" to selected document(s). + This operation will assign the storage path "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 581 + 647 - This operation will remove the storage path from selected document(s). + This operation will remove the storage path from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 583 + 649 Confirm custom field assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 612 + 678 - This operation will assign the custom field "" to selected document(s). + This operation will assign the custom field "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 618 + 684 This operation will assign the custom fields to selected document(s). + )"/> to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 623,625 + 689,691 - This operation will remove the custom field "" from selected document(s). + This operation will remove the custom field "" from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 631 + 697 This operation will remove the custom fields from selected document(s). + )"/> from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 636,638 + 702,704 @@ -8402,94 +8402,94 @@ changedCustomFields.itemsToAdd )"/> and remove the custom fields on selected document(s). + )"/> on selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 640,644 + 706,710 - Move selected document(s) to the trash? + Move selected document(s) to the trash? src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 782 + 848 - This operation will permanently recreate the archive files for selected document(s). + This operation will permanently recreate the archive files for selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 830 + 896 The archive files will be re-generated with the current settings. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 831 + 897 Rotate confirm src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 868 + 932 - This operation will add rotated versions of the document(s). + This operation will add rotated versions of the document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 869 + 933 Merge confirm src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 892 + 956 - This operation will merge selected documents into a new document. + This operation will merge selected documents into a new document. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 893 + 957 Merged document will be queued for consumption. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 916 + 980 Custom fields updated. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 940 + 1004 Error updating custom fields. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 949 + 1013 Share link bundle creation requested. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 989 + 1053 Share link bundle creation is not available yet. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 996 + 1060 diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index ba86015dc..f9bce3a1e 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-31 14:56+0000\n" +"POT-Creation-Date: 2026-03-31 18:24+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -1300,7 +1300,7 @@ msgid "workflow runs" msgstr "" #: documents/serialisers.py:463 documents/serialisers.py:815 -#: documents/serialisers.py:2501 documents/views.py:2066 +#: documents/serialisers.py:2549 documents/views.py:2066 #: documents/views.py:2124 paperless_mail/serialisers.py:143 msgid "Insufficient permissions." msgstr "" @@ -1309,39 +1309,39 @@ msgstr "" msgid "Invalid color." msgstr "" -#: documents/serialisers.py:2124 +#: documents/serialisers.py:2172 #, python-format msgid "File type %(type)s not supported" msgstr "" -#: documents/serialisers.py:2168 +#: documents/serialisers.py:2216 #, python-format msgid "Custom field id must be an integer: %(id)s" msgstr "" -#: documents/serialisers.py:2175 +#: documents/serialisers.py:2223 #, python-format msgid "Custom field with id %(id)s does not exist" msgstr "" -#: documents/serialisers.py:2192 documents/serialisers.py:2202 +#: documents/serialisers.py:2240 documents/serialisers.py:2250 msgid "" "Custom fields must be a list of integers or an object mapping ids to values." msgstr "" -#: documents/serialisers.py:2197 +#: documents/serialisers.py:2245 msgid "Some custom fields don't exist or were specified twice." msgstr "" -#: documents/serialisers.py:2344 +#: documents/serialisers.py:2392 msgid "Invalid variable detected." msgstr "" -#: documents/serialisers.py:2557 +#: documents/serialisers.py:2605 msgid "Duplicate document identifiers are not allowed." msgstr "" -#: documents/serialisers.py:2587 documents/views.py:3696 +#: documents/serialisers.py:2635 documents/views.py:3738 #, python-format msgid "Documents not found: %(ids)s" msgstr "" @@ -1613,20 +1613,20 @@ msgstr "" msgid "Invalid more_like_id" msgstr "" -#: documents/views.py:3708 +#: documents/views.py:3750 #, python-format msgid "Insufficient permissions to share document %(id)s." msgstr "" -#: documents/views.py:3751 +#: documents/views.py:3793 msgid "Bundle is already being processed." msgstr "" -#: documents/views.py:3808 +#: documents/views.py:3850 msgid "The share link bundle is still being prepared. Please try again later." msgstr "" -#: documents/views.py:3818 +#: documents/views.py:3860 msgid "The share link bundle is unavailable." msgstr "" From e827581f2ac5adf305a44f8416ea43b5e2343556 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 20:41:52 -0700 Subject: [PATCH 087/113] Chore(deps-dev): Bump the frontend-eslint-dependencies group (#12493) Bumps the frontend-eslint-dependencies group in /src-ui with 4 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser), [@typescript-eslint/utils](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/utils) and [eslint](https://github.com/eslint/eslint). Updates `@typescript-eslint/eslint-plugin` from 8.57.0 to 8.57.2 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.57.2/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 8.57.0 to 8.57.2 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.57.2/packages/parser) Updates `@typescript-eslint/utils` from 8.57.0 to 8.57.2 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/utils/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.57.2/packages/utils) Updates `eslint` from 10.0.3 to 10.1.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/compare/v10.0.3...v10.1.0) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-version: 8.57.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-eslint-dependencies - dependency-name: "@typescript-eslint/parser" dependency-version: 8.57.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-eslint-dependencies - dependency-name: "@typescript-eslint/utils" dependency-version: 8.57.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-eslint-dependencies - dependency-name: eslint dependency-version: 10.1.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: frontend-eslint-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src-ui/package.json | 8 +- src-ui/pnpm-lock.yaml | 256 ++++++++++++++++++++++-------------------- 2 files changed, 137 insertions(+), 127 deletions(-) diff --git a/src-ui/package.json b/src-ui/package.json index 273a32e04..43299f4e9 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -56,10 +56,10 @@ "@playwright/test": "^1.58.2", "@types/jest": "^30.0.0", "@types/node": "^25.4.0", - "@typescript-eslint/eslint-plugin": "^8.57.0", - "@typescript-eslint/parser": "^8.57.0", - "@typescript-eslint/utils": "^8.57.0", - "eslint": "^10.0.3", + "@typescript-eslint/eslint-plugin": "^8.57.2", + "@typescript-eslint/parser": "^8.57.2", + "@typescript-eslint/utils": "^8.57.2", + "eslint": "^10.1.0", "jest": "30.3.0", "jest-environment-jsdom": "^30.3.0", "jest-junit": "^16.0.0", diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index 4cf6e9b36..2c0ec76d0 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -104,19 +104,19 @@ importers: version: 21.2.2(chokidar@5.0.0) '@angular-eslint/builder': specifier: 21.3.0 - version: 21.3.0(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin': specifier: 21.3.0 - version: 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin-template': specifier: 21.3.0 - version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/schematics': specifier: 21.3.0 - version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/template-parser': specifier: 21.3.0 - version: 21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular/build': specifier: ^21.2.2 version: 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) @@ -139,17 +139,17 @@ importers: specifier: ^25.4.0 version: 25.4.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.57.0 - version: 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.57.2 + version: 8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.57.0 - version: 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.57.2 + version: 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': - specifier: ^8.57.0 - version: 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.57.2 + version: 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) eslint: - specifier: ^10.0.3 - version: 10.0.3(jiti@2.6.1) + specifier: ^10.1.0 + version: 10.1.0(jiti@2.6.1) jest: specifier: 30.3.0 version: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) @@ -3079,63 +3079,63 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.57.0': - resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==} + '@typescript-eslint/eslint-plugin@8.57.2': + resolution: {integrity: sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.57.0 + '@typescript-eslint/parser': ^8.57.2 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.57.0': - resolution: {integrity: sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==} + '@typescript-eslint/parser@8.57.2': + resolution: {integrity: sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.57.0': - resolution: {integrity: sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==} + '@typescript-eslint/project-service@8.57.2': + resolution: {integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.57.0': - resolution: {integrity: sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==} + '@typescript-eslint/scope-manager@8.57.2': + resolution: {integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.57.0': - resolution: {integrity: sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==} + '@typescript-eslint/tsconfig-utils@8.57.2': + resolution: {integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.57.0': - resolution: {integrity: sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==} + '@typescript-eslint/type-utils@8.57.2': + resolution: {integrity: sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.57.0': - resolution: {integrity: sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==} + '@typescript-eslint/types@8.57.2': + resolution: {integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.57.0': - resolution: {integrity: sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==} + '@typescript-eslint/typescript-estree@8.57.2': + resolution: {integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.57.0': - resolution: {integrity: sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==} + '@typescript-eslint/utils@8.57.2': + resolution: {integrity: sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.57.0': - resolution: {integrity: sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==} + '@typescript-eslint/visitor-keys@8.57.2': + resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -3554,14 +3554,14 @@ packages: peerDependencies: '@popperjs/core': ^2.11.8 - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.13: + resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.0.3: + resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} - brace-expansion@5.0.4: - resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -4080,8 +4080,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.0.3: - resolution: {integrity: sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==} + eslint@10.1.0: + resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -5155,8 +5155,8 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} minimatch@3.1.5: @@ -6292,6 +6292,12 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-jest@29.4.6: resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -7179,45 +7185,45 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-devkit/architect': 0.2102.0(chokidar@5.0.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular/cli': 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - chokidar '@angular-eslint/bundled-angular-compiler@21.3.0': {} - '@angular-eslint/eslint-plugin-template@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin-template@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.0 - '@angular-eslint/template-parser': 21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/template-parser': 21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) aria-query: 5.3.2 axobject-query: 4.1.0 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 - '@angular-eslint/eslint-plugin@21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin@21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.0 - '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) - '@angular-eslint/eslint-plugin': 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@angular-eslint/eslint-plugin-template': 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/eslint-plugin': 21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/eslint-plugin-template': 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular/cli': 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) ignore: 7.0.5 semver: 7.7.4 @@ -7230,18 +7236,18 @@ snapshots: - eslint - typescript - '@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.0 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) eslint-scope: 9.1.1 typescript: 5.9.3 - '@angular-eslint/utils@21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/utils@21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.3.0 - '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 '@angular/build@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': @@ -8494,9 +8500,9 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.0.3(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.6.1))': dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -8505,7 +8511,7 @@ snapshots: dependencies: '@eslint/object-schema': 3.0.3 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color @@ -9787,7 +9793,7 @@ snapshots: '@tufjs/models@4.1.0': dependencies: '@tufjs/canonical-json': 2.0.0 - minimatch: 10.2.4 + minimatch: 10.2.5 '@tybys/wasm-util@0.10.1': dependencies: @@ -9943,95 +9949,95 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/type-utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.0 - eslint: 10.0.3(jiti@2.6.1) + '@typescript-eslint/parser': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/type-utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.2 + eslint: 10.1.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.57.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) - '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.57.0': + '@typescript-eslint/scope-manager@8.57.2': dependencies: - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 - '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.57.2(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.57.0': {} + '@typescript-eslint/types@8.57.2': {} - '@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.57.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/project-service': 8.57.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.57.0': + '@typescript-eslint/visitor-keys@8.57.2': dependencies: - '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/types': 8.57.2 eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.0': {} @@ -10496,16 +10502,16 @@ snapshots: dependencies: '@popperjs/core': 2.11.8 - brace-expansion@1.1.12: + brace-expansion@1.1.13: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@2.0.3: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.4: + brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 @@ -11020,9 +11026,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.0.3(jiti@2.6.1): + eslint@10.1.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.3 '@eslint/config-helpers': 0.5.3 @@ -11049,7 +11055,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.4 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -11366,7 +11372,7 @@ snapshots: glob@13.0.6: dependencies: - minimatch: 10.2.4 + minimatch: 10.2.5 minipass: 7.1.3 path-scurry: 2.0.2 @@ -11520,7 +11526,7 @@ snapshots: ignore-walk@8.0.0: dependencies: - minimatch: 10.2.4 + minimatch: 10.2.5 ignore@5.3.2: {} @@ -12427,17 +12433,17 @@ snapshots: minimalistic-assert@1.0.1: {} - minimatch@10.2.4: + minimatch@10.2.5: dependencies: - brace-expansion: 5.0.4 + brace-expansion: 5.0.5 minimatch@3.1.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.13 minimatch@9.0.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.3 minimist@1.2.8: {} @@ -13725,6 +13731,10 @@ snapshots: dependencies: typescript: 5.9.3 + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 From 045afa741986a22b90b02fe082fcb636971847d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 03:49:37 +0000 Subject: [PATCH 088/113] Chore(deps-dev): Bump @types/node from 25.4.0 to 25.5.0 in /src-ui (#12494) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.4.0 to 25.5.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 25.5.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src-ui/package.json | 2 +- src-ui/pnpm-lock.yaml | 344 +++++++++++++++++++++--------------------- 2 files changed, 173 insertions(+), 173 deletions(-) diff --git a/src-ui/package.json b/src-ui/package.json index 43299f4e9..d212b747e 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -55,7 +55,7 @@ "@codecov/webpack-plugin": "^1.9.1", "@playwright/test": "^1.58.2", "@types/jest": "^30.0.0", - "@types/node": "^25.4.0", + "@types/node": "^25.5.0", "@typescript-eslint/eslint-plugin": "^8.57.2", "@typescript-eslint/parser": "^8.57.2", "@typescript-eslint/utils": "^8.57.2", diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index 2c0ec76d0..47a44fd2f 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -92,10 +92,10 @@ importers: devDependencies: '@angular-builders/custom-webpack': specifier: ^21.0.3 - version: 21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + version: 21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-builders/jest': specifier: ^21.0.3 - version: 21.0.3(e6176eac41f0cffc5e05b8a4d945a538) + version: 21.0.3(7998fbf94f98776688371278d7c06a01) '@angular-devkit/core': specifier: ^21.2.2 version: 21.2.2(chokidar@5.0.0) @@ -104,7 +104,7 @@ importers: version: 21.2.2(chokidar@5.0.0) '@angular-eslint/builder': specifier: 21.3.0 - version: 21.3.0(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular/cli@21.2.2(@types/node@25.5.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin': specifier: 21.3.0 version: 21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) @@ -113,16 +113,16 @@ importers: version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/schematics': specifier: 21.3.0 - version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.5.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/template-parser': specifier: 21.3.0 version: 21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular/build': specifier: ^21.2.2 - version: 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + version: 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/cli': specifier: ~21.2.2 - version: 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) + version: 21.2.2(@types/node@25.5.0)(chokidar@5.0.0) '@angular/compiler-cli': specifier: ~21.2.4 version: 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) @@ -136,8 +136,8 @@ importers: specifier: ^30.0.0 version: 30.0.0 '@types/node': - specifier: ^25.4.0 - version: 25.4.0 + specifier: ^25.5.0 + version: 25.5.0 '@typescript-eslint/eslint-plugin': specifier: ^8.57.2 version: 8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) @@ -152,7 +152,7 @@ importers: version: 10.1.0(jiti@2.6.1) jest: specifier: 30.3.0 - version: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + version: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) jest-environment-jsdom: specifier: ^30.3.0 version: 30.3.0(canvas@3.0.0) @@ -161,7 +161,7 @@ importers: version: 16.0.0 jest-preset-angular: specifier: ^16.1.1 - version: 16.1.1(135ea37d5312db3eeddee262c6eb1d13) + version: 16.1.1(1dbd79aa77dc8496f8a6323d321949b2) jest-websocket-mock: specifier: ^2.5.0 version: 2.5.0 @@ -170,7 +170,7 @@ importers: version: 4.3.0(prettier@3.4.2)(typescript@5.9.3) ts-node: specifier: ~10.9.1 - version: 10.9.2(@types/node@25.4.0)(typescript@5.9.3) + version: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -3037,8 +3037,8 @@ packages: '@types/node-forge@1.3.14': resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - '@types/node@25.4.0': - resolution: {integrity: sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==} + '@types/node@25.5.0': + resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} @@ -6933,10 +6933,10 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@angular-builders/common@5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3)': + '@angular-builders/common@5.0.3(@types/node@25.5.0)(chokidar@5.0.0)(typescript@5.9.3)': dependencies: '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - ts-node: 10.9.2(@types/node@25.4.0)(typescript@5.9.3) + ts-node: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) tsconfig-paths: 4.2.0 transitivePeerDependencies: - '@swc/core' @@ -6945,13 +6945,13 @@ snapshots: - chokidar - typescript - '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: - '@angular-builders/common': 5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3) + '@angular-builders/common': 5.0.3(@types/node@25.5.0)(chokidar@5.0.0)(typescript@5.9.3) '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - '@angular/build': 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular/build': 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) lodash: 4.17.23 webpack-merge: 6.0.1 @@ -6998,17 +6998,17 @@ snapshots: - webpack-cli - yaml - '@angular-builders/jest@21.0.3(e6176eac41f0cffc5e05b8a4d945a538)': + '@angular-builders/jest@21.0.3(7998fbf94f98776688371278d7c06a01)': dependencies: - '@angular-builders/common': 5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3) + '@angular-builders/common': 5.0.3(@types/node@25.5.0)(chokidar@5.0.0)(typescript@5.9.3) '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/platform-browser-dynamic': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) - jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) - jest-preset-angular: 16.1.1(135ea37d5312db3eeddee262c6eb1d13) + jest: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) + jest-preset-angular: 16.1.1(1dbd79aa77dc8496f8a6323d321949b2) lodash: 4.17.23 transitivePeerDependencies: - '@angular/platform-browser' @@ -7045,13 +7045,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.3))(webpack@5.104.1(esbuild@0.27.2)) '@angular-devkit/core': 21.1.2(chokidar@5.0.0) - '@angular/build': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular/build': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@babel/core': 7.28.5 '@babel/generator': 7.28.5 @@ -7108,7 +7108,7 @@ snapshots: '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) esbuild: 0.27.2 - jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) jest-environment-jsdom: 30.3.0(canvas@3.0.0) transitivePeerDependencies: - '@angular/compiler' @@ -7185,11 +7185,11 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.5.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-devkit/architect': 0.2102.0(chokidar@5.0.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - '@angular/cli': 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) + '@angular/cli': 21.2.2(@types/node@25.5.0)(chokidar@5.0.0) eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -7218,13 +7218,13 @@ snapshots: ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.5.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) '@angular-eslint/eslint-plugin': 21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin-template': 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@angular/cli': 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) + '@angular/cli': 21.2.2(@types/node@25.5.0)(chokidar@5.0.0) ignore: 7.0.5 semver: 7.7.4 strip-json-comments: 3.1.1 @@ -7250,7 +7250,7 @@ snapshots: eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 - '@angular/build@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular/build@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) @@ -7259,8 +7259,8 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@25.4.0) - '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0)) + '@inquirer/confirm': 5.1.21(@types/node@25.5.0) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.3.0(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0)) beasties: 0.3.5 browserslist: 4.28.1 esbuild: 0.27.2 @@ -7281,7 +7281,7 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.18.2 - vite: 7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) + vite: 7.3.0(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) watchpack: 2.5.0 optionalDependencies: '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) @@ -7303,7 +7303,7 @@ snapshots: - tsx - yaml - '@angular/build@21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular/build@21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.2(chokidar@5.0.0) @@ -7312,8 +7312,8 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@25.4.0) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0)) + '@inquirer/confirm': 5.1.21(@types/node@25.5.0) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0)) beasties: 0.4.1 browserslist: 4.28.1 esbuild: 0.27.3 @@ -7334,7 +7334,7 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.22.0 - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) @@ -7365,13 +7365,13 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0)': + '@angular/cli@21.2.2(@types/node@25.5.0)(chokidar@5.0.0)': dependencies: '@angular-devkit/architect': 0.2102.2(chokidar@5.0.0) '@angular-devkit/core': 21.2.2(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) - '@inquirer/prompts': 7.10.1(@types/node@25.4.0) - '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@25.4.0))(@types/node@25.4.0)(listr2@9.0.5) + '@inquirer/prompts': 7.10.1(@types/node@25.5.0) + '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@25.5.0))(@types/node@25.5.0)(listr2@9.0.5) '@modelcontextprotocol/sdk': 1.26.0(zod@4.3.6) '@schematics/angular': 21.2.2(chokidar@5.0.0) '@yarnpkg/lockfile': 1.1.0 @@ -8556,128 +8556,128 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@25.4.0)': + '@inquirer/checkbox@4.3.2(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/core': 10.3.2(@types/node@25.5.0) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/confirm@5.1.21(@types/node@25.4.0)': + '@inquirer/confirm@5.1.21(@types/node@25.5.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.4.0) - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/core@10.3.2(@types/node@25.4.0)': + '@inquirer/core@10.3.2(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/editor@4.2.23(@types/node@25.4.0)': + '@inquirer/editor@4.2.23(@types/node@25.5.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.4.0) - '@inquirer/external-editor': 1.0.3(@types/node@25.4.0) - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/external-editor': 1.0.3(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/expand@4.0.23(@types/node@25.4.0)': + '@inquirer/expand@4.0.23(@types/node@25.5.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.4.0) - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/external-editor@1.0.3(@types/node@25.4.0)': + '@inquirer/external-editor@1.0.3(@types/node@25.5.0)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.3.1(@types/node@25.4.0)': + '@inquirer/input@4.3.1(@types/node@25.5.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.4.0) - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/number@3.0.23(@types/node@25.4.0)': + '@inquirer/number@3.0.23(@types/node@25.5.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.4.0) - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/password@4.0.23(@types/node@25.4.0)': + '@inquirer/password@4.0.23(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.4.0) - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/prompts@7.10.1(@types/node@25.4.0)': + '@inquirer/prompts@7.10.1(@types/node@25.5.0)': dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@25.4.0) - '@inquirer/confirm': 5.1.21(@types/node@25.4.0) - '@inquirer/editor': 4.2.23(@types/node@25.4.0) - '@inquirer/expand': 4.0.23(@types/node@25.4.0) - '@inquirer/input': 4.3.1(@types/node@25.4.0) - '@inquirer/number': 3.0.23(@types/node@25.4.0) - '@inquirer/password': 4.0.23(@types/node@25.4.0) - '@inquirer/rawlist': 4.1.11(@types/node@25.4.0) - '@inquirer/search': 3.2.2(@types/node@25.4.0) - '@inquirer/select': 4.4.2(@types/node@25.4.0) + '@inquirer/checkbox': 4.3.2(@types/node@25.5.0) + '@inquirer/confirm': 5.1.21(@types/node@25.5.0) + '@inquirer/editor': 4.2.23(@types/node@25.5.0) + '@inquirer/expand': 4.0.23(@types/node@25.5.0) + '@inquirer/input': 4.3.1(@types/node@25.5.0) + '@inquirer/number': 3.0.23(@types/node@25.5.0) + '@inquirer/password': 4.0.23(@types/node@25.5.0) + '@inquirer/rawlist': 4.1.11(@types/node@25.5.0) + '@inquirer/search': 3.2.2(@types/node@25.5.0) + '@inquirer/select': 4.4.2(@types/node@25.5.0) optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/rawlist@4.1.11(@types/node@25.4.0)': + '@inquirer/rawlist@4.1.11(@types/node@25.5.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.4.0) - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/search@3.2.2(@types/node@25.4.0)': + '@inquirer/search@3.2.2(@types/node@25.5.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/core': 10.3.2(@types/node@25.5.0) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/select@4.4.2(@types/node@25.4.0)': + '@inquirer/select@4.4.2(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/core': 10.3.2(@types/node@25.5.0) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@inquirer/type@3.0.10(@types/node@25.4.0)': + '@inquirer/type@3.0.10(@types/node@25.5.0)': optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@isaacs/cliui@8.0.2': dependencies: @@ -8705,13 +8705,13 @@ snapshots: '@jest/console@30.3.0': dependencies: '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 chalk: 4.1.2 jest-message-util: 30.3.0 jest-util: 30.3.0 slash: 3.0.0 - '@jest/core@30.3.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3))': + '@jest/core@30.3.0(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3))': dependencies: '@jest/console': 30.3.0 '@jest/pattern': 30.0.1 @@ -8719,14 +8719,14 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.4.0 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.3.0 - jest-config: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-config: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) jest-haste-map: 30.3.0 jest-message-util: 30.3.0 jest-regex-util: 30.0.1 @@ -8756,7 +8756,7 @@ snapshots: '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 '@types/jsdom': 21.1.7 - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-mock: 30.2.0 jest-util: 30.2.0 jsdom: 26.1.0(canvas@3.0.0) @@ -8769,7 +8769,7 @@ snapshots: '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 '@types/jsdom': 21.1.7 - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-mock: 30.3.0 jest-util: 30.3.0 jsdom: 26.1.0(canvas@3.0.0) @@ -8780,14 +8780,14 @@ snapshots: dependencies: '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-mock: 30.2.0 '@jest/environment@30.3.0': dependencies: '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-mock: 30.3.0 '@jest/expect-utils@30.0.5': @@ -8809,7 +8809,7 @@ snapshots: dependencies: '@jest/types': 30.2.0 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-message-util: 30.2.0 jest-mock: 30.2.0 jest-util: 30.2.0 @@ -8818,7 +8818,7 @@ snapshots: dependencies: '@jest/types': 30.3.0 '@sinonjs/fake-timers': 15.1.1 - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-message-util: 30.3.0 jest-mock: 30.3.0 jest-util: 30.3.0 @@ -8838,7 +8838,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-regex-util: 30.0.1 '@jest/reporters@30.3.0': @@ -8849,7 +8849,7 @@ snapshots: '@jest/transform': 30.3.0 '@jest/types': 30.3.0 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 25.4.0 + '@types/node': 25.5.0 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -8929,7 +8929,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -8939,7 +8939,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -8949,7 +8949,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -9113,10 +9113,10 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} - '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@25.4.0))(@types/node@25.4.0)(listr2@9.0.5)': + '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@25.5.0))(@types/node@25.5.0)(listr2@9.0.5)': dependencies: - '@inquirer/prompts': 7.10.1(@types/node@25.4.0) - '@inquirer/type': 3.0.10(@types/node@25.4.0) + '@inquirer/prompts': 7.10.1(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) listr2: 9.0.5 transitivePeerDependencies: - '@types/node' @@ -9824,20 +9824,20 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/bonjour@3.5.13': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.8 - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/connect@3.4.38': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/eslint-scope@3.7.7': dependencies: @@ -9855,7 +9855,7 @@ snapshots: '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -9871,7 +9871,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/istanbul-lib-coverage@2.0.6': {} @@ -9890,7 +9890,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -9900,9 +9900,9 @@ snapshots: '@types/node-forge@1.3.14': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 - '@types/node@25.4.0': + '@types/node@25.5.0': dependencies: undici-types: 7.18.2 @@ -9915,11 +9915,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/send@1.2.1': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/serve-index@1.9.4': dependencies: @@ -9928,12 +9928,12 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/stack-utils@2.0.3': {} @@ -9941,7 +9941,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@types/yargs-parser@21.0.3': {} @@ -10101,13 +10101,13 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0))': + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.0(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0))': dependencies: - vite: 7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) + vite: 7.3.0(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0))': + '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0))': dependencies: - vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) '@webassemblyjs/ast@1.14.1': dependencies: @@ -11686,7 +11686,7 @@ snapshots: '@jest/expect': 30.3.0 '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.2 @@ -11706,15 +11706,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): + jest-cli@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)): dependencies: - '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-config: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) jest-util: 30.3.0 jest-validate: 30.3.0 yargs: 17.7.2 @@ -11725,7 +11725,7 @@ snapshots: - supports-color - ts-node - jest-config@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): + jest-config@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)): dependencies: '@babel/core': 7.29.0 '@jest/get-type': 30.1.0 @@ -11751,8 +11751,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 25.4.0 - ts-node: 10.9.2(@types/node@25.4.0)(typescript@5.9.3) + '@types/node': 25.5.0 + ts-node: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -11807,7 +11807,7 @@ snapshots: '@jest/environment': 30.3.0 '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-mock: 30.3.0 jest-util: 30.3.0 jest-validate: 30.3.0 @@ -11817,7 +11817,7 @@ snapshots: jest-haste-map@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -11894,26 +11894,26 @@ snapshots: jest-mock@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-util: 30.0.5 jest-mock@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-util: 30.2.0 jest-mock@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 jest-util: 30.3.0 jest-pnp-resolver@1.2.3(jest-resolve@30.3.0): optionalDependencies: jest-resolve: 30.3.0 - jest-preset-angular@16.1.1(135ea37d5312db3eeddee262c6eb1d13): + jest-preset-angular@16.1.1(1dbd79aa77dc8496f8a6323d321949b2): dependencies: '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) @@ -11922,11 +11922,11 @@ snapshots: '@jest/environment-jsdom-abstract': 30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) bs-logger: 0.2.6 esbuild-wasm: 0.27.3 - jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) jest-util: 30.2.0 jsdom: 26.1.0(canvas@3.0.0) pretty-format: 30.2.0 - ts-jest: 29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3) + ts-jest: 29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(typescript@5.9.3) typescript: 5.9.3 optionalDependencies: esbuild: 0.27.3 @@ -11964,7 +11964,7 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -11993,7 +11993,7 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 chalk: 4.1.2 cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.3 @@ -12040,7 +12040,7 @@ snapshots: jest-util@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 25.4.0 + '@types/node': 25.5.0 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -12049,7 +12049,7 @@ snapshots: jest-util@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -12058,7 +12058,7 @@ snapshots: jest-util@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -12077,7 +12077,7 @@ snapshots: dependencies: '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.4.0 + '@types/node': 25.5.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -12091,24 +12091,24 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.3.0: dependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 '@ungap/structured-clone': 1.3.0 jest-util: 30.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): + jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)): dependencies: - '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) '@jest/types': 30.3.0 import-local: 3.2.0 - jest-cli: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-cli: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13735,12 +13735,12 @@ snapshots: dependencies: typescript: 5.9.3 - ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -13756,14 +13756,14 @@ snapshots: esbuild: 0.27.3 jest-util: 30.2.0 - ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3): + ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 25.4.0 + '@types/node': 25.5.0 acorn: 8.14.0 acorn-walk: 8.3.1 arg: 4.1.3 @@ -13921,7 +13921,7 @@ snapshots: vary@1.1.2: {} - vite@7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0): + vite@7.3.0(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -13930,7 +13930,7 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 fsevents: 2.3.3 jiti: 2.6.1 less: 4.4.2 @@ -13938,7 +13938,7 @@ snapshots: terser: 5.44.1 yaml: 2.7.0 - vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0): + vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -13947,7 +13947,7 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.4.0 + '@types/node': 25.5.0 fsevents: 2.3.3 jiti: 2.6.1 less: 4.4.2 From c813a1846d04e01f90fef9e5f396a7526d44f48e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 04:02:33 +0000 Subject: [PATCH 089/113] Chore(deps): Bump the frontend-angular-dependencies group (#12491) Bumps the frontend-angular-dependencies group in /src-ui with 20 updates: | Package | From | To | | --- | --- | --- | | [@angular/cdk](https://github.com/angular/components) | `21.2.2` | `21.2.4` | | [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `21.2.4` | `21.2.6` | | [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `21.2.4` | `21.2.6` | | [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `21.2.4` | `21.2.6` | | [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `21.2.4` | `21.2.6` | | [@angular/localize](https://github.com/angular/angular) | `21.2.4` | `21.2.6` | | [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `21.2.4` | `21.2.6` | | [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `21.2.4` | `21.2.6` | | [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `21.2.4` | `21.2.6` | | [ngx-cookie-service](https://github.com/stevermeister/ngx-cookie-service) | `21.1.0` | `21.3.1` | | [@angular-devkit/core](https://github.com/angular/angular-cli) | `21.2.2` | `21.2.3` | | [@angular-devkit/schematics](https://github.com/angular/angular-cli) | `21.2.2` | `21.2.3` | | [@angular-eslint/builder](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/builder) | `21.3.0` | `21.3.1` | | [@angular-eslint/eslint-plugin](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin) | `21.3.0` | `21.3.1` | | [@angular-eslint/eslint-plugin-template](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin-template) | `21.3.0` | `21.3.1` | | [@angular-eslint/schematics](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/schematics) | `21.3.0` | `21.3.1` | | [@angular-eslint/template-parser](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/template-parser) | `21.3.0` | `21.3.1` | | [@angular/build](https://github.com/angular/angular-cli) | `21.2.2` | `21.2.3` | | [@angular/cli](https://github.com/angular/angular-cli) | `21.2.2` | `21.2.3` | | [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `21.2.4` | `21.2.6` | Updates `@angular/cdk` from 21.2.2 to 21.2.4 - [Release notes](https://github.com/angular/components/releases) - [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/components/compare/v21.2.2...v21.2.4) Updates `@angular/common` from 21.2.4 to 21.2.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.6/packages/common) Updates `@angular/compiler` from 21.2.4 to 21.2.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.6/packages/compiler) Updates `@angular/core` from 21.2.4 to 21.2.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.6/packages/core) Updates `@angular/forms` from 21.2.4 to 21.2.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.6/packages/forms) Updates `@angular/localize` from 21.2.4 to 21.2.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/compare/v21.2.4...v21.2.6) Updates `@angular/platform-browser` from 21.2.4 to 21.2.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.6/packages/platform-browser) Updates `@angular/platform-browser-dynamic` from 21.2.4 to 21.2.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.6/packages/platform-browser-dynamic) Updates `@angular/router` from 21.2.4 to 21.2.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.6/packages/router) Updates `ngx-cookie-service` from 21.1.0 to 21.3.1 - [Release notes](https://github.com/stevermeister/ngx-cookie-service/releases) - [Changelog](https://github.com/stevermeister/ngx-cookie-service/blob/master/CHANGELOG.md) - [Commits](https://github.com/stevermeister/ngx-cookie-service/compare/v21.1.0...v21.3.1) Updates `@angular-devkit/core` from 21.2.2 to 21.2.3 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/v21.2.2...v21.2.3) Updates `@angular-devkit/schematics` from 21.2.2 to 21.2.3 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/v21.2.2...v21.2.3) Updates `@angular-eslint/builder` from 21.3.0 to 21.3.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/builder/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v21.3.1/packages/builder) Updates `@angular-eslint/eslint-plugin` from 21.3.0 to 21.3.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v21.3.1/packages/eslint-plugin) Updates `@angular-eslint/eslint-plugin-template` from 21.3.0 to 21.3.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v21.3.1/packages/eslint-plugin-template) Updates `@angular-eslint/schematics` from 21.3.0 to 21.3.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/schematics/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v21.3.1/packages/schematics) Updates `@angular-eslint/template-parser` from 21.3.0 to 21.3.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/template-parser/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v21.3.1/packages/template-parser) Updates `@angular/build` from 21.2.2 to 21.2.3 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/v21.2.2...v21.2.3) Updates `@angular/cli` from 21.2.2 to 21.2.3 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/v21.2.2...v21.2.3) Updates `@angular/compiler-cli` from 21.2.4 to 21.2.6 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/v21.2.6/packages/compiler-cli) --- updated-dependencies: - dependency-name: "@angular/cdk" dependency-version: 21.2.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/common" dependency-version: 21.2.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/compiler" dependency-version: 21.2.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/core" dependency-version: 21.2.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/forms" dependency-version: 21.2.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/localize" dependency-version: 21.2.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/platform-browser" dependency-version: 21.2.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/platform-browser-dynamic" dependency-version: 21.2.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/router" dependency-version: 21.2.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: ngx-cookie-service dependency-version: 21.3.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: frontend-angular-dependencies - dependency-name: "@angular-devkit/core" dependency-version: 21.2.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular-devkit/schematics" dependency-version: 21.2.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular-eslint/builder" dependency-version: 21.3.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular-eslint/eslint-plugin" dependency-version: 21.3.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular-eslint/eslint-plugin-template" dependency-version: 21.3.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular-eslint/schematics" dependency-version: 21.3.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular-eslint/template-parser" dependency-version: 21.3.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/build" dependency-version: 21.2.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/cli" dependency-version: 21.2.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies - dependency-name: "@angular/compiler-cli" dependency-version: 21.2.6 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: frontend-angular-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src-ui/package.json | 40 +- src-ui/pnpm-lock.yaml | 1188 +++++++++++++++++++++-------------------- 2 files changed, 616 insertions(+), 612 deletions(-) diff --git a/src-ui/package.json b/src-ui/package.json index d212b747e..d42f0ab87 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -11,15 +11,15 @@ }, "private": true, "dependencies": { - "@angular/cdk": "^21.2.2", - "@angular/common": "~21.2.4", - "@angular/compiler": "~21.2.4", - "@angular/core": "~21.2.4", - "@angular/forms": "~21.2.4", - "@angular/localize": "~21.2.4", - "@angular/platform-browser": "~21.2.4", - "@angular/platform-browser-dynamic": "~21.2.4", - "@angular/router": "~21.2.4", + "@angular/cdk": "^21.2.4", + "@angular/common": "~21.2.6", + "@angular/compiler": "~21.2.6", + "@angular/core": "~21.2.6", + "@angular/forms": "~21.2.6", + "@angular/localize": "~21.2.6", + "@angular/platform-browser": "~21.2.6", + "@angular/platform-browser-dynamic": "~21.2.6", + "@angular/router": "~21.2.6", "@ng-bootstrap/ng-bootstrap": "^20.0.0", "@ng-select/ng-select": "^21.5.2", "@ngneat/dirty-check-forms": "^3.0.3", @@ -29,7 +29,7 @@ "mime-names": "^1.0.0", "ngx-bootstrap-icons": "^1.9.3", "ngx-color": "^10.1.0", - "ngx-cookie-service": "^21.1.0", + "ngx-cookie-service": "^21.3.1", "ngx-device-detector": "^11.0.0", "ngx-ui-tour-ng-bootstrap": "^18.0.0", "pdfjs-dist": "^5.4.624", @@ -42,16 +42,16 @@ "devDependencies": { "@angular-builders/custom-webpack": "^21.0.3", "@angular-builders/jest": "^21.0.3", - "@angular-devkit/core": "^21.2.2", - "@angular-devkit/schematics": "^21.2.2", - "@angular-eslint/builder": "21.3.0", - "@angular-eslint/eslint-plugin": "21.3.0", - "@angular-eslint/eslint-plugin-template": "21.3.0", - "@angular-eslint/schematics": "21.3.0", - "@angular-eslint/template-parser": "21.3.0", - "@angular/build": "^21.2.2", - "@angular/cli": "~21.2.2", - "@angular/compiler-cli": "~21.2.4", + "@angular-devkit/core": "^21.2.3", + "@angular-devkit/schematics": "^21.2.3", + "@angular-eslint/builder": "21.3.1", + "@angular-eslint/eslint-plugin": "21.3.1", + "@angular-eslint/eslint-plugin-template": "21.3.1", + "@angular-eslint/schematics": "21.3.1", + "@angular-eslint/template-parser": "21.3.1", + "@angular/build": "^21.2.3", + "@angular/cli": "~21.2.3", + "@angular/compiler-cli": "~21.2.6", "@codecov/webpack-plugin": "^1.9.1", "@playwright/test": "^1.58.2", "@types/jest": "^30.0.0", diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index 47a44fd2f..bd52fa123 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -9,41 +9,41 @@ importers: .: dependencies: '@angular/cdk': - specifier: ^21.2.2 - version: 21.2.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: ^21.2.4 + version: 21.2.4(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/common': - specifier: ~21.2.4 - version: 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: ~21.2.6 + version: 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/compiler': - specifier: ~21.2.4 - version: 21.2.4 + specifier: ~21.2.6 + version: 21.2.6 '@angular/core': - specifier: ~21.2.4 - version: 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + specifier: ~21.2.6 + version: 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/forms': - specifier: ~21.2.4 - version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: ~21.2.6 + version: 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/localize': - specifier: ~21.2.4 - version: 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) + specifier: ~21.2.6 + version: 21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6) '@angular/platform-browser': - specifier: ~21.2.4 - version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: ~21.2.6 + version: 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) '@angular/platform-browser-dynamic': - specifier: ~21.2.4 - version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) + specifier: ~21.2.6 + version: 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))) '@angular/router': - specifier: ~21.2.4 - version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: ~21.2.6 + version: 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@ng-bootstrap/ng-bootstrap': specifier: ^20.0.0 - version: 20.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@popperjs/core@2.11.8)(rxjs@7.8.2) + version: 20.0.0(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@popperjs/core@2.11.8)(rxjs@7.8.2) '@ng-select/ng-select': specifier: ^21.5.2 - version: 21.5.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)) + version: 21.5.2(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)) '@ngneat/dirty-check-forms': specifier: ^3.0.3 - version: 3.0.3(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2) + version: 3.0.3(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -58,19 +58,19 @@ importers: version: 1.0.0 ngx-bootstrap-icons: specifier: ^1.9.3 - version: 1.9.3(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + version: 1.9.3(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-color: specifier: ^10.1.0 - version: 10.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + version: 10.1.0(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-cookie-service: - specifier: ^21.1.0 - version: 21.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: ^21.3.1 + version: 21.3.1(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-device-detector: specifier: ^11.0.0 - version: 11.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + version: 11.0.0(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-ui-tour-ng-bootstrap: specifier: ^18.0.0 - version: 18.0.0(f247d97663488c516a027bc34de144d4) + version: 18.0.0(957a18d57a4419785daf6612885cd3fb) pdfjs-dist: specifier: ^5.4.624 version: 5.4.624 @@ -92,40 +92,40 @@ importers: devDependencies: '@angular-builders/custom-webpack': specifier: ^21.0.3 - version: 21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + version: 21.0.3(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.8)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-builders/jest': specifier: ^21.0.3 - version: 21.0.3(7998fbf94f98776688371278d7c06a01) + version: 21.0.3(de4975aded7c1b8c16c42c3502fe689b) '@angular-devkit/core': - specifier: ^21.2.2 - version: 21.2.2(chokidar@5.0.0) + specifier: ^21.2.3 + version: 21.2.3(chokidar@5.0.0) '@angular-devkit/schematics': - specifier: ^21.2.2 - version: 21.2.2(chokidar@5.0.0) + specifier: ^21.2.3 + version: 21.2.3(chokidar@5.0.0) '@angular-eslint/builder': - specifier: 21.3.0 - version: 21.3.0(@angular/cli@21.2.2(@types/node@25.5.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 21.3.1 + version: 21.3.1(@angular/cli@21.2.3(@types/node@25.5.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin': - specifier: 21.3.0 - version: 21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 21.3.1 + version: 21.3.1(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin-template': - specifier: 21.3.0 - version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 21.3.1 + version: 21.3.1(@angular-eslint/template-parser@21.3.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/schematics': - specifier: 21.3.0 - version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.5.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 21.3.1 + version: 21.3.1(@angular-eslint/template-parser@21.3.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.3(@types/node@25.5.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/template-parser': - specifier: 21.3.0 - version: 21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 21.3.1 + version: 21.3.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@angular/build': - specifier: ^21.2.2 - version: 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + specifier: ^21.2.3 + version: 21.2.3(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.8)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/cli': - specifier: ~21.2.2 - version: 21.2.2(@types/node@25.5.0)(chokidar@5.0.0) + specifier: ~21.2.3 + version: 21.2.3(@types/node@25.5.0)(chokidar@5.0.0) '@angular/compiler-cli': - specifier: ~21.2.4 - version: 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + specifier: ~21.2.6 + version: 21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3) '@codecov/webpack-plugin': specifier: ^1.9.1 version: 1.9.1(webpack@5.105.3) @@ -161,7 +161,7 @@ importers: version: 16.0.0 jest-preset-angular: specifier: ^16.1.1 - version: 16.1.1(1dbd79aa77dc8496f8a6323d321949b2) + version: 16.1.1(84f6d80ef84de676e7bcbce762f185a5) jest-websocket-mock: specifier: ^2.5.0 version: 2.5.0 @@ -280,13 +280,13 @@ packages: engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular-devkit/architect@0.2102.0': - resolution: {integrity: sha512-kYFwTNzToG2SJMxj2f41w3QRtdqlrFuF+bpZrtIaHOP078Ktld8EPIp9KqB0Y46Vvs69ifby5Q1/wPD9wA3iaw==} + '@angular-devkit/architect@0.2102.3': + resolution: {integrity: sha512-G4wSWUbtWp1WCKw5GMRqHH8g4m5RBpIyzt8n8IX5Pm6iYe/rwCBSKL3ktEkk7AYMwjtonkRlDtAK1GScFsf1Sg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular-devkit/architect@0.2102.2': - resolution: {integrity: sha512-CDvFtXwyBtMRkTQnm+LfBNLL0yLV8ZGskrM1T6VkcGwXGFDott1FxUdj96ViodYsYL5fbJr0MNA6TlLcanV3kQ==} + '@angular-devkit/architect@0.2102.6': + resolution: {integrity: sha512-h4qybKypR7OuwcTHPQI1zRm7abXgmPiV49vI2UeMtVVY/GKzru9gMexcYmWabzEyBY8w6VSfWjV2X+eit2EhDQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true @@ -356,8 +356,8 @@ packages: chokidar: optional: true - '@angular-devkit/core@21.2.0': - resolution: {integrity: sha512-HZdTn46Ca6qbb9Zef8R/+TWsk6mNKRm4rJyL3PxHP6HnVCwSPNZ0LNN9BjVREBs+UlRdXqBGFBZh5D1nBgu5GQ==} + '@angular-devkit/core@21.2.3': + resolution: {integrity: sha512-i++JVHOijyFckjdYqKbSXUpKnvmO2a0Utt/wQVwiLAT0O9H1hR/2NGPzubB4hnLMNSyVWY8diminaF23mZ0xjA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^5.0.0 @@ -365,8 +365,8 @@ packages: chokidar: optional: true - '@angular-devkit/core@21.2.2': - resolution: {integrity: sha512-xUeKGe4BDQpkz0E6fnAPIJXE0y0nqtap0KhJIBhvN7xi3NenIzTmoi6T9Yv5OOBUdLZbOm4SOel8MhdXiIBpAQ==} + '@angular-devkit/core@21.2.6': + resolution: {integrity: sha512-u5gPTAY7MC02uACQE39xxiFcm1hslF+ih/f2borMWnhER0JNTpHjLiLRXFkq7or7+VVHU30zfhK4XNAuO4WTIg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^5.0.0 @@ -374,49 +374,49 @@ packages: chokidar: optional: true - '@angular-devkit/schematics@21.2.2': - resolution: {integrity: sha512-CCeyQxGUq+oyGnHd7PfcYIVbj9pRnqjQq0rAojoAqs1BJdtInx9weLBCLy+AjM3NHePeZrnwm+wEVr8apED8kg==} + '@angular-devkit/schematics@21.2.3': + resolution: {integrity: sha512-tc/bBloRTVIBWGRiMPln1QbW+2QPj+YnWL/nG79abLKWkdrL9dJLcCRXY7dsPNrxOc/QF+8tVpnr8JofhWL9cQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@angular-eslint/builder@21.3.0': - resolution: {integrity: sha512-26QUUouei52biUFAlJSrWNAU9tuF2miKwd8uHdxWwCF31xz+OxC5+NfudWvt1AFaYow7gWueX1QX3rNNtSPDrg==} + '@angular-eslint/builder@21.3.1': + resolution: {integrity: sha512-1f1Lyp5e7OH6txiV224HaY3G1uRCj91OSKq7hT2Vw9NRw6zWFc1anBpDeLVjpL9ptUxzUGIQR5jEV54hOPayoQ==} peerDependencies: '@angular/cli': '>= 21.0.0 < 22.0.0' eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/bundled-angular-compiler@21.3.0': - resolution: {integrity: sha512-l521I24J9gJxyMbRkrM24Tc7W8J8BP+TDAmVs2nT8+lXbS3kg8QpWBRtd+hNUgq6o+vt+lKBkytnEfu8OiqeRg==} + '@angular-eslint/bundled-angular-compiler@21.3.1': + resolution: {integrity: sha512-jjbnJPUXQeQBJ8RM+ahlbt4GH2emVN8JvG3AhFbPci1FrqXi9cOOfkbwLmvpoyTli4LF8gy7g4ctFqnlRgqryw==} - '@angular-eslint/eslint-plugin-template@21.3.0': - resolution: {integrity: sha512-lVixd/KypPWgA/5/pUOhJV9MTcaHjYZEqyOi+IiLk+h+maGxn6/s6Ot+20n+XGS85zAgOY+qUw6EEQ11hoojIQ==} + '@angular-eslint/eslint-plugin-template@21.3.1': + resolution: {integrity: sha512-ndPWJodkcEOu2PVUxlUwyz4D2u3r9KO7veWmStVNOLeNrICJA+nQvrz2BWCu0l48rO0K5ezsy0JFcQDVwE/5mw==} peerDependencies: - '@angular-eslint/template-parser': 21.3.0 + '@angular-eslint/template-parser': 21.3.1 '@typescript-eslint/types': ^7.11.0 || ^8.0.0 '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/eslint-plugin@21.3.0': - resolution: {integrity: sha512-Whf/AUUBekOlfSJRS78m76YGrBQAZ3waXE7oOdlW5xEQvn8jBDN9EGuNnjg/syZzvzjK4ZpYC4g1XYXrc+fQIg==} + '@angular-eslint/eslint-plugin@21.3.1': + resolution: {integrity: sha512-08NNTxwawRLTWPLl8dg1BnXMwimx93y4wMEwx2aWQpJbIt4pmNvwJzd+NgoD/Ag2VdLS/gOMadhJH5fgaYKsPQ==} peerDependencies: '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/schematics@21.3.0': - resolution: {integrity: sha512-8deU/zVY9f8k8kAQQ9PL130ox2VlrZw3fMxgsPNAY5tjQ0xk0J2YVSszYHhcqdMGG1J01IsxIjvQaJ4pFfEmMw==} + '@angular-eslint/schematics@21.3.1': + resolution: {integrity: sha512-1U2u4ZsZvwT30aXRLsIJf6tULIiioo9BtASNsldpYecU3/m/1+F61lCYG79qt7YWbif9KABPYZlFTJUFGN8HWA==} peerDependencies: '@angular/cli': '>= 21.0.0 < 22.0.0' - '@angular-eslint/template-parser@21.3.0': - resolution: {integrity: sha512-ysyou1zAY6M6rSZNdIcYKGd4nk6TCapamyFNB3ivmTlVZ0O35TS9o/rJ0aUttuHgDp+Ysgs3ql+LA746PXgCyQ==} + '@angular-eslint/template-parser@21.3.1': + resolution: {integrity: sha512-moERVCTekQKOvR8RMuEOtWSO3VS1qrzA3keI1dPto/JVB8Nqp9w3R5ZpEoXHzh4zgEryosxmPgdi6UczJe2ouQ==} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/utils@21.3.0': - resolution: {integrity: sha512-oNigH6w3l+owTMboj/uFG0tHOy43uH8BpQRtBOQL1/s2+5in/BJ2Fjobv3SyizxTgeJ1FhRefbkT8GmVjK7jAA==} + '@angular-eslint/utils@21.3.1': + resolution: {integrity: sha512-Q3SGA1/36phZhmsp1mYrKzp/jcmqofRr861MYn46FaWIKSYXBYRzl+H3FIJKBu5CE36Bggu6hbNpwGPuUp+MCg==} peerDependencies: '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -468,8 +468,8 @@ packages: vitest: optional: true - '@angular/build@21.2.2': - resolution: {integrity: sha512-Vq2eIneNxzhHm1MwEmRqEJDwHU9ODfSRDaMWwtysGMhpoMQmLdfTqkQDmkC2qVUr8mV8Z1i5I+oe5ZJaMr/PlQ==} + '@angular/build@21.2.3': + resolution: {integrity: sha512-u4bhVQruK7KOuHQuoltqlHg+szp0f6rnsGIUolJnT3ez5V6OuSoWIxUorSbvryi2DiKRD/3iwMq7qJN1aN9HCA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: '@angular/compiler': ^21.0.0 @@ -479,7 +479,7 @@ packages: '@angular/platform-browser': ^21.0.0 '@angular/platform-server': ^21.0.0 '@angular/service-worker': ^21.0.0 - '@angular/ssr': ^21.2.2 + '@angular/ssr': ^21.2.3 karma: ^6.4.0 less: ^4.2.0 ng-packagr: ^21.0.0 @@ -514,46 +514,46 @@ packages: vitest: optional: true - '@angular/cdk@21.2.2': - resolution: {integrity: sha512-9AsZkwqy07No7+0qPydcJfXB6SpA9qLDBanoesNj5KsiZJ62PJH3oIjVyNeQEEe1HQWmSwBnhwN12OPLNMUlnw==} + '@angular/cdk@21.2.4': + resolution: {integrity: sha512-Zv+q9Z/wVWTt0ckuO3gnU7PbpCLTr1tKPEsofLGGzDufA5/85aBLn2UiLcjlY6wQ+V3EMqANhGo/8XJgvBEYFA==} peerDependencies: '@angular/common': ^21.0.0 || ^22.0.0 '@angular/core': ^21.0.0 || ^22.0.0 '@angular/platform-browser': ^21.0.0 || ^22.0.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/cli@21.2.2': - resolution: {integrity: sha512-eZo8/qX+ZIpIWc0CN+cCX13Lbgi/031wAp8DRVhDDO6SMVtcr/ObOQ2S16+pQdOMXxiG3vby6IhzJuz9WACzMQ==} + '@angular/cli@21.2.3': + resolution: {integrity: sha512-QzDxnSy8AUOz6ca92xfbNuEmRdWRDi1dfFkxDVr+4l6XUnA9X6VmOi7ioCO1I9oDR73LXHybOqkqHBYDlqt/Ag==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular/common@21.2.4': - resolution: {integrity: sha512-NrP6qOuUpo3fqq14UJ1b2bIRtWsfvxh1qLqOyFV4gfBrHhXd0XffU1LUlUw1qp4w1uBSgPJ0/N5bSPUWrAguVg==} + '@angular/common@21.2.6': + resolution: {integrity: sha512-2FcpZ1h6AZ4JwCIlnpHCYrbRTGQTOj/RFXkuX/qw7K6cFmJGfWFMmr++xWtHZEvUddfbR9hqDo+v1mkqEKE/Kw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/core': 21.2.4 + '@angular/core': 21.2.6 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@21.2.4': - resolution: {integrity: sha512-vGjd7DZo/Ox50pQCm5EycmBu91JclimPtZoyNXu/2hSxz3oAkzwiHCwlHwk2g58eheSSp+lYtYRLmHAqSVZLjg==} + '@angular/compiler-cli@21.2.6': + resolution: {integrity: sha512-CiPmat4+D+hWXMTAY++09WeII/5D0r6iTjdLdaTq8tlo0uJcrOlazib4CpA94kJ2CRdzfhmC1H+ttwBI1xIlTg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler': 21.2.4 + '@angular/compiler': 21.2.6 typescript: '>=5.9 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@21.2.4': - resolution: {integrity: sha512-9+ulVK3idIo/Tu4X2ic7/V0+Uj7pqrOAbOuIirYe6Ymm3AjexuFRiGBbfcH0VJhQ5cf8TvIJ1fuh+MI4JiRIxA==} + '@angular/compiler@21.2.6': + resolution: {integrity: sha512-shGkb/aAIPbG8oSYkVJ0msGlRdDVcJBVaUVx2KenMltifQjfLn5N8DFMAzOR6haaA3XeugFExxKqmvySjrVq+A==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@angular/core@21.2.4': - resolution: {integrity: sha512-2+gd67ZuXHpGOqeb2o7XZPueEWEP81eJza2tSHkT5QMV8lnYllDEmaNnkPxnIjSLGP1O3PmiXxo4z8ibHkLZwg==} + '@angular/core@21.2.6': + resolution: {integrity: sha512-svgK5DhFlQlS+sMybXftn08rHHRiDGY/uIKT5LZUaKgyffnkPb8uClpMIW0NzANtU8qs8pwgDZFoJw85Ia3oqQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/compiler': 21.2.4 + '@angular/compiler': 21.2.6 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -562,50 +562,50 @@ packages: zone.js: optional: true - '@angular/forms@21.2.4': - resolution: {integrity: sha512-1fOhctA9ADEBYjI3nPQUR5dHsK2+UWAjup37Ksldk/k0w8UpD5YsN7JVNvsDMZRFMucKYcGykPblU7pABtsqnQ==} + '@angular/forms@21.2.6': + resolution: {integrity: sha512-i8BoWxBAm0g2xOMcQ8wTdj07gqMPIFYIyefCOo0ezcGj5XhYjd+C2UrYnKsup0aMZqqEAO1l2aZbmfHx9xLheQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.2.4 - '@angular/core': 21.2.4 - '@angular/platform-browser': 21.2.4 + '@angular/common': 21.2.6 + '@angular/core': 21.2.6 + '@angular/platform-browser': 21.2.6 rxjs: ^6.5.3 || ^7.4.0 - '@angular/localize@21.2.4': - resolution: {integrity: sha512-brKKeH+jaTlY4coIOinKQtitLCguQzyniKYtfrhCvZSN0ap4W4PljAT5w3l+1a8e7/ThM1JVQpqtVCCcJHJZSg==} + '@angular/localize@21.2.6': + resolution: {integrity: sha512-+nScGHruNCUiGz9nbNyFLO0Wg5dGZt+PBH/9wvzCxe1A+VhyiRSNCTD9hjcjsjtK3WPTRPd+Vo1s2URn+fgD4A==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler': 21.2.4 - '@angular/compiler-cli': 21.2.4 + '@angular/compiler': 21.2.6 + '@angular/compiler-cli': 21.2.6 - '@angular/platform-browser-dynamic@21.2.4': - resolution: {integrity: sha512-LRJLnGh4rdgD0+S5xuDd4YRm5bV8WP2e6F1Pe5rIr6N4V9ofgpB0/uOjYy9se99FJZjoyPnpxaKsp8+XA753Zg==} + '@angular/platform-browser-dynamic@21.2.6': + resolution: {integrity: sha512-6a+zA9jM70b1kH3fSfAJIEVmkE3qB3oIXw7otWkv1nEhOJtNO0mM0dTUuO70C3GhnV9tmpLXa2him56C2LhVig==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.2.4 - '@angular/compiler': 21.2.4 - '@angular/core': 21.2.4 - '@angular/platform-browser': 21.2.4 + '@angular/common': 21.2.6 + '@angular/compiler': 21.2.6 + '@angular/core': 21.2.6 + '@angular/platform-browser': 21.2.6 - '@angular/platform-browser@21.2.4': - resolution: {integrity: sha512-1A9e/cQVu+3BkRCktLcO3RZGuw8NOTHw1frUUrpAz+iMyvIT4sDRFbL+U1g8qmOCZqRNC1Pi1HZfZ1kl6kvrcQ==} + '@angular/platform-browser@21.2.6': + resolution: {integrity: sha512-LW1vPXVHvy71LBahn+fSzPlWQl25kJIdcXq+ptG7HsMVgbPQ3/vvkKXAHYaRdppLGCFL+v+3dQGHYLNLiYL9qg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/animations': 21.2.4 - '@angular/common': 21.2.4 - '@angular/core': 21.2.4 + '@angular/animations': 21.2.6 + '@angular/common': 21.2.6 + '@angular/core': 21.2.6 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/router@21.2.4': - resolution: {integrity: sha512-OjWze4XT8i2MThcBXMv7ru1k6/5L6QYZbcXuseqimFCHm2avEJ+mXPovY066fMBZJhqbXdjB82OhHAWkIHjglQ==} + '@angular/router@21.2.6': + resolution: {integrity: sha512-0ajhkKYeOqHQEEH88+Q0HrheR3helwTvdTqD/0gTaapCe+HOoC+SYwmzzsYP2zwAxBNQEg4JHOGKQ30X9/gwgw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.2.4 - '@angular/core': 21.2.4 - '@angular/platform-browser': 21.2.4 + '@angular/common': 21.2.6 + '@angular/core': 21.2.6 + '@angular/platform-browser': 21.2.6 rxjs: ^6.5.3 || ^7.4.0 '@asamuzakjp/css-color@3.2.0': @@ -722,12 +722,12 @@ packages: resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} hasBin: true @@ -1262,21 +1262,12 @@ packages: resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} engines: {node: '>=14.17.0'} - '@emnapi/core@1.8.1': - resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - '@emnapi/core@1.9.0': resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - '@emnapi/runtime@1.9.0': resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@emnapi/wasi-threads@1.2.0': resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} @@ -1626,15 +1617,15 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@gar/promise-retry@1.0.2': - resolution: {integrity: sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g==} + '@gar/promise-retry@1.0.3': + resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} engines: {node: ^20.17.0 || >=22.9.0} '@harperfast/extended-iterable@1.0.3': resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==} - '@hono/node-server@1.19.9': - resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} + '@hono/node-server@1.19.12': + resolution: {integrity: sha512-txsUW4SQ1iilgE0l9/e9VQWmELXifEFvmdA1j6WFh/aFPj99hIntrSsq/if0UWyGVkmrRPKA1wCeP+UCr1B9Uw==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 @@ -2384,8 +2375,11 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@napi-rs/wasm-runtime@1.1.2': + resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@ng-bootstrap/ng-bootstrap@20.0.0': resolution: {integrity: sha512-Jt+GUQ0PdM8VsOUUVr7vTQXhwcGwe2DCe1mmfS21vz9pLSOtGRz41ohZKc1egUevj5Rxm2sHVq5Sve68/nTMfA==} @@ -2771,153 +2765,153 @@ packages: '@rolldown/pluginutils@1.0.0-rc.4': resolution: {integrity: sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==} - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + '@rollup/rollup-android-arm-eabi@4.60.1': + resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + '@rollup/rollup-android-arm64@4.60.1': + resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + '@rollup/rollup-darwin-arm64@4.60.1': + resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + '@rollup/rollup-darwin-x64@4.60.1': + resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} + '@rollup/rollup-freebsd-arm64@4.60.1': + resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + '@rollup/rollup-freebsd-x64@4.60.1': + resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + '@rollup/rollup-linux-arm-musleabihf@4.60.1': + resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + '@rollup/rollup-linux-arm64-gnu@4.60.1': + resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + '@rollup/rollup-linux-arm64-musl@4.60.1': + resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} + '@rollup/rollup-linux-loong64-gnu@4.60.1': + resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} + '@rollup/rollup-linux-loong64-musl@4.60.1': + resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + '@rollup/rollup-linux-ppc64-gnu@4.60.1': + resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} + '@rollup/rollup-linux-ppc64-musl@4.60.1': + resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + '@rollup/rollup-linux-riscv64-gnu@4.60.1': + resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + '@rollup/rollup-linux-riscv64-musl@4.60.1': + resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + '@rollup/rollup-linux-s390x-gnu@4.60.1': + resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + '@rollup/rollup-linux-x64-gnu@4.60.1': + resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + '@rollup/rollup-linux-x64-musl@4.60.1': + resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + '@rollup/rollup-openbsd-x64@4.60.1': + resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + '@rollup/rollup-openharmony-arm64@4.60.1': + resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + '@rollup/rollup-win32-arm64-msvc@4.60.1': + resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + '@rollup/rollup-win32-ia32-msvc@4.60.1': + resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + '@rollup/rollup-win32-x64-gnu@4.60.1': + resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + '@rollup/rollup-win32-x64-msvc@4.60.1': + resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} cpu: [x64] os: [win32] - '@schematics/angular@21.2.2': - resolution: {integrity: sha512-Ywa6HDtX7TRBQZTVMMnxX3Mk7yVnG8KtSFaXWrkx779+q8tqYdBwNwAqbNd4Zatr1GccKaz9xcptHJta5+DTxw==} + '@schematics/angular@21.2.3': + resolution: {integrity: sha512-rCEprgpNbJLl9Rm/t92eRYc1eIqD4BAJqB1OO8fzQolyDajCcOBpohjXkuLYSwK9RMyS6f+szNnYGOQawlrPYw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} '@sigstore/bundle@4.0.0': resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/core@3.1.0': - resolution: {integrity: sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==} + '@sigstore/core@3.2.0': + resolution: {integrity: sha512-kxHrDQ9YgfrWUSXU0cjsQGv8JykOFZQ9ErNKbFPWzk3Hgpwu8x2hHrQ9IdA8yl+j9RTLTC3sAF3Tdq1IQCP4oA==} engines: {node: ^20.17.0 || >=22.9.0} '@sigstore/protobuf-specs@0.5.0': resolution: {integrity: sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==} engines: {node: ^18.17.0 || >=20.5.0} - '@sigstore/sign@4.1.0': - resolution: {integrity: sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==} + '@sigstore/sign@4.1.1': + resolution: {integrity: sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==} engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/tuf@4.0.1': - resolution: {integrity: sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==} + '@sigstore/tuf@4.0.2': + resolution: {integrity: sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==} engines: {node: ^20.17.0 || >=22.9.0} '@sigstore/verify@3.1.0': @@ -3511,6 +3505,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + baseline-browser-mapping@2.10.13: + resolution: {integrity: sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==} + engines: {node: '>=6.0.0'} + hasBin: true + batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -3573,6 +3572,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} @@ -3594,8 +3598,8 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - cacache@20.0.3: - resolution: {integrity: sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==} + cacache@20.0.4: + resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==} engines: {node: ^20.17.0 || >=22.9.0} call-bind-apply-helpers@1.0.2: @@ -3621,6 +3625,9 @@ packages: caniuse-lite@1.0.30001775: resolution: {integrity: sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==} + caniuse-lite@1.0.30001784: + resolution: {integrity: sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==} + canvas@3.0.0: resolution: {integrity: sha512-NtcIBY88FjymQy+g2g5qnuP5IslrbWCQ3A6rSr1PeuYxVRapRZ3BZCrDyAakvI6CuDYidgZaf55ygulFVwROdg==} engines: {node: ^18.12.0 || >= 20.9.0} @@ -3952,6 +3959,9 @@ packages: electron-to-chromium@1.5.302: resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} + electron-to-chromium@1.5.331: + resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} + emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -4064,10 +4074,6 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@9.1.1: - resolution: {integrity: sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint-scope@9.1.2: resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -4164,8 +4170,8 @@ packages: exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - express-rate-limit@8.2.1: - resolution: {integrity: sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==} + express-rate-limit@8.3.2: + resolution: {integrity: sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -4383,8 +4389,8 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hono@4.12.3: - resolution: {integrity: sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==} + hono@4.12.9: + resolution: {integrity: sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==} engines: {node: '>=16.9.0'} hosted-git-info@9.0.2: @@ -4492,8 +4498,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - immutable@5.1.4: - resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -4522,10 +4528,6 @@ packages: resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} engines: {node: ^20.17.0 || >=22.9.0} - ip-address@10.0.1: - resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} - engines: {node: '>= 12'} - ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} @@ -4869,8 +4871,8 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true - jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + jose@6.2.2: + resolution: {integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5036,10 +5038,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.6: - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} - engines: {node: 20 || >=22} - lru-cache@11.2.7: resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} @@ -5061,8 +5059,8 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - make-fetch-happen@15.0.4: - resolution: {integrity: sha512-vM2sG+wbVeVGYcCm16mM3d5fuem9oC28n436HjsGO3LcxoTI8LNVa4rwZDn3f76+cWyT4GGJDxjTYU1I2nr6zw==} + make-fetch-happen@15.0.5: + resolution: {integrity: sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==} engines: {node: ^20.17.0 || >=22.9.0} makeerror@1.0.12: @@ -5177,8 +5175,8 @@ packages: resolution: {integrity: sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==} engines: {node: ^20.17.0 || >=22.9.0} - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + minipass-flush@1.0.7: + resolution: {integrity: sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==} engines: {node: '>= 8'} minipass-pipeline@1.2.4: @@ -5227,8 +5225,8 @@ packages: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.11.8: - resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} + msgpackr@1.11.9: + resolution: {integrity: sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==} multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} @@ -5287,8 +5285,8 @@ packages: '@angular/common': '>=19.0.0-0' '@angular/core': '>=19.0.0-0' - ngx-cookie-service@21.1.0: - resolution: {integrity: sha512-W3IsoMImUVNt0ZuMesEuQJUGrEgKJaPkQGGfCg7zjUGM/EaeAIbIkfNktNIgUDmeUYapZQJa2pSg4YuK4v1gVQ==} + ngx-cookie-service@21.3.1: + resolution: {integrity: sha512-8VEA2W7W2W3yPXhemJoVtXxr+3WW2DNLV4OaCIKDzLdzUUxJ6SzPHMmXXa26Pg8pa+fZxHK1hZfqJfUxr9RMBw==} peerDependencies: '@angular/common': ^21.0.0 '@angular/core': ^21.0.0 @@ -5346,6 +5344,9 @@ packages: node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + nopt@9.0.0: resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} engines: {node: ^20.17.0 || >=22.9.0} @@ -5539,8 +5540,8 @@ packages: path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} pdfjs-dist@5.4.624: resolution: {integrity: sha512-sm6TxKTtWv1Oh6n3C6J6a8odejb5uO4A4zo/2dgkHuC0iu8ZMAXOezEODkVaoVp8nX1Xzr+0WxFJJmUr45hQzg==} @@ -5549,14 +5550,18 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -5644,6 +5649,10 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} @@ -5847,8 +5856,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} + rollup@4.60.1: + resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -6203,8 +6212,8 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar@7.5.9: - resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==} + tar@7.5.13: + resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} engines: {node: '>=18'} terser-webpack-plugin@5.3.16: @@ -6286,12 +6295,6 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -6425,14 +6428,6 @@ packages: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} - unique-filename@5.0.0: - resolution: {integrity: sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==} - engines: {node: ^20.17.0 || >=22.9.0} - - unique-slug@6.0.0: - resolution: {integrity: sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==} - engines: {node: ^20.17.0 || >=22.9.0} - universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} @@ -6802,10 +6797,10 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} peerDependencies: - zod: ^3.25 || ^4 + zod: ^3.25.28 || ^4 zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -6935,7 +6930,7 @@ snapshots: '@angular-builders/common@5.0.3(@types/node@25.5.0)(chokidar@5.0.0)(typescript@5.9.3)': dependencies: - '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular-devkit/core': 21.2.3(chokidar@5.0.0) ts-node: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) tsconfig-paths: 4.2.0 transitivePeerDependencies: @@ -6945,14 +6940,14 @@ snapshots: - chokidar - typescript - '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.8)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@angular-builders/common': 5.0.3(@types/node@25.5.0)(chokidar@5.0.0)(typescript@5.9.3) '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) - '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - '@angular/build': 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) - '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/core': 21.2.3(chokidar@5.0.0) + '@angular/build': 21.2.3(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.8)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular/compiler-cli': 21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3) lodash: 4.17.23 webpack-merge: 6.0.1 transitivePeerDependencies: @@ -6963,6 +6958,8 @@ snapshots: - '@angular/platform-server' - '@angular/service-worker' - '@angular/ssr' + - '@emnapi/core' + - '@emnapi/runtime' - '@rspack/core' - '@swc/core' - '@swc/wasm' @@ -6998,17 +6995,17 @@ snapshots: - webpack-cli - yaml - '@angular-builders/jest@21.0.3(7998fbf94f98776688371278d7c06a01)': + '@angular-builders/jest@21.0.3(de4975aded7c1b8c16c42c3502fe689b)': dependencies: '@angular-builders/common': 5.0.3(@types/node@25.5.0)(chokidar@5.0.0)(typescript@5.9.3) '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) - '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser-dynamic': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/core': 21.2.3(chokidar@5.0.0) + '@angular/compiler-cli': 21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser-dynamic': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))) jest: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) - jest-preset-angular: 16.1.1(1dbd79aa77dc8496f8a6323d321949b2) + jest-preset-angular: 16.1.1(84f6d80ef84de676e7bcbce762f185a5) lodash: 4.17.23 transitivePeerDependencies: - '@angular/platform-browser' @@ -7031,28 +7028,28 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/architect@0.2102.0(chokidar@5.0.0)': + '@angular-devkit/architect@0.2102.3(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.0(chokidar@5.0.0) + '@angular-devkit/core': 21.2.3(chokidar@5.0.0) rxjs: 7.8.2 transitivePeerDependencies: - chokidar - '@angular-devkit/architect@0.2102.2(chokidar@5.0.0)': + '@angular-devkit/architect@0.2102.6(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular-devkit/core': 21.2.6(chokidar@5.0.0) rxjs: 7.8.2 transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.3))(webpack@5.104.1(esbuild@0.27.2)) '@angular-devkit/core': 21.1.2(chokidar@5.0.0) - '@angular/build': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) - '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@angular/build': 21.1.2(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular/compiler-cli': 21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3) '@babel/core': 7.28.5 '@babel/generator': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 @@ -7063,11 +7060,11 @@ snapshots: '@babel/preset-env': 7.28.5(@babel/core@7.28.5) '@babel/runtime': 7.28.4 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2)) + '@ngtools/webpack': 21.1.2(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2)) ansi-colors: 4.1.3 autoprefixer: 10.4.23(postcss@8.5.6) babel-loader: 10.0.0(@babel/core@7.28.5)(webpack@5.104.1(esbuild@0.27.2)) - browserslist: 4.28.1 + browserslist: 4.28.2 copy-webpack-plugin: 13.0.1(webpack@5.104.1(esbuild@0.27.2)) css-loader: 7.1.2(webpack@5.104.1(esbuild@0.27.2)) esbuild-wasm: 0.27.2 @@ -7104,14 +7101,16 @@ snapshots: webpack-merge: 6.0.1 webpack-subresource-integrity: 5.1.0(webpack@5.104.1(esbuild@0.27.2)) optionalDependencies: - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) - '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/localize': 21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6) + '@angular/platform-browser': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) esbuild: 0.27.2 jest: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) jest-environment-jsdom: 30.3.0(canvas@3.0.0) transitivePeerDependencies: - '@angular/compiler' + - '@emnapi/core' + - '@emnapi/runtime' - '@rspack/core' - '@swc/core' - '@types/node' @@ -7153,7 +7152,7 @@ snapshots: optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/core@21.2.0(chokidar@5.0.0)': + '@angular-devkit/core@21.2.3(chokidar@5.0.0)': dependencies: ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) @@ -7164,20 +7163,20 @@ snapshots: optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/core@21.2.2(chokidar@5.0.0)': + '@angular-devkit/core@21.2.6(chokidar@5.0.0)': dependencies: ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) jsonc-parser: 3.3.1 - picomatch: 4.0.3 + picomatch: 4.0.4 rxjs: 7.8.2 source-map: 0.7.6 optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/schematics@21.2.2(chokidar@5.0.0)': + '@angular-devkit/schematics@21.2.3(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular-devkit/core': 21.2.3(chokidar@5.0.0) jsonc-parser: 3.3.1 magic-string: 0.30.21 ora: 9.3.0 @@ -7185,23 +7184,23 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.5.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/builder@21.3.1(@angular/cli@21.2.3(@types/node@25.5.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-devkit/architect': 0.2102.0(chokidar@5.0.0) - '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - '@angular/cli': 21.2.2(@types/node@25.5.0)(chokidar@5.0.0) + '@angular-devkit/architect': 0.2102.6(chokidar@5.0.0) + '@angular-devkit/core': 21.2.3(chokidar@5.0.0) + '@angular/cli': 21.2.3(@types/node@25.5.0)(chokidar@5.0.0) eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - chokidar - '@angular-eslint/bundled-angular-compiler@21.3.0': {} + '@angular-eslint/bundled-angular-compiler@21.3.1': {} - '@angular-eslint/eslint-plugin-template@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin-template@21.3.1(@angular-eslint/template-parser@21.3.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 21.3.0 - '@angular-eslint/template-parser': 21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/bundled-angular-compiler': 21.3.1 + '@angular-eslint/template-parser': 21.3.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/utils': 21.3.1(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/types': 8.57.2 '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) aria-query: 5.3.2 @@ -7209,22 +7208,22 @@ snapshots: eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 - '@angular-eslint/eslint-plugin@21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin@21.3.1(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 21.3.0 - '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/bundled-angular-compiler': 21.3.1 + '@angular-eslint/utils': 21.3.1(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) eslint: 10.1.0(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.5.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/schematics@21.3.1(@angular-eslint/template-parser@21.3.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.3(@types/node@25.5.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) - '@angular-eslint/eslint-plugin': 21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@angular-eslint/eslint-plugin-template': 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@angular/cli': 21.2.2(@types/node@25.5.0)(chokidar@5.0.0) + '@angular-devkit/core': 21.2.3(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.3(chokidar@5.0.0) + '@angular-eslint/eslint-plugin': 21.3.1(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/eslint-plugin-template': 21.3.1(@angular-eslint/template-parser@21.3.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.2)(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@angular/cli': 21.2.3(@types/node@25.5.0)(chokidar@5.0.0) ignore: 7.0.5 semver: 7.7.4 strip-json-comments: 3.1.1 @@ -7236,33 +7235,33 @@ snapshots: - eslint - typescript - '@angular-eslint/template-parser@21.3.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/template-parser@21.3.1(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 21.3.0 + '@angular-eslint/bundled-angular-compiler': 21.3.1 eslint: 10.1.0(jiti@2.6.1) - eslint-scope: 9.1.1 + eslint-scope: 9.1.2 typescript: 5.9.3 - '@angular-eslint/utils@21.3.0(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@angular-eslint/utils@21.3.1(@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 21.3.0 + '@angular-eslint/bundled-angular-compiler': 21.3.1 '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) eslint: 10.1.0(jiti@2.6.1) typescript: 5.9.3 - '@angular/build@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular/build@21.1.2(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) - '@angular/compiler': 21.2.4 - '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@angular/compiler': 21.2.6 + '@angular/compiler-cli': 21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3) '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@25.5.0) '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.3.0(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0)) beasties: 0.3.5 - browserslist: 4.28.1 + browserslist: 4.28.2 esbuild: 0.27.2 https-proxy-agent: 7.0.6 istanbul-lib-instrument: 6.0.3 @@ -7273,7 +7272,7 @@ snapshots: parse5-html-rewriting-stream: 8.0.0 picomatch: 4.0.3 piscina: 5.1.4 - rolldown: 1.0.0-beta.58 + rolldown: 1.0.0-beta.58(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0) sass: 1.97.1 semver: 7.7.3 source-map-support: 0.5.21 @@ -7284,13 +7283,15 @@ snapshots: vite: 7.3.0(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) watchpack: 2.5.0 optionalDependencies: - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) - '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/localize': 21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6) + '@angular/platform-browser': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) less: 4.4.2 lmdb: 3.4.4 postcss: 8.5.6 transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - '@types/node' - chokidar - jiti @@ -7303,19 +7304,19 @@ snapshots: - tsx - yaml - '@angular/build@21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': + '@angular/build@21.2.3(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.8)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2102.2(chokidar@5.0.0) - '@angular/compiler': 21.2.4 - '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@angular-devkit/architect': 0.2102.3(chokidar@5.0.0) + '@angular/compiler': 21.2.6 + '@angular/compiler-cli': 21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3) '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@25.5.0) '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0)) beasties: 0.4.1 - browserslist: 4.28.1 + browserslist: 4.28.2 esbuild: 0.27.3 https-proxy-agent: 7.0.6 istanbul-lib-instrument: 6.0.3 @@ -7326,7 +7327,7 @@ snapshots: parse5-html-rewriting-stream: 8.0.0 picomatch: 4.0.3 piscina: 5.1.4 - rolldown: 1.0.0-rc.4 + rolldown: 1.0.0-rc.4(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0) sass: 1.97.3 semver: 7.7.4 source-map-support: 0.5.21 @@ -7337,13 +7338,15 @@ snapshots: vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) watchpack: 2.5.1 optionalDependencies: - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) - '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/localize': 21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6) + '@angular/platform-browser': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) less: 4.4.2 lmdb: 3.5.1 - postcss: 8.5.6 + postcss: 8.5.8 transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - '@types/node' - chokidar - jiti @@ -7356,24 +7359,24 @@ snapshots: - tsx - yaml - '@angular/cdk@21.2.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/cdk@21.2.4(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) parse5: 8.0.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/cli@21.2.2(@types/node@25.5.0)(chokidar@5.0.0)': + '@angular/cli@21.2.3(@types/node@25.5.0)(chokidar@5.0.0)': dependencies: - '@angular-devkit/architect': 0.2102.2(chokidar@5.0.0) - '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) + '@angular-devkit/architect': 0.2102.3(chokidar@5.0.0) + '@angular-devkit/core': 21.2.3(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.3(chokidar@5.0.0) '@inquirer/prompts': 7.10.1(@types/node@25.5.0) '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@25.5.0))(@types/node@25.5.0)(listr2@9.0.5) '@modelcontextprotocol/sdk': 1.26.0(zod@4.3.6) - '@schematics/angular': 21.2.2(chokidar@5.0.0) + '@schematics/angular': 21.2.3(chokidar@5.0.0) '@yarnpkg/lockfile': 1.1.0 algoliasearch: 5.48.1 ini: 6.0.0 @@ -7391,15 +7394,15 @@ snapshots: - chokidar - supports-color - '@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': + '@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3)': + '@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3)': dependencies: - '@angular/compiler': 21.2.4 + '@angular/compiler': 21.2.6 '@babel/core': 7.29.0 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 5.0.0 @@ -7413,31 +7416,31 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/compiler@21.2.4': + '@angular/compiler@21.2.6': dependencies: tslib: 2.8.1 - '@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)': + '@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 21.2.4 + '@angular/compiler': 21.2.6 zone.js: 0.16.1 - '@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/forms@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)': + '@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)': dependencies: - '@angular/compiler': 21.2.4 - '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@angular/compiler': 21.2.6 + '@angular/compiler-cli': 21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3) '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 tinyglobby: 0.2.15 @@ -7445,25 +7448,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/platform-browser-dynamic@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))': + '@angular/platform-browser-dynamic@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))': dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/compiler': 21.2.4 - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/compiler': 21.2.6 + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) tslib: 2.8.1 - '@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))': + '@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))': dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - '@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/router@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) rxjs: 7.8.2 tslib: 2.8.1 @@ -7489,8 +7492,8 @@ snapshots: '@babel/generator': 7.28.5 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -7509,8 +7512,8 @@ snapshots: '@babel/generator': 7.29.1 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -7525,7 +7528,7 @@ snapshots: '@babel/generator@7.28.5': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -7533,7 +7536,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -7547,7 +7550,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -7665,12 +7668,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.6': + '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/parser@7.29.0': + '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 @@ -8247,7 +8250,7 @@ snapshots: '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': @@ -8255,7 +8258,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3 @@ -8312,33 +8315,17 @@ snapshots: '@discoveryjs/json-ext@0.6.3': {} - '@emnapi/core@1.8.1': - dependencies: - '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.1 - optional: true - '@emnapi/core@1.9.0': dependencies: '@emnapi/wasi-threads': 1.2.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.8.1': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.9.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.1.0': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/wasi-threads@1.2.0': dependencies: tslib: 2.8.1 @@ -8532,16 +8519,14 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@gar/promise-retry@1.0.2': - dependencies: - retry: 0.13.1 + '@gar/promise-retry@1.0.3': {} '@harperfast/extended-iterable@1.0.3': optional: true - '@hono/node-server@1.19.9(hono@4.12.3)': + '@hono/node-server@1.19.12(hono@4.12.9)': dependencies: - hono: 4.12.3 + hono: 4.12.9 '@humanfs/core@0.19.1': {} @@ -9165,7 +9150,7 @@ snapshots: '@modelcontextprotocol/sdk@1.26.0(zod@4.3.6)': dependencies: - '@hono/node-server': 1.19.9(hono@4.12.3) + '@hono/node-server': 1.19.12(hono@4.12.9) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -9174,14 +9159,14 @@ snapshots: eventsource: 3.0.7 eventsource-parser: 3.0.6 express: 5.2.1 - express-rate-limit: 8.2.1(express@5.2.1) - hono: 4.12.3 - jose: 6.1.3 + express-rate-limit: 8.3.2(express@5.2.1) + hono: 4.12.9 + jose: 6.2.2 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 zod: 4.3.6 - zod-to-json-schema: 3.25.1(zod@4.3.6) + zod-to-json-schema: 3.25.2(zod@4.3.6) transitivePeerDependencies: - supports-color @@ -9330,42 +9315,42 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.1': + '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)': dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 + '@emnapi/core': 1.9.0 + '@emnapi/runtime': 1.9.0 '@tybys/wasm-util': 0.10.1 optional: true - '@ng-bootstrap/ng-bootstrap@20.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@popperjs/core@2.11.8)(rxjs@7.8.2)': + '@ng-bootstrap/ng-bootstrap@20.0.0(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@popperjs/core@2.11.8)(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/forms': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/localize': 21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6) '@popperjs/core': 2.11.8 rxjs: 7.8.2 tslib: 2.8.1 - '@ng-select/ng-select@21.5.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))': + '@ng-select/ng-select@21.5.2(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))': dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/forms': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) tslib: 2.8.1 - ? '@ngneat/dirty-check-forms@3.0.3(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2)' + ? '@ngneat/dirty-check-forms@3.0.3(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2)' : dependencies: - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/forms': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/router': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/router': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) lodash-es: 4.17.21 rxjs: 7.8.2 tslib: 2.8.1 - '@ngtools/webpack@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2))': + '@ngtools/webpack@21.1.2(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2))': dependencies: - '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@angular/compiler-cli': 21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3) typescript: 5.9.3 webpack: 5.104.1(esbuild@0.27.2) @@ -9385,10 +9370,10 @@ snapshots: '@npmcli/git@7.0.2': dependencies: - '@gar/promise-retry': 1.0.2 + '@gar/promise-retry': 1.0.3 '@npmcli/promise-spawn': 9.0.1 ini: 6.0.0 - lru-cache: 11.2.6 + lru-cache: 11.2.7 npm-pick-manifest: 11.0.3 proc-log: 6.1.0 semver: 7.7.4 @@ -9621,14 +9606,20 @@ snapshots: '@rolldown/binding-openharmony-arm64@1.0.0-rc.4': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.58(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.4': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.4(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': @@ -9647,85 +9638,85 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.4': {} - '@rollup/rollup-android-arm-eabi@4.59.0': + '@rollup/rollup-android-arm-eabi@4.60.1': optional: true - '@rollup/rollup-android-arm64@4.59.0': + '@rollup/rollup-android-arm64@4.60.1': optional: true - '@rollup/rollup-darwin-arm64@4.59.0': + '@rollup/rollup-darwin-arm64@4.60.1': optional: true - '@rollup/rollup-darwin-x64@4.59.0': + '@rollup/rollup-darwin-x64@4.60.1': optional: true - '@rollup/rollup-freebsd-arm64@4.59.0': + '@rollup/rollup-freebsd-arm64@4.60.1': optional: true - '@rollup/rollup-freebsd-x64@4.59.0': + '@rollup/rollup-freebsd-x64@4.60.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.59.0': + '@rollup/rollup-linux-arm-musleabihf@4.60.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.59.0': + '@rollup/rollup-linux-arm64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.59.0': + '@rollup/rollup-linux-arm64-musl@4.60.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.59.0': + '@rollup/rollup-linux-loong64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.59.0': + '@rollup/rollup-linux-loong64-musl@4.60.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.59.0': + '@rollup/rollup-linux-ppc64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.59.0': + '@rollup/rollup-linux-ppc64-musl@4.60.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.59.0': + '@rollup/rollup-linux-riscv64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.59.0': + '@rollup/rollup-linux-riscv64-musl@4.60.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.59.0': + '@rollup/rollup-linux-s390x-gnu@4.60.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.59.0': + '@rollup/rollup-linux-x64-gnu@4.60.1': optional: true - '@rollup/rollup-linux-x64-musl@4.59.0': + '@rollup/rollup-linux-x64-musl@4.60.1': optional: true - '@rollup/rollup-openbsd-x64@4.59.0': + '@rollup/rollup-openbsd-x64@4.60.1': optional: true - '@rollup/rollup-openharmony-arm64@4.59.0': + '@rollup/rollup-openharmony-arm64@4.60.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.59.0': + '@rollup/rollup-win32-arm64-msvc@4.60.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.59.0': + '@rollup/rollup-win32-ia32-msvc@4.60.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.59.0': + '@rollup/rollup-win32-x64-gnu@4.60.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.59.0': + '@rollup/rollup-win32-x64-msvc@4.60.1': optional: true - '@schematics/angular@21.2.2(chokidar@5.0.0)': + '@schematics/angular@21.2.3(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 21.2.2(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) + '@angular-devkit/core': 21.2.3(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.3(chokidar@5.0.0) jsonc-parser: 3.3.1 transitivePeerDependencies: - chokidar @@ -9734,22 +9725,22 @@ snapshots: dependencies: '@sigstore/protobuf-specs': 0.5.0 - '@sigstore/core@3.1.0': {} + '@sigstore/core@3.2.0': {} '@sigstore/protobuf-specs@0.5.0': {} - '@sigstore/sign@4.1.0': + '@sigstore/sign@4.1.1': dependencies: + '@gar/promise-retry': 1.0.3 '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.1.0 + '@sigstore/core': 3.2.0 '@sigstore/protobuf-specs': 0.5.0 - make-fetch-happen: 15.0.4 + make-fetch-happen: 15.0.5 proc-log: 6.1.0 - promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@sigstore/tuf@4.0.1': + '@sigstore/tuf@4.0.2': dependencies: '@sigstore/protobuf-specs': 0.5.0 tuf-js: 4.1.0 @@ -9759,7 +9750,7 @@ snapshots: '@sigstore/verify@3.1.0': dependencies: '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.1.0 + '@sigstore/core': 3.2.0 '@sigstore/protobuf-specs': 0.5.0 '@sinclair/typebox@0.27.10': {} @@ -9802,7 +9793,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -9814,7 +9805,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': @@ -10306,7 +10297,7 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 2.3.2 arg@4.1.3: {} @@ -10322,8 +10313,8 @@ snapshots: autoprefixer@10.4.23(postcss@8.5.6): dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001775 + browserslist: 4.28.2 + caniuse-lite: 1.0.30001784 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.6 @@ -10422,6 +10413,8 @@ snapshots: baseline-browser-mapping@2.10.0: {} + baseline-browser-mapping@2.10.13: {} + batch@0.6.1: {} beasties@0.3.5: @@ -10443,9 +10436,9 @@ snapshots: domhandler: 5.0.3 htmlparser2: 10.1.0 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.8 postcss-media-query-parser: 0.2.3 - postcss-safe-parser: 7.0.1(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.8) before-after-hook@2.2.3: {} @@ -10527,6 +10520,14 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.13 + caniuse-lite: 1.0.30001784 + electron-to-chromium: 1.5.331 + node-releases: 2.0.36 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + bs-logger@0.2.6: dependencies: fast-json-stable-stringify: 2.1.0 @@ -10549,19 +10550,18 @@ snapshots: bytes@3.1.2: {} - cacache@20.0.3: + cacache@20.0.4: dependencies: '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 glob: 13.0.6 - lru-cache: 11.2.6 + lru-cache: 11.2.7 minipass: 7.1.3 minipass-collect: 2.0.1 - minipass-flush: 1.0.5 + minipass-flush: 1.0.7 minipass-pipeline: 1.2.4 p-map: 7.0.4 ssri: 13.0.1 - unique-filename: 5.0.0 call-bind-apply-helpers@1.0.2: dependencies: @@ -10581,6 +10581,8 @@ snapshots: caniuse-lite@1.0.30001775: {} + caniuse-lite@1.0.30001784: {} + canvas@3.0.0: dependencies: node-addon-api: 7.1.1 @@ -10728,7 +10730,7 @@ snapshots: core-js-compat@3.48.0: dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 core-util-is@1.0.3: {} @@ -10763,7 +10765,7 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.4 + semver: 7.7.3 optionalDependencies: webpack: 5.104.1(esbuild@0.27.2) @@ -10880,6 +10882,8 @@ snapshots: electron-to-chromium@1.5.302: {} + electron-to-chromium@1.5.331: {} + emittery@0.13.1: {} emoji-regex@10.6.0: {} @@ -11008,13 +11012,6 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@9.1.1: - dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 @@ -11136,10 +11133,10 @@ snapshots: exponential-backoff@3.1.3: {} - express-rate-limit@8.2.1(express@5.2.1): + express-rate-limit@8.3.2(express@5.2.1): dependencies: express: 5.2.1 - ip-address: 10.0.1 + ip-address: 10.1.0 express@4.22.1: dependencies: @@ -11408,11 +11405,11 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.12.3: {} + hono@4.12.9: {} hosted-git-info@9.0.2: dependencies: - lru-cache: 11.2.6 + lru-cache: 11.2.7 hpack.js@2.1.6: dependencies: @@ -11535,7 +11532,7 @@ snapshots: image-size@0.5.5: optional: true - immutable@5.1.4: {} + immutable@5.1.5: {} import-fresh@3.3.1: dependencies: @@ -11561,8 +11558,6 @@ snapshots: ini@6.0.0: {} - ip-address@10.0.1: {} - ip-address@10.1.0: {} ipaddr.js@1.9.1: {} @@ -11642,7 +11637,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.4 @@ -11824,7 +11819,7 @@ snapshots: jest-regex-util: 30.0.1 jest-util: 30.3.0 jest-worker: 30.3.0 - picomatch: 4.0.3 + picomatch: 4.0.4 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -11886,7 +11881,7 @@ snapshots: '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - picomatch: 4.0.3 + picomatch: 4.0.4 pretty-format: 30.3.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -11913,12 +11908,12 @@ snapshots: optionalDependencies: jest-resolve: 30.3.0 - jest-preset-angular@16.1.1(1dbd79aa77dc8496f8a6323d321949b2): + jest-preset-angular@16.1.1(84f6d80ef84de676e7bcbce762f185a5): dependencies: - '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) - '@angular/platform-browser-dynamic': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) + '@angular/compiler-cli': 21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/platform-browser-dynamic': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))) '@jest/environment-jsdom-abstract': 30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) bs-logger: 0.2.6 esbuild-wasm: 0.27.3 @@ -12044,7 +12039,7 @@ snapshots: chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 - picomatch: 4.0.3 + picomatch: 4.0.4 jest-util@30.2.0: dependencies: @@ -12053,7 +12048,7 @@ snapshots: chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 - picomatch: 4.0.3 + picomatch: 4.0.4 jest-util@30.3.0: dependencies: @@ -12062,7 +12057,7 @@ snapshots: chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 - picomatch: 4.0.3 + picomatch: 4.0.4 jest-validate@30.3.0: dependencies: @@ -12118,7 +12113,7 @@ snapshots: jiti@2.6.1: {} - jose@6.1.3: {} + jose@6.2.2: {} js-tokens@4.0.0: {} @@ -12243,7 +12238,7 @@ snapshots: lmdb@3.4.4: dependencies: - msgpackr: 1.11.8 + msgpackr: 1.11.9 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 ordered-binary: 1.6.1 @@ -12261,7 +12256,7 @@ snapshots: lmdb@3.5.1: dependencies: '@harperfast/extended-iterable': 1.0.3 - msgpackr: 1.11.8 + msgpackr: 1.11.9 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 ordered-binary: 1.6.1 @@ -12317,8 +12312,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.6: {} - lru-cache@11.2.7: {} lru-cache@5.1.1: @@ -12341,15 +12334,16 @@ snapshots: make-error@1.3.6: {} - make-fetch-happen@15.0.4: + make-fetch-happen@15.0.5: dependencies: - '@gar/promise-retry': 1.0.2 + '@gar/promise-retry': 1.0.3 '@npmcli/agent': 4.0.0 - cacache: 20.0.3 + '@npmcli/redact': 4.0.0 + cacache: 20.0.4 http-cache-semantics: 4.2.0 minipass: 7.1.3 minipass-fetch: 5.0.2 - minipass-flush: 1.0.5 + minipass-flush: 1.0.7 minipass-pipeline: 1.2.4 negotiator: 1.0.0 proc-log: 6.1.0 @@ -12397,7 +12391,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 mime-db@1.52.0: {} @@ -12459,7 +12453,7 @@ snapshots: optionalDependencies: iconv-lite: 0.7.2 - minipass-flush@1.0.5: + minipass-flush@1.0.7: dependencies: minipass: 3.3.6 @@ -12506,7 +12500,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.11.8: + msgpackr@1.11.9: optionalDependencies: msgpackr-extract: 3.0.3 optional: true @@ -12541,46 +12535,46 @@ snapshots: neo-async@2.6.2: {} - ngx-bootstrap-icons@1.9.3(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): + ngx-bootstrap-icons@1.9.3(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - ngx-color@10.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): + ngx-color@10.1.0(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) '@ctrl/tinycolor': 4.2.0 material-colors: 1.2.6 tslib: 2.8.1 - ngx-cookie-service@21.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): + ngx-cookie-service@21.3.1(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - ngx-device-detector@11.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): + ngx-device-detector@11.0.0(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - ngx-ui-tour-core@16.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(rxjs@7.8.2): + ngx-ui-tour-core@16.0.0(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/router@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(rxjs@7.8.2): dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/router': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/router': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) rxjs: 7.8.2 tslib: 2.8.1 - ngx-ui-tour-ng-bootstrap@18.0.0(f247d97663488c516a027bc34de144d4): + ngx-ui-tour-ng-bootstrap@18.0.0(957a18d57a4419785daf6612885cd3fb): dependencies: - '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) - '@ng-bootstrap/ng-bootstrap': 20.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@popperjs/core@2.11.8)(rxjs@7.8.2) - ngx-ui-tour-core: 16.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/common': 21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1) + '@ng-bootstrap/ng-bootstrap': 20.0.0(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@popperjs/core@2.11.8)(rxjs@7.8.2) + ngx-ui-tour-core: 16.0.0(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/router@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(rxjs@7.8.2) tslib: 2.8.1 transitivePeerDependencies: - '@angular/router' @@ -12609,11 +12603,11 @@ snapshots: env-paths: 2.2.1 exponential-backoff: 3.1.3 graceful-fs: 4.2.11 - make-fetch-happen: 15.0.4 + make-fetch-happen: 15.0.5 nopt: 9.0.0 proc-log: 6.1.0 semver: 7.7.4 - tar: 7.5.9 + tar: 7.5.13 tinyglobby: 0.2.15 which: 6.0.1 transitivePeerDependencies: @@ -12626,6 +12620,8 @@ snapshots: node-releases@2.0.27: {} + node-releases@2.0.36: {} + nopt@9.0.0: dependencies: abbrev: 4.0.0 @@ -12665,7 +12661,7 @@ snapshots: dependencies: '@npmcli/redact': 4.0.0 jsonparse: 1.3.1 - make-fetch-happen: 15.0.4 + make-fetch-happen: 15.0.5 minipass: 7.1.3 minipass-fetch: 5.0.2 minizlib: 3.1.0 @@ -12794,7 +12790,7 @@ snapshots: '@npmcli/package-json': 7.0.5 '@npmcli/promise-spawn': 9.0.1 '@npmcli/run-script': 10.0.4 - cacache: 20.0.3 + cacache: 20.0.4 fs-minipass: 3.0.3 minipass: 7.1.3 npm-package-arg: 13.0.2 @@ -12805,7 +12801,7 @@ snapshots: promise-retry: 2.0.1 sigstore: 4.1.0 ssri: 13.0.1 - tar: 7.5.9 + tar: 7.5.13 transitivePeerDependencies: - supports-color @@ -12859,12 +12855,12 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.2.6 + lru-cache: 11.2.7 minipass: 7.1.3 path-to-regexp@0.1.12: {} - path-to-regexp@8.3.0: {} + path-to-regexp@8.4.2: {} pdfjs-dist@5.4.624: optionalDependencies: @@ -12873,10 +12869,12 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} picomatch@4.0.3: {} + picomatch@4.0.4: {} + pify@4.0.1: optional: true @@ -12905,7 +12903,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 2.6.1 postcss: 8.5.6 - semver: 7.7.4 + semver: 7.7.3 optionalDependencies: webpack: 5.104.1(esbuild@0.27.2) transitivePeerDependencies: @@ -12934,9 +12932,9 @@ snapshots: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 - postcss-safe-parser@7.0.1(postcss@8.5.6): + postcss-safe-parser@7.0.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser@7.1.1: dependencies: @@ -12951,6 +12949,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.8: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + powershell-utils@0.1.0: {} prebuild-install@7.1.3: @@ -13085,7 +13089,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.1 + picomatch: 2.3.2 readdirp@4.1.2: {} @@ -13155,7 +13159,7 @@ snapshots: rfdc@1.4.1: {} - rolldown@1.0.0-beta.58: + rolldown@1.0.0-beta.58(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0): dependencies: '@oxc-project/types': 0.106.0 '@rolldown/pluginutils': 1.0.0-beta.58 @@ -13170,11 +13174,14 @@ snapshots: '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.58 '@rolldown/binding-linux-x64-musl': 1.0.0-beta.58 '@rolldown/binding-openharmony-arm64': 1.0.0-beta.58 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.58 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.58(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0) '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.58 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.58 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - rolldown@1.0.0-rc.4: + rolldown@1.0.0-rc.4(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0): dependencies: '@oxc-project/types': 0.113.0 '@rolldown/pluginutils': 1.0.0-rc.4 @@ -13189,39 +13196,42 @@ snapshots: '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.4 '@rolldown/binding-linux-x64-musl': 1.0.0-rc.4 '@rolldown/binding-openharmony-arm64': 1.0.0-rc.4 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.4 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.4(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0) '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.4 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.4 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - rollup@4.59.0: + rollup@4.60.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.59.0 - '@rollup/rollup-android-arm64': 4.59.0 - '@rollup/rollup-darwin-arm64': 4.59.0 - '@rollup/rollup-darwin-x64': 4.59.0 - '@rollup/rollup-freebsd-arm64': 4.59.0 - '@rollup/rollup-freebsd-x64': 4.59.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 - '@rollup/rollup-linux-arm-musleabihf': 4.59.0 - '@rollup/rollup-linux-arm64-gnu': 4.59.0 - '@rollup/rollup-linux-arm64-musl': 4.59.0 - '@rollup/rollup-linux-loong64-gnu': 4.59.0 - '@rollup/rollup-linux-loong64-musl': 4.59.0 - '@rollup/rollup-linux-ppc64-gnu': 4.59.0 - '@rollup/rollup-linux-ppc64-musl': 4.59.0 - '@rollup/rollup-linux-riscv64-gnu': 4.59.0 - '@rollup/rollup-linux-riscv64-musl': 4.59.0 - '@rollup/rollup-linux-s390x-gnu': 4.59.0 - '@rollup/rollup-linux-x64-gnu': 4.59.0 - '@rollup/rollup-linux-x64-musl': 4.59.0 - '@rollup/rollup-openbsd-x64': 4.59.0 - '@rollup/rollup-openharmony-arm64': 4.59.0 - '@rollup/rollup-win32-arm64-msvc': 4.59.0 - '@rollup/rollup-win32-ia32-msvc': 4.59.0 - '@rollup/rollup-win32-x64-gnu': 4.59.0 - '@rollup/rollup-win32-x64-msvc': 4.59.0 + '@rollup/rollup-android-arm-eabi': 4.60.1 + '@rollup/rollup-android-arm64': 4.60.1 + '@rollup/rollup-darwin-arm64': 4.60.1 + '@rollup/rollup-darwin-x64': 4.60.1 + '@rollup/rollup-freebsd-arm64': 4.60.1 + '@rollup/rollup-freebsd-x64': 4.60.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 + '@rollup/rollup-linux-arm-musleabihf': 4.60.1 + '@rollup/rollup-linux-arm64-gnu': 4.60.1 + '@rollup/rollup-linux-arm64-musl': 4.60.1 + '@rollup/rollup-linux-loong64-gnu': 4.60.1 + '@rollup/rollup-linux-loong64-musl': 4.60.1 + '@rollup/rollup-linux-ppc64-gnu': 4.60.1 + '@rollup/rollup-linux-ppc64-musl': 4.60.1 + '@rollup/rollup-linux-riscv64-gnu': 4.60.1 + '@rollup/rollup-linux-riscv64-musl': 4.60.1 + '@rollup/rollup-linux-s390x-gnu': 4.60.1 + '@rollup/rollup-linux-x64-gnu': 4.60.1 + '@rollup/rollup-linux-x64-musl': 4.60.1 + '@rollup/rollup-openbsd-x64': 4.60.1 + '@rollup/rollup-openharmony-arm64': 4.60.1 + '@rollup/rollup-win32-arm64-msvc': 4.60.1 + '@rollup/rollup-win32-ia32-msvc': 4.60.1 + '@rollup/rollup-win32-x64-gnu': 4.60.1 + '@rollup/rollup-win32-x64-msvc': 4.60.1 fsevents: 2.3.3 router@2.2.0: @@ -13230,7 +13240,7 @@ snapshots: depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.3.0 + path-to-regexp: 8.4.2 transitivePeerDependencies: - supports-color @@ -13258,7 +13268,7 @@ snapshots: sass@1.97.1: dependencies: chokidar: 4.0.3 - immutable: 5.1.4 + immutable: 5.1.5 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.6 @@ -13266,7 +13276,7 @@ snapshots: sass@1.97.3: dependencies: chokidar: 4.0.3 - immutable: 5.1.4 + immutable: 5.1.5 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.6 @@ -13418,10 +13428,10 @@ snapshots: sigstore@4.1.0: dependencies: '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.1.0 + '@sigstore/core': 3.2.0 '@sigstore/protobuf-specs': 0.5.0 - '@sigstore/sign': 4.1.0 - '@sigstore/tuf': 4.0.1 + '@sigstore/sign': 4.1.1 + '@sigstore/tuf': 4.0.2 '@sigstore/verify': 3.1.0 transitivePeerDependencies: - supports-color @@ -13640,7 +13650,7 @@ snapshots: readable-stream: 3.6.2 optional: true - tar@7.5.9: + tar@7.5.13: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -13727,10 +13737,6 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.4.0(typescript@5.9.3): - dependencies: - typescript: 5.9.3 - ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -13786,7 +13792,7 @@ snapshots: dependencies: '@tufjs/models': 4.1.0 debug: 4.4.3 - make-fetch-happen: 15.0.4 + make-fetch-happen: 15.0.5 transitivePeerDependencies: - supports-color @@ -13846,14 +13852,6 @@ snapshots: unicode-property-aliases-ecmascript@2.2.0: {} - unique-filename@5.0.0: - dependencies: - unique-slug: 6.0.0 - - unique-slug@6.0.0: - dependencies: - imurmurhash: 0.1.4 - universal-user-agent@6.0.1: {} unpipe@1.0.0: {} @@ -13893,6 +13891,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -13923,11 +13927,11 @@ snapshots: vite@7.3.0(@types/node@25.5.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0): dependencies: - esbuild: 0.27.3 + esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.59.0 + rollup: 4.60.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 25.5.0 @@ -13943,8 +13947,8 @@ snapshots: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.59.0 + postcss: 8.5.8 + rollup: 4.60.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 25.5.0 @@ -14111,7 +14115,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.16.0 acorn-import-phases: 1.0.4(acorn@8.16.0) - browserslist: 4.28.1 + browserslist: 4.28.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.20.0 es-module-lexer: 2.0.0 @@ -14288,7 +14292,7 @@ snapshots: yoctocolors@2.1.2: {} - zod-to-json-schema@3.25.1(zod@4.3.6): + zod-to-json-schema@3.25.2(zod@4.3.6): dependencies: zod: 4.3.6 From 63f4e939d5e7bd47f26c60c86c77c137380023aa Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 04:04:11 +0000 Subject: [PATCH 090/113] Auto translate strings --- src-ui/messages.xlf | 70 ++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 1d156d52c..19b2f7ce2 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -5,14 +5,14 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/alert/alert.ts 50 Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -20,114 +20,114 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/carousel/carousel.ts 159,162 Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/carousel/carousel.ts 202,203 Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/datepicker/datepicker-navigation-select.ts 91 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/datepicker/datepicker-navigation-select.ts 91 Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/datepicker/datepicker-navigation-select.ts 91 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/datepicker/datepicker-navigation-select.ts 91 Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/datepicker/datepicker-navigation.ts 112 Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/datepicker/datepicker-navigation.ts 112 «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/pagination/pagination-config.ts 20 « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/pagination/pagination-config.ts 20 » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/pagination/pagination-config.ts 20 »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/pagination/pagination-config.ts 20 First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/pagination/pagination-config.ts 20 Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/pagination/pagination-config.ts 20 Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/pagination/pagination-config.ts 20 Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/pagination/pagination-config.ts 20 @@ -135,105 +135,105 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/progressbar/progressbar.ts 41,42 HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/timepicker/timepicker-config.ts 21 Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/toast/toast-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.6_@angular+core@21.2.6_@angular+_0766f480734948ad660a180d719522cc/node_modules/src/toast/toast-config.ts 54 From e7884cb505a8fab588d08013df37091d8b4302ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 04:24:47 +0000 Subject: [PATCH 091/113] Chore(deps): Bump the actions group with 9 updates (#12490) Bumps the actions group with 9 updates: | Package | From | To | | --- | --- | --- | | [dorny/paths-filter](https://github.com/dorny/paths-filter) | `3.0.2` | `4.0.1` | | [actions/cache](https://github.com/actions/cache) | `5.0.3` | `5.0.4` | | [actions/download-artifact](https://github.com/actions/download-artifact) | `8.0.0` | `8.0.1` | | [actions/configure-pages](https://github.com/actions/configure-pages) | `5.0.0` | `6.0.0` | | [actions/deploy-pages](https://github.com/actions/deploy-pages) | `4.0.5` | `5.0.0` | | [pnpm/action-setup](https://github.com/pnpm/action-setup) | `4.2.0` | `5.0.0` | | [j178/prek-action](https://github.com/j178/prek-action) | `1.1.1` | `2.0.1` | | [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) | `6.2.0` | `7.1.1` | | [shogo82148/actions-upload-release-asset](https://github.com/shogo82148/actions-upload-release-asset) | `1.9.2` | `1.10.0` | Updates `dorny/paths-filter` from 3.0.2 to 4.0.1 - [Release notes](https://github.com/dorny/paths-filter/releases) - [Changelog](https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md) - [Commits](https://github.com/dorny/paths-filter/compare/de90cc6fb38fc0963ad72b210f1f284cd68cea36...fbd0ab8f3e69293af611ebaee6363fc25e6d187d) Updates `actions/cache` from 5.0.3 to 5.0.4 - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/cdf6c1fa76f9f475f3d7449005a359c84ca0f306...668228422ae6a00e4ad889ee87cd7109ec5666a7) Updates `actions/download-artifact` from 8.0.0 to 8.0.1 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c) Updates `actions/configure-pages` from 5.0.0 to 6.0.0 - [Release notes](https://github.com/actions/configure-pages/releases) - [Commits](https://github.com/actions/configure-pages/compare/983d7736d9b0ae728b81ab479565c72886d7745b...45bfe0192ca1faeb007ade9deae92b16b8254a0d) Updates `actions/deploy-pages` from 4.0.5 to 5.0.0 - [Release notes](https://github.com/actions/deploy-pages/releases) - [Commits](https://github.com/actions/deploy-pages/compare/d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e...cd2ce8fcbc39b97be8ca5fce6e763baed58fa128) Updates `pnpm/action-setup` from 4.2.0 to 5.0.0 - [Release notes](https://github.com/pnpm/action-setup/releases) - [Commits](https://github.com/pnpm/action-setup/compare/41ff72655975bd51cab0327fa583b6e92b6d3061...fc06bc1257f339d1d5d8b3a19a8cae5388b55320) Updates `j178/prek-action` from 1.1.1 to 2.0.1 - [Release notes](https://github.com/j178/prek-action/releases) - [Commits](https://github.com/j178/prek-action/compare/0bb87d7f00b0c99306c8bcb8b8beba1eb581c037...53276d8b0d10f8b6672aa85b4588c6921d0370cc) Updates `release-drafter/release-drafter` from 6.2.0 to 7.1.1 - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/6db134d15f3909ccc9eefd369f02bd1e9cffdf97...139054aeaa9adc52ab36ddf67437541f039b88e2) Updates `shogo82148/actions-upload-release-asset` from 1.9.2 to 1.10.0 - [Release notes](https://github.com/shogo82148/actions-upload-release-asset/releases) - [Commits](https://github.com/shogo82148/actions-upload-release-asset/compare/8f6863c6c894ba46f9e676ef5cccec4752723c1e...96bc1f0cb850b65efd58a6b5eaa0a69f88d38077) --- updated-dependencies: - dependency-name: dorny/paths-filter dependency-version: 4.0.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: actions/cache dependency-version: 5.0.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: actions - dependency-name: actions/download-artifact dependency-version: 8.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: actions - dependency-name: actions/configure-pages dependency-version: 6.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: actions/deploy-pages dependency-version: 5.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: pnpm/action-setup dependency-version: 5.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: j178/prek-action dependency-version: 2.0.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: release-drafter/release-drafter dependency-version: 7.1.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions - dependency-name: shogo82148/actions-upload-release-asset dependency-version: 1.10.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-backend.yml | 4 ++-- .github/workflows/ci-docker.yml | 2 +- .github/workflows/ci-docs.yml | 6 +++--- .github/workflows/ci-frontend.yml | 22 +++++++++++----------- .github/workflows/ci-lint.yml | 2 +- .github/workflows/ci-release.yml | 8 ++++---- .github/workflows/project-actions.yml | 2 +- .github/workflows/translate-strings.yml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci-backend.yml b/.github/workflows/ci-backend.yml index 82c4bb9bd..f92d1fb00 100644 --- a/.github/workflows/ci-backend.yml +++ b/.github/workflows/ci-backend.yml @@ -49,7 +49,7 @@ jobs: - name: Detect changes id: filter if: steps.force.outputs.run_all != 'true' - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 with: base: ${{ steps.range.outputs.base }} ref: ${{ steps.range.outputs.ref }} @@ -173,7 +173,7 @@ jobs: check \ src/ - name: Cache Mypy - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: .mypy_cache # Keyed by OS, Python version, and dependency hashes diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index cc02b48bf..48d258dca 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -169,7 +169,7 @@ jobs: packages: write steps: - name: Download digests - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: path: /tmp/digests pattern: digest-*.txt diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index b14de9627..68f202264 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -51,7 +51,7 @@ jobs: - name: Detect changes id: filter if: steps.force.outputs.run_all != 'true' - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 with: base: ${{ steps.range.outputs.base }} ref: ${{ steps.range.outputs.ref }} @@ -68,7 +68,7 @@ jobs: name: Build Documentation runs-on: ubuntu-24.04 steps: - - uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 + - uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Python @@ -107,7 +107,7 @@ jobs: url: ${{ steps.deployment.outputs.page_url }} steps: - name: Deploy GitHub Pages - uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5 + uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0 id: deployment with: artifact_name: github-pages-${{ github.run_id }}-${{ github.run_attempt }} diff --git a/.github/workflows/ci-frontend.yml b/.github/workflows/ci-frontend.yml index 19600b512..dffb54e6b 100644 --- a/.github/workflows/ci-frontend.yml +++ b/.github/workflows/ci-frontend.yml @@ -46,7 +46,7 @@ jobs: - name: Detect changes id: filter if: steps.force.outputs.run_all != 'true' - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 with: base: ${{ steps.range.outputs.base }} ref: ${{ steps.range.outputs.ref }} @@ -63,7 +63,7 @@ jobs: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: version: 10 - name: Use Node.js 24 @@ -74,7 +74,7 @@ jobs: cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies id: cache-frontend-deps - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: | ~/.pnpm-store @@ -91,7 +91,7 @@ jobs: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: version: 10 - name: Use Node.js 24 @@ -101,7 +101,7 @@ jobs: cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: | ~/.pnpm-store @@ -126,7 +126,7 @@ jobs: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: version: 10 - name: Use Node.js 24 @@ -136,7 +136,7 @@ jobs: cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: | ~/.pnpm-store @@ -177,7 +177,7 @@ jobs: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: version: 10 - name: Use Node.js 24 @@ -187,7 +187,7 @@ jobs: cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: | ~/.pnpm-store @@ -210,7 +210,7 @@ jobs: with: fetch-depth: 2 - name: Install pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: version: 10 - name: Use Node.js 24 @@ -220,7 +220,7 @@ jobs: cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: | ~/.pnpm-store diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml index 3d37579da..bf1458e1d 100644 --- a/.github/workflows/ci-lint.yml +++ b/.github/workflows/ci-lint.yml @@ -21,4 +21,4 @@ jobs: with: python-version: "3.14" - name: Run prek - uses: j178/prek-action@0bb87d7f00b0c99306c8bcb8b8beba1eb581c037 # v1.1.1 + uses: j178/prek-action@53276d8b0d10f8b6672aa85b4588c6921d0370cc # v2.0.1 diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index 0eef7eb23..b38ecbc40 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -31,7 +31,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # ---- Frontend Build ---- - name: Install pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: version: 10 - name: Use Node.js 24 @@ -133,7 +133,7 @@ jobs: version: ${{ steps.get-version.outputs.version }} steps: - name: Download release artifact - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: release path: ./ @@ -148,7 +148,7 @@ jobs: fi - name: Create release and changelog id: create-release - uses: release-drafter/release-drafter@6db134d15f3909ccc9eefd369f02bd1e9cffdf97 # v6.2.0 + uses: release-drafter/release-drafter@139054aeaa9adc52ab36ddf67437541f039b88e2 # v7.1.1 with: name: Paperless-ngx ${{ steps.get-version.outputs.version }} tag: ${{ steps.get-version.outputs.version }} @@ -159,7 +159,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload release archive - uses: shogo82148/actions-upload-release-asset@8f6863c6c894ba46f9e676ef5cccec4752723c1e # v1.9.2 + uses: shogo82148/actions-upload-release-asset@96bc1f0cb850b65efd58a6b5eaa0a69f88d38077 # v1.10.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} upload_url: ${{ steps.create-release.outputs.upload_url }} diff --git a/.github/workflows/project-actions.yml b/.github/workflows/project-actions.yml index 519a1f562..bc26aaf0d 100644 --- a/.github/workflows/project-actions.yml +++ b/.github/workflows/project-actions.yml @@ -19,6 +19,6 @@ jobs: if: github.event_name == 'pull_request_target' && (github.event.action == 'opened' || github.event.action == 'reopened') && github.event.pull_request.user.login != 'dependabot' steps: - name: Label PR with release-drafter - uses: release-drafter/release-drafter@6db134d15f3909ccc9eefd369f02bd1e9cffdf97 # v6.2.0 + uses: release-drafter/release-drafter@139054aeaa9adc52ab36ddf67437541f039b88e2 # v7.1.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/translate-strings.yml b/.github/workflows/translate-strings.yml index bfd6cd84e..c38886bc2 100644 --- a/.github/workflows/translate-strings.yml +++ b/.github/workflows/translate-strings.yml @@ -36,7 +36,7 @@ jobs: - name: Generate backend translation strings run: cd src/ && uv run manage.py makemessages -l en_US -i "samples*" - name: Install pnpm - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: version: 10 - name: Use Node.js 24 @@ -47,7 +47,7 @@ jobs: cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies id: cache-frontend-deps - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 + uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 with: path: | ~/.pnpm-store From 32876f0334f8bc76459fac3f1d2aaa34b5450715 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 06:34:39 -0700 Subject: [PATCH 092/113] Chore(deps): Bump lodash (#12498) Bumps the npm_and_yarn group with 1 update in the /src-ui directory: [lodash](https://github.com/lodash/lodash). Updates `lodash` from 4.17.23 to 4.18.1 - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.23...4.18.1) --- updated-dependencies: - dependency-name: lodash dependency-version: 4.18.1 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src-ui/pnpm-lock.yaml | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index bd52fa123..dae33bc30 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -1936,10 +1936,6 @@ packages: '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -3323,11 +3319,6 @@ packages: resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} engines: {node: '>=0.4.0'} - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} @@ -5024,8 +5015,8 @@ packages: lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} @@ -6948,7 +6939,7 @@ snapshots: '@angular-devkit/core': 21.2.3(chokidar@5.0.0) '@angular/build': 21.2.3(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.6(@angular/compiler-cli@21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3))(@angular/compiler@21.2.6))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1)))(@emnapi/core@1.9.0)(@emnapi/runtime@1.9.0)(@types/node@25.5.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.8)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/compiler-cli': 21.2.6(@angular/compiler@21.2.6)(typescript@5.9.3) - lodash: 4.17.23 + lodash: 4.18.1 webpack-merge: 6.0.1 transitivePeerDependencies: - '@angular/compiler' @@ -7006,7 +6997,7 @@ snapshots: '@angular/platform-browser-dynamic': 21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.6)(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.6(@angular/common@21.2.6(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.6(@angular/compiler@21.2.6)(rxjs@7.8.2)(zone.js@0.16.1))) jest: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3)) jest-preset-angular: 16.1.1(84f6d80ef84de676e7bcbce762f185a5) - lodash: 4.17.23 + lodash: 4.18.1 transitivePeerDependencies: - '@angular/platform-browser' - '@babel/core' @@ -8948,8 +8939,6 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.1': {} - '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/source-map@0.3.11': @@ -8966,7 +8955,7 @@ snapshots: '@jridgewell/trace-mapping@0.3.9': dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': @@ -10204,8 +10193,6 @@ snapshots: acorn-walk@8.3.1: {} - acorn@8.14.0: {} - acorn@8.16.0: {} adjust-sourcemap-loader@4.0.0: @@ -12295,7 +12282,7 @@ snapshots: lodash.memoize@4.1.2: {} - lodash@4.17.23: {} + lodash@4.18.1: {} log-symbols@7.0.1: dependencies: @@ -13770,7 +13757,7 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 25.5.0 - acorn: 8.14.0 + acorn: 8.16.0 acorn-walk: 8.3.1 arg: 4.1.3 create-require: 1.1.1 From 14cc6a7ca433b4e756e3751f0b5e44da529afe37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 09:10:34 -0700 Subject: [PATCH 093/113] Chore(deps): Bump the pre-commit-dependencies group with 2 updates (#12495) * Chore(deps): Bump the pre-commit-dependencies group with 2 updates Bumps the pre-commit-dependencies group with 2 updates: [https://github.com/astral-sh/ruff-pre-commit](https://github.com/astral-sh/ruff-pre-commit) and [https://github.com/tox-dev/pyproject-fmt](https://github.com/tox-dev/pyproject-fmt). Updates `https://github.com/astral-sh/ruff-pre-commit` from v0.15.6 to 0.15.8 - [Release notes](https://github.com/astral-sh/ruff-pre-commit/releases) - [Commits](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.6...v0.15.8) Updates `https://github.com/tox-dev/pyproject-fmt` from v2.12.1 to 2.21.0 - [Release notes](https://github.com/tox-dev/pyproject-fmt/releases) - [Commits](https://github.com/tox-dev/pyproject-fmt/compare/v2.12.1...v2.21.0) --- updated-dependencies: - dependency-name: https://github.com/astral-sh/ruff-pre-commit dependency-version: 0.15.8 dependency-type: direct:production dependency-group: pre-commit-dependencies - dependency-name: https://github.com/tox-dev/pyproject-fmt dependency-version: 2.21.0 dependency-type: direct:production dependency-group: pre-commit-dependencies ... Signed-off-by: dependabot[bot] * Slightly less bad formatting --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Trenton H <797416+stumpylog@users.noreply.github.com> --- .pre-commit-config.yaml | 4 +- pyproject.toml | 191 +++++++++++++++++++--------------------- 2 files changed, 92 insertions(+), 103 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8d6456ff0..6c483467d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -50,12 +50,12 @@ repos: - 'prettier-plugin-organize-imports@4.3.0' # Python hooks - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.15.6 + rev: v0.15.8 hooks: - id: ruff-check - id: ruff-format - repo: https://github.com/tox-dev/pyproject-fmt - rev: "v2.12.1" + rev: "v2.21.0" hooks: - id: pyproject-fmt # Dockerfile hooks diff --git a/pyproject.toml b/pyproject.toml index ee89ae4dd..e37a7958f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,6 @@ classifiers = [ ] # TODO: Move certain things to groups and then utilize that further # This will allow testing to not install a webserver, mysql, etc - dependencies = [ "azure-ai-documentintelligence>=1.0.2", "babel>=2.17", @@ -82,32 +81,33 @@ dependencies = [ "whoosh-reloaded>=2.7.5", "zxing-cpp~=3.0.0", ] - -optional-dependencies.mariadb = [ +[project.optional-dependencies] +mariadb = [ "mysqlclient~=2.2.7", ] -optional-dependencies.postgres = [ +postgres = [ "psycopg[c,pool]==3.3", # Direct dependency for proper resolution of the pre-built wheels "psycopg-c==3.3", "psycopg-pool==3.3", ] -optional-dependencies.webserver = [ +webserver = [ "granian[uvloop]~=2.7.0", ] [dependency-groups] - dev = [ - { "include-group" = "docs" }, - { "include-group" = "testing" }, - { "include-group" = "lint" }, + { include-group = "docs" }, + { include-group = "lint" }, + { include-group = "testing" }, ] - docs = [ "zensical>=0.0.21", ] - +lint = [ + "prek~=0.3.0", + "ruff~=0.15.0", +] testing = [ "daphne", "factory-boy~=3.3.1", @@ -119,17 +119,11 @@ testing = [ "pytest-env~=1.5.0", "pytest-httpx", "pytest-mock~=3.15.1", - #"pytest-randomly~=4.0.1", + # "pytest-randomly~=4.0.1", "pytest-rerunfailures~=16.1", "pytest-sugar", "pytest-xdist~=3.8.0", ] - -lint = [ - "prek~=0.3.0", - "ruff~=0.15.0", -] - typing = [ "celery-types", "django-filter-stubs", @@ -154,24 +148,21 @@ typing = [ [tool.uv] required-version = ">=0.9.0" -package = false environments = [ "sys_platform == 'darwin'", "sys_platform == 'linux'", ] - +package = false [[tool.uv.index]] name = "pytorch-cpu" url = "https://download.pytorch.org/whl/cpu" explicit = true - [tool.uv.sources] # Markers are chosen to select these almost exclusively when building the Docker image psycopg-c = [ { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_x86_64.whl", marker = "sys_platform == 'linux' and platform_machine == 'x86_64' and python_version == '3.12'" }, { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64' and python_version == '3.12'" }, ] - torch = [ { index = "pytorch-cpu" }, ] @@ -186,10 +177,10 @@ respect-gitignore = true # https://docs.astral.sh/ruff/settings/ fix = true show-fixes = true - output-format = "grouped" +[tool.ruff.lint] # https://docs.astral.sh/ruff/rules/ -lint.extend-select = [ +extend-select = [ "COM", # https://docs.astral.sh/ruff/rules/#flake8-commas-com "DJ", # https://docs.astral.sh/ruff/rules/#flake8-django-dj "EXE", # https://docs.astral.sh/ruff/rules/#flake8-executable-exe @@ -214,115 +205,52 @@ lint.extend-select = [ "UP", # https://docs.astral.sh/ruff/rules/#pyupgrade-up "W", # https://docs.astral.sh/ruff/rules/#pycodestyle-e-w ] -lint.ignore = [ +ignore = [ "DJ001", "PLC0415", "RUF012", "SIM105", ] # Migrations -lint.per-file-ignores."*/migrations/*.py" = [ +per-file-ignores."*/migrations/*.py" = [ "E501", "SIM", "T201", ] # Testing -lint.per-file-ignores."*/tests/*.py" = [ +per-file-ignores."*/tests/*.py" = [ "E501", "SIM117", ] -lint.per-file-ignores.".github/scripts/*.py" = [ +per-file-ignores.".github/scripts/*.py" = [ "E501", "INP001", "SIM117", ] # Docker specific -lint.per-file-ignores."docker/rootfs/usr/local/bin/wait-for-redis.py" = [ +per-file-ignores."docker/rootfs/usr/local/bin/wait-for-redis.py" = [ "INP001", "T201", ] -lint.per-file-ignores."docker/wait-for-redis.py" = [ +per-file-ignores."docker/wait-for-redis.py" = [ "INP001", "T201", ] -lint.per-file-ignores."src/documents/models.py" = [ +per-file-ignores."src/documents/models.py" = [ "SIM115", ] - -lint.isort.force-single-line = true +isort.force-single-line = true [tool.codespell] write-changes = true ignore-words-list = "criterias,afterall,valeu,ureue,equest,ure,assertIn,Oktober,commitish" -skip = "src-ui/src/locale/*,src-ui/pnpm-lock.yaml,src-ui/e2e/*,src/paperless_mail/tests/samples/*,src/paperless/tests/samples/mail/*,src/documents/tests/samples/*,*.po,*.json" +skip = """\ + src-ui/src/locale/*,src-ui/pnpm-lock.yaml,src-ui/e2e/*,src/paperless_mail/tests/samples/*,src/paperless/tests/samples\ + /mail/*,src/documents/tests/samples/*,*.po,*.json\ + """ -[tool.pytest] -minversion = "9.0" -pythonpath = [ "src" ] - -strict_config = true -strict_markers = true -strict_parametrization_ids = true -strict_xfail = true - -testpaths = [ - "src/documents/tests/", - "src/paperless/tests/", - "src/paperless_mail/tests/", - "src/paperless_ai/tests", -] - -addopts = [ - "--pythonwarnings=all", - "--cov", - "--cov-report=html", - "--cov-report=xml", - "--numprocesses=auto", - "--maxprocesses=16", - "--dist=loadscope", - "--durations=50", - "--durations-min=0.5", - "--junitxml=junit.xml", - "-o", - "junit_family=legacy", -] - -norecursedirs = [ "src/locale/", ".venv/", "src-ui/" ] - -DJANGO_SETTINGS_MODULE = "paperless.settings" - -markers = [ - "live: Integration tests requiring external services (Gotenberg, Tika, nginx, etc)", - "nginx: Tests that make HTTP requests to the local nginx service", - "gotenberg: Tests requiring Gotenberg service", - "tika: Tests requiring Tika service", - "greenmail: Tests requiring Greenmail service", - "date_parsing: Tests which cover date parsing from content or filename", - "management: Tests which cover management commands/functionality", -] - -[tool.pytest_env] -PAPERLESS_DISABLE_DBHANDLER = "true" -PAPERLESS_CACHE_BACKEND = "django.core.cache.backends.locmem.LocMemCache" -PAPERLESS_CHANNELS_BACKEND = "channels.layers.InMemoryChannelLayer" - -[tool.coverage.report] -exclude_also = [ - "if settings.AUDIT_LOG_ENABLED:", - "if AUDIT_LOG_ENABLED:", - "if TYPE_CHECKING:", -] - -[tool.coverage.run] -source = [ - "src/", -] -omit = [ - "*/tests/*", - "manage.py", - "paperless/wsgi.py", - "paperless/auth.py", -] +[tool.pyproject-fmt] +table_format = "long" [tool.mypy] mypy_path = "src" @@ -345,6 +273,67 @@ python-platform = "linux" [tool.django-stubs] django_settings_module = "paperless.settings" +[tool.pytest] +minversion = "9.0" +pythonpath = [ "src" ] +strict_config = true +strict_markers = true +strict_parametrization_ids = true +strict_xfail = true +testpaths = [ + "src/documents/tests/", + "src/paperless/tests/", + "src/paperless_mail/tests/", + "src/paperless_ai/tests", +] +addopts = [ + "--pythonwarnings=all", + "--cov", + "--cov-report=html", + "--cov-report=xml", + "--numprocesses=auto", + "--maxprocesses=16", + "--dist=loadscope", + "--durations=50", + "--durations-min=0.5", + "--junitxml=junit.xml", + "-o", + "junit_family=legacy", +] +norecursedirs = [ "src/locale/", ".venv/", "src-ui/" ] +DJANGO_SETTINGS_MODULE = "paperless.settings" +markers = [ + "live: Integration tests requiring external services (Gotenberg, Tika, nginx, etc)", + "nginx: Tests that make HTTP requests to the local nginx service", + "gotenberg: Tests requiring Gotenberg service", + "tika: Tests requiring Tika service", + "greenmail: Tests requiring Greenmail service", + "date_parsing: Tests which cover date parsing from content or filename", + "management: Tests which cover management commands/functionality", +] + +[tool.pytest_env] +PAPERLESS_DISABLE_DBHANDLER = "true" +PAPERLESS_CACHE_BACKEND = "django.core.cache.backends.locmem.LocMemCache" +PAPERLESS_CHANNELS_BACKEND = "channels.layers.InMemoryChannelLayer" + +[tool.coverage.report] +exclude_also = [ + "if settings.AUDIT_LOG_ENABLED:", + "if AUDIT_LOG_ENABLED:", + "if TYPE_CHECKING:", +] +[tool.coverage.run] +source = [ + "src/", +] +omit = [ + "*/tests/*", + "manage.py", + "paperless/wsgi.py", + "paperless/auth.py", +] + [tool.mypy-baseline] baseline_path = ".mypy-baseline.txt" sort_baseline = true From e01a762e81dd65dff927988aa51594906d8a417f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 10:13:19 -0700 Subject: [PATCH 094/113] Chore(deps): Bump aiohttp in the uv group across 1 directory (#12486) --- updated-dependencies: - dependency-name: aiohttp dependency-version: 3.13.4 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 154 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/uv.lock b/uv.lock index 0e1ab08cf..6bbfdc53b 100644 --- a/uv.lock +++ b/uv.lock @@ -25,7 +25,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.13.3" +version = "3.13.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -36,83 +36,83 @@ dependencies = [ { name = "propcache", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "yarl", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/45/4a/064321452809dae953c1ed6e017504e72551a26b6f5708a5a80e4bf556ff/aiohttp-3.13.4.tar.gz", hash = "sha256:d97a6d09c66087890c2ab5d49069e1e570583f7ac0314ecf98294c1b6aaebd38", size = 7859748, upload-time = "2026-03-28T17:19:40.6Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/4c/a164164834f03924d9a29dc3acd9e7ee58f95857e0b467f6d04298594ebb/aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b", size = 746051, upload-time = "2026-01-03T17:29:43.287Z" }, - { url = "https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64", size = 499234, upload-time = "2026-01-03T17:29:44.822Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea", size = 494979, upload-time = "2026-01-03T17:29:46.405Z" }, - { url = "https://files.pythonhosted.org/packages/75/b5/31d4d2e802dfd59f74ed47eba48869c1c21552c586d5e81a9d0d5c2ad640/aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a", size = 1748297, upload-time = "2026-01-03T17:29:48.083Z" }, - { url = "https://files.pythonhosted.org/packages/1a/3e/eefad0ad42959f226bb79664826883f2687d602a9ae2941a18e0484a74d3/aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540", size = 1707172, upload-time = "2026-01-03T17:29:49.648Z" }, - { url = "https://files.pythonhosted.org/packages/c5/3a/54a64299fac2891c346cdcf2aa6803f994a2e4beeaf2e5a09dcc54acc842/aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b", size = 1805405, upload-time = "2026-01-03T17:29:51.244Z" }, - { url = "https://files.pythonhosted.org/packages/6c/70/ddc1b7169cf64075e864f64595a14b147a895a868394a48f6a8031979038/aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3", size = 1899449, upload-time = "2026-01-03T17:29:53.938Z" }, - { url = "https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1", size = 1748444, upload-time = "2026-01-03T17:29:55.484Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f2/073b145c4100da5511f457dc0f7558e99b2987cf72600d42b559db856fbc/aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3", size = 1606038, upload-time = "2026-01-03T17:29:57.179Z" }, - { url = "https://files.pythonhosted.org/packages/0a/c1/778d011920cae03ae01424ec202c513dc69243cf2db303965615b81deeea/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440", size = 1724156, upload-time = "2026-01-03T17:29:58.914Z" }, - { url = "https://files.pythonhosted.org/packages/0e/cb/3419eabf4ec1e9ec6f242c32b689248365a1cf621891f6f0386632525494/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7", size = 1722340, upload-time = "2026-01-03T17:30:01.962Z" }, - { url = "https://files.pythonhosted.org/packages/7a/e5/76cf77bdbc435bf233c1f114edad39ed4177ccbfab7c329482b179cff4f4/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c", size = 1783041, upload-time = "2026-01-03T17:30:03.609Z" }, - { url = "https://files.pythonhosted.org/packages/9d/d4/dd1ca234c794fd29c057ce8c0566b8ef7fd6a51069de5f06fa84b9a1971c/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51", size = 1596024, upload-time = "2026-01-03T17:30:05.132Z" }, - { url = "https://files.pythonhosted.org/packages/55/58/4345b5f26661a6180afa686c473620c30a66afdf120ed3dd545bbc809e85/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4", size = 1804590, upload-time = "2026-01-03T17:30:07.135Z" }, - { url = "https://files.pythonhosted.org/packages/7b/06/05950619af6c2df7e0a431d889ba2813c9f0129cec76f663e547a5ad56f2/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29", size = 1740355, upload-time = "2026-01-03T17:30:09.083Z" }, - { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, - { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, - { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, - { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, - { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, - { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, - { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, - { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, - { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, - { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, - { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, - { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, - { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, - { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, - { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, - { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, - { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, - { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, - { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, - { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, - { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, - { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, - { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238, upload-time = "2026-01-03T17:31:17.909Z" }, - { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292, upload-time = "2026-01-03T17:31:19.919Z" }, - { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021, upload-time = "2026-01-03T17:31:21.636Z" }, - { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263, upload-time = "2026-01-03T17:31:23.296Z" }, - { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107, upload-time = "2026-01-03T17:31:25.334Z" }, - { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196, upload-time = "2026-01-03T17:31:27.394Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591, upload-time = "2026-01-03T17:31:29.238Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277, upload-time = "2026-01-03T17:31:31.053Z" }, - { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575, upload-time = "2026-01-03T17:31:32.87Z" }, - { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455, upload-time = "2026-01-03T17:31:34.76Z" }, - { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417, upload-time = "2026-01-03T17:31:36.699Z" }, - { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968, upload-time = "2026-01-03T17:31:38.622Z" }, - { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690, upload-time = "2026-01-03T17:31:40.57Z" }, - { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390, upload-time = "2026-01-03T17:31:42.857Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188, upload-time = "2026-01-03T17:31:44.984Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512, upload-time = "2026-01-03T17:31:51.134Z" }, - { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444, upload-time = "2026-01-03T17:31:52.85Z" }, - { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798, upload-time = "2026-01-03T17:31:54.91Z" }, - { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835, upload-time = "2026-01-03T17:31:56.733Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486, upload-time = "2026-01-03T17:31:58.65Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951, upload-time = "2026-01-03T17:32:00.989Z" }, - { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001, upload-time = "2026-01-03T17:32:03.122Z" }, - { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246, upload-time = "2026-01-03T17:32:05.255Z" }, - { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131, upload-time = "2026-01-03T17:32:07.607Z" }, - { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196, upload-time = "2026-01-03T17:32:09.59Z" }, - { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841, upload-time = "2026-01-03T17:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193, upload-time = "2026-01-03T17:32:13.705Z" }, - { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979, upload-time = "2026-01-03T17:32:15.965Z" }, - { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193, upload-time = "2026-01-03T17:32:18.219Z" }, - { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801, upload-time = "2026-01-03T17:32:20.25Z" }, + { url = "https://files.pythonhosted.org/packages/d4/7e/cb94129302d78c46662b47f9897d642fd0b33bdfef4b73b20c6ced35aa4c/aiohttp-3.13.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8ea0c64d1bcbf201b285c2246c51a0c035ba3bbd306640007bc5844a3b4658c1", size = 760027, upload-time = "2026-03-28T17:15:33.022Z" }, + { url = "https://files.pythonhosted.org/packages/5e/cd/2db3c9397c3bd24216b203dd739945b04f8b87bb036c640da7ddb63c75ef/aiohttp-3.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6f742e1fa45c0ed522b00ede565e18f97e4cf8d1883a712ac42d0339dfb0cce7", size = 508325, upload-time = "2026-03-28T17:15:34.714Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/d28b2722ec13107f2e37a86b8a169897308bab6a3b9e071ecead9d67bd9b/aiohttp-3.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dcfb50ee25b3b7a1222a9123be1f9f89e56e67636b561441f0b304e25aaef8f", size = 502402, upload-time = "2026-03-28T17:15:36.409Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d6/acd47b5f17c4430e555590990a4746efbcb2079909bb865516892bf85f37/aiohttp-3.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3262386c4ff370849863ea93b9ea60fd59c6cf56bf8f93beac625cf4d677c04d", size = 1771224, upload-time = "2026-03-28T17:15:38.223Z" }, + { url = "https://files.pythonhosted.org/packages/98/af/af6e20113ba6a48fd1cd9e5832c4851e7613ef50c7619acdaee6ec5f1aff/aiohttp-3.13.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:473bb5aa4218dd254e9ae4834f20e31f5a0083064ac0136a01a62ddbae2eaa42", size = 1731530, upload-time = "2026-03-28T17:15:39.988Z" }, + { url = "https://files.pythonhosted.org/packages/81/16/78a2f5d9c124ad05d5ce59a9af94214b6466c3491a25fb70760e98e9f762/aiohttp-3.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e56423766399b4c77b965f6aaab6c9546617b8994a956821cc507d00b91d978c", size = 1827925, upload-time = "2026-03-28T17:15:41.944Z" }, + { url = "https://files.pythonhosted.org/packages/2a/1f/79acf0974ced805e0e70027389fccbb7d728e6f30fcac725fb1071e63075/aiohttp-3.13.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8af249343fafd5ad90366a16d230fc265cf1149f26075dc9fe93cfd7c7173942", size = 1923579, upload-time = "2026-03-28T17:15:44.071Z" }, + { url = "https://files.pythonhosted.org/packages/af/53/29f9e2054ea6900413f3b4c3eb9d8331f60678ec855f13ba8714c47fd48d/aiohttp-3.13.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bc0a5cf4f10ef5a2c94fdde488734b582a3a7a000b131263e27c9295bd682d9", size = 1767655, upload-time = "2026-03-28T17:15:45.911Z" }, + { url = "https://files.pythonhosted.org/packages/f3/57/462fe1d3da08109ba4aa8590e7aed57c059af2a7e80ec21f4bac5cfe1094/aiohttp-3.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5c7ff1028e3c9fc5123a865ce17df1cb6424d180c503b8517afbe89aa566e6be", size = 1630439, upload-time = "2026-03-28T17:15:48.11Z" }, + { url = "https://files.pythonhosted.org/packages/d7/4b/4813344aacdb8127263e3eec343d24e973421143826364fa9fc847f6283f/aiohttp-3.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ba5cf98b5dcb9bddd857da6713a503fa6d341043258ca823f0f5ab7ab4a94ee8", size = 1745557, upload-time = "2026-03-28T17:15:50.13Z" }, + { url = "https://files.pythonhosted.org/packages/d4/01/1ef1adae1454341ec50a789f03cfafe4c4ac9c003f6a64515ecd32fe4210/aiohttp-3.13.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d85965d3ba21ee4999e83e992fecb86c4614d6920e40705501c0a1f80a583c12", size = 1741796, upload-time = "2026-03-28T17:15:52.351Z" }, + { url = "https://files.pythonhosted.org/packages/22/04/8cdd99af988d2aa6922714d957d21383c559835cbd43fbf5a47ddf2e0f05/aiohttp-3.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:49f0b18a9b05d79f6f37ddd567695943fcefb834ef480f17a4211987302b2dc7", size = 1805312, upload-time = "2026-03-28T17:15:54.407Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/b48d5577338d4b25bbdbae35c75dbfd0493cb8886dc586fbfb2e90862239/aiohttp-3.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7f78cb080c86fbf765920e5f1ef35af3f24ec4314d6675d0a21eaf41f6f2679c", size = 1621751, upload-time = "2026-03-28T17:15:56.564Z" }, + { url = "https://files.pythonhosted.org/packages/bc/89/4eecad8c1858e6d0893c05929e22343e0ebe3aec29a8a399c65c3cc38311/aiohttp-3.13.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:67a3ec705534a614b68bbf1c70efa777a21c3da3895d1c44510a41f5a7ae0453", size = 1826073, upload-time = "2026-03-28T17:15:58.489Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5c/9dc8293ed31b46c39c9c513ac7ca152b3c3d38e0ea111a530ad12001b827/aiohttp-3.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6630ec917e85c5356b2295744c8a97d40f007f96a1c76bf1928dc2e27465393", size = 1760083, upload-time = "2026-03-28T17:16:00.677Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bd/ede278648914cabbabfdf95e436679b5d4156e417896a9b9f4587169e376/aiohttp-3.13.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ee62d4471ce86b108b19c3364db4b91180d13fe3510144872d6bad5401957360", size = 752158, upload-time = "2026-03-28T17:16:06.901Z" }, + { url = "https://files.pythonhosted.org/packages/90/de/581c053253c07b480b03785196ca5335e3c606a37dc73e95f6527f1591fe/aiohttp-3.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c0fd8f41b54b58636402eb493afd512c23580456f022c1ba2db0f810c959ed0d", size = 501037, upload-time = "2026-03-28T17:16:08.82Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f9/a5ede193c08f13cc42c0a5b50d1e246ecee9115e4cf6e900d8dbd8fd6acb/aiohttp-3.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4baa48ce49efd82d6b1a0be12d6a36b35e5594d1dd42f8bfba96ea9f8678b88c", size = 501556, upload-time = "2026-03-28T17:16:10.63Z" }, + { url = "https://files.pythonhosted.org/packages/d6/10/88ff67cd48a6ec36335b63a640abe86135791544863e0cfe1f065d6cef7a/aiohttp-3.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d738ebab9f71ee652d9dbd0211057690022201b11197f9a7324fd4dba128aa97", size = 1757314, upload-time = "2026-03-28T17:16:12.498Z" }, + { url = "https://files.pythonhosted.org/packages/8b/15/fdb90a5cf5a1f52845c276e76298c75fbbcc0ac2b4a86551906d54529965/aiohttp-3.13.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0ce692c3468fa831af7dceed52edf51ac348cebfc8d3feb935927b63bd3e8576", size = 1731819, upload-time = "2026-03-28T17:16:14.558Z" }, + { url = "https://files.pythonhosted.org/packages/ec/df/28146785a007f7820416be05d4f28cc207493efd1e8c6c1068e9bdc29198/aiohttp-3.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8e08abcfe752a454d2cb89ff0c08f2d1ecd057ae3e8cc6d84638de853530ebab", size = 1793279, upload-time = "2026-03-28T17:16:16.594Z" }, + { url = "https://files.pythonhosted.org/packages/10/47/689c743abf62ea7a77774d5722f220e2c912a77d65d368b884d9779ef41b/aiohttp-3.13.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5977f701b3fff36367a11087f30ea73c212e686d41cd363c50c022d48b011d8d", size = 1891082, upload-time = "2026-03-28T17:16:18.71Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b6/f7f4f318c7e58c23b761c9b13b9a3c9b394e0f9d5d76fbc6622fa98509f6/aiohttp-3.13.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54203e10405c06f8b6020bd1e076ae0fe6c194adcee12a5a78af3ffa3c57025e", size = 1773938, upload-time = "2026-03-28T17:16:21.125Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/f207cb3121852c989586a6fc16ff854c4fcc8651b86c5d3bd1fc83057650/aiohttp-3.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:358a6af0145bc4dda037f13167bef3cce54b132087acc4c295c739d05d16b1c3", size = 1579548, upload-time = "2026-03-28T17:16:23.588Z" }, + { url = "https://files.pythonhosted.org/packages/6c/58/e1289661a32161e24c1fe479711d783067210d266842523752869cc1d9c2/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:898ea1850656d7d61832ef06aa9846ab3ddb1621b74f46de78fbc5e1a586ba83", size = 1714669, upload-time = "2026-03-28T17:16:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/96/0a/3e86d039438a74a86e6a948a9119b22540bae037d6ba317a042ae3c22711/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7bc30cceb710cf6a44e9617e43eebb6e3e43ad855a34da7b4b6a73537d8a6763", size = 1754175, upload-time = "2026-03-28T17:16:28.18Z" }, + { url = "https://files.pythonhosted.org/packages/f4/30/e717fc5df83133ba467a560b6d8ef20197037b4bb5d7075b90037de1018e/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4a31c0c587a8a038f19a4c7e60654a6c899c9de9174593a13e7cc6e15ff271f9", size = 1762049, upload-time = "2026-03-28T17:16:30.941Z" }, + { url = "https://files.pythonhosted.org/packages/e4/28/8f7a2d4492e336e40005151bdd94baf344880a4707573378579f833a64c1/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2062f675f3fe6e06d6113eb74a157fb9df58953ffed0cdb4182554b116545758", size = 1570861, upload-time = "2026-03-28T17:16:32.953Z" }, + { url = "https://files.pythonhosted.org/packages/78/45/12e1a3d0645968b1c38de4b23fdf270b8637735ea057d4f84482ff918ad9/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d1ba8afb847ff80626d5e408c1fdc99f942acc877d0702fe137015903a220a9", size = 1790003, upload-time = "2026-03-28T17:16:35.468Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/60374e18d590de16dcb39d6ff62f39c096c1b958e6f37727b5870026ea30/aiohttp-3.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b08149419994cdd4d5eecf7fd4bc5986b5a9380285bcd01ab4c0d6bfca47b79d", size = 1737289, upload-time = "2026-03-28T17:16:38.187Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ac/892f4162df9b115b4758d615f32ec63d00f3084c705ff5526630887b9b42/aiohttp-3.13.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:63dd5e5b1e43b8fb1e91b79b7ceba1feba588b317d1edff385084fcc7a0a4538", size = 745744, upload-time = "2026-03-28T17:16:44.67Z" }, + { url = "https://files.pythonhosted.org/packages/97/a9/c5b87e4443a2f0ea88cb3000c93a8fdad1ee63bffc9ded8d8c8e0d66efc6/aiohttp-3.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:746ac3cc00b5baea424dacddea3ec2c2702f9590de27d837aa67004db1eebc6e", size = 498178, upload-time = "2026-03-28T17:16:46.766Z" }, + { url = "https://files.pythonhosted.org/packages/94/42/07e1b543a61250783650df13da8ddcdc0d0a5538b2bd15cef6e042aefc61/aiohttp-3.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bda8f16ea99d6a6705e5946732e48487a448be874e54a4f73d514660ff7c05d3", size = 498331, upload-time = "2026-03-28T17:16:48.9Z" }, + { url = "https://files.pythonhosted.org/packages/20/d6/492f46bf0328534124772d0cf58570acae5b286ea25006900650f69dae0e/aiohttp-3.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b061e7b5f840391e3f64d0ddf672973e45c4cfff7a0feea425ea24e51530fc2", size = 1744414, upload-time = "2026-03-28T17:16:50.968Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4d/e02627b2683f68051246215d2d62b2d2f249ff7a285e7a858dc47d6b6a14/aiohttp-3.13.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b252e8d5cd66184b570d0d010de742736e8a4fab22c58299772b0c5a466d4b21", size = 1719226, upload-time = "2026-03-28T17:16:53.173Z" }, + { url = "https://files.pythonhosted.org/packages/7b/6c/5d0a3394dd2b9f9aeba6e1b6065d0439e4b75d41f1fb09a3ec010b43552b/aiohttp-3.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:20af8aad61d1803ff11152a26146d8d81c266aa8c5aa9b4504432abb965c36a0", size = 1782110, upload-time = "2026-03-28T17:16:55.362Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2d/c20791e3437700a7441a7edfb59731150322424f5aadf635602d1d326101/aiohttp-3.13.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:13a5cc924b59859ad2adb1478e31f410a7ed46e92a2a619d6d1dd1a63c1a855e", size = 1884809, upload-time = "2026-03-28T17:16:57.734Z" }, + { url = "https://files.pythonhosted.org/packages/c8/94/d99dbfbd1924a87ef643833932eb2a3d9e5eee87656efea7d78058539eff/aiohttp-3.13.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:534913dfb0a644d537aebb4123e7d466d94e3be5549205e6a31f72368980a81a", size = 1764938, upload-time = "2026-03-28T17:17:00.221Z" }, + { url = "https://files.pythonhosted.org/packages/49/61/3ce326a1538781deb89f6cf5e094e2029cd308ed1e21b2ba2278b08426f6/aiohttp-3.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:320e40192a2dcc1cf4b5576936e9652981ab596bf81eb309535db7e2f5b5672f", size = 1570697, upload-time = "2026-03-28T17:17:02.985Z" }, + { url = "https://files.pythonhosted.org/packages/b6/77/4ab5a546857bb3028fbaf34d6eea180267bdab022ee8b1168b1fcde4bfdd/aiohttp-3.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9e587fcfce2bcf06526a43cb705bdee21ac089096f2e271d75de9c339db3100c", size = 1702258, upload-time = "2026-03-28T17:17:05.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/63/d8f29021e39bc5af8e5d5e9da1b07976fb9846487a784e11e4f4eeda4666/aiohttp-3.13.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9eb9c2eea7278206b5c6c1441fdd9dc420c278ead3f3b2cc87f9b693698cc500", size = 1740287, upload-time = "2026-03-28T17:17:07.712Z" }, + { url = "https://files.pythonhosted.org/packages/55/3a/cbc6b3b124859a11bc8055d3682c26999b393531ef926754a3445b99dfef/aiohttp-3.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:29be00c51972b04bf9d5c8f2d7f7314f48f96070ca40a873a53056e652e805f7", size = 1753011, upload-time = "2026-03-28T17:17:10.053Z" }, + { url = "https://files.pythonhosted.org/packages/e0/30/836278675205d58c1368b21520eab9572457cf19afd23759216c04483048/aiohttp-3.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90c06228a6c3a7c9f776fe4fc0b7ff647fffd3bed93779a6913c804ae00c1073", size = 1566359, upload-time = "2026-03-28T17:17:12.433Z" }, + { url = "https://files.pythonhosted.org/packages/50/b4/8032cc9b82d17e4277704ba30509eaccb39329dc18d6a35f05e424439e32/aiohttp-3.13.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a533ec132f05fd9a1d959e7f34184cd7d5e8511584848dab85faefbaac573069", size = 1785537, upload-time = "2026-03-28T17:17:14.721Z" }, + { url = "https://files.pythonhosted.org/packages/17/7d/5873e98230bde59f493bf1f7c3e327486a4b5653fa401144704df5d00211/aiohttp-3.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1c946f10f413836f82ea4cfb90200d2a59578c549f00857e03111cf45ad01ca5", size = 1740752, upload-time = "2026-03-28T17:17:17.387Z" }, + { url = "https://files.pythonhosted.org/packages/6d/29/6657cc37ae04cacc2dbf53fb730a06b6091cc4cbe745028e047c53e6d840/aiohttp-3.13.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:e0a2c961fc92abeff61d6444f2ce6ad35bb982db9fc8ff8a47455beacf454a57", size = 749363, upload-time = "2026-03-28T17:17:24.044Z" }, + { url = "https://files.pythonhosted.org/packages/90/7f/30ccdf67ca3d24b610067dc63d64dcb91e5d88e27667811640644aa4a85d/aiohttp-3.13.4-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:153274535985a0ff2bff1fb6c104ed547cec898a09213d21b0f791a44b14d933", size = 499317, upload-time = "2026-03-28T17:17:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/93/13/e372dd4e68ad04ee25dafb050c7f98b0d91ea643f7352757e87231102555/aiohttp-3.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:351f3171e2458da3d731ce83f9e6b9619e325c45cbd534c7759750cabf453ad7", size = 500477, upload-time = "2026-03-28T17:17:28.279Z" }, + { url = "https://files.pythonhosted.org/packages/e5/fe/ee6298e8e586096fb6f5eddd31393d8544f33ae0792c71ecbb4c2bef98ac/aiohttp-3.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f989ac8bc5595ff761a5ccd32bdb0768a117f36dd1504b1c2c074ed5d3f4df9c", size = 1737227, upload-time = "2026-03-28T17:17:30.587Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b9/a7a0463a09e1a3fe35100f74324f23644bfc3383ac5fd5effe0722a5f0b7/aiohttp-3.13.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d36fc1709110ec1e87a229b201dd3ddc32aa01e98e7868083a794609b081c349", size = 1694036, upload-time = "2026-03-28T17:17:33.29Z" }, + { url = "https://files.pythonhosted.org/packages/57/7c/8972ae3fb7be00a91aee6b644b2a6a909aedb2c425269a3bfd90115e6f8f/aiohttp-3.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42adaeea83cbdf069ab94f5103ce0787c21fb1a0153270da76b59d5578302329", size = 1786814, upload-time = "2026-03-28T17:17:36.035Z" }, + { url = "https://files.pythonhosted.org/packages/93/01/c81e97e85c774decbaf0d577de7d848934e8166a3a14ad9f8aa5be329d28/aiohttp-3.13.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:92deb95469928cc41fd4b42a95d8012fa6df93f6b1c0a83af0ffbc4a5e218cde", size = 1866676, upload-time = "2026-03-28T17:17:38.441Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5f/5b46fe8694a639ddea2cd035bf5729e4677ea882cb251396637e2ef1590d/aiohttp-3.13.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0c7c07c4257ef3a1df355f840bc62d133bcdef5c1c5ba75add3c08553e2eed", size = 1740842, upload-time = "2026-03-28T17:17:40.783Z" }, + { url = "https://files.pythonhosted.org/packages/20/a2/0d4b03d011cca6b6b0acba8433193c1e484efa8d705ea58295590fe24203/aiohttp-3.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f062c45de8a1098cb137a1898819796a2491aec4e637a06b03f149315dff4d8f", size = 1566508, upload-time = "2026-03-28T17:17:43.235Z" }, + { url = "https://files.pythonhosted.org/packages/98/17/e689fd500da52488ec5f889effd6404dece6a59de301e380f3c64f167beb/aiohttp-3.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:76093107c531517001114f0ebdb4f46858ce818590363e3e99a4a2280334454a", size = 1700569, upload-time = "2026-03-28T17:17:46.165Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0d/66402894dbcf470ef7db99449e436105ea862c24f7ea4c95c683e635af35/aiohttp-3.13.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6f6ec32162d293b82f8b63a16edc80769662fbd5ae6fbd4936d3206a2c2cc63b", size = 1707407, upload-time = "2026-03-28T17:17:48.825Z" }, + { url = "https://files.pythonhosted.org/packages/2f/eb/af0ab1a3650092cbd8e14ef29e4ab0209e1460e1c299996c3f8288b3f1ff/aiohttp-3.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5903e2db3d202a00ad9f0ec35a122c005e85d90c9836ab4cda628f01edf425e2", size = 1752214, upload-time = "2026-03-28T17:17:51.206Z" }, + { url = "https://files.pythonhosted.org/packages/5a/bf/72326f8a98e4c666f292f03c385545963cc65e358835d2a7375037a97b57/aiohttp-3.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2d5bea57be7aca98dbbac8da046d99b5557c5cf4e28538c4c786313078aca09e", size = 1562162, upload-time = "2026-03-28T17:17:53.634Z" }, + { url = "https://files.pythonhosted.org/packages/67/9f/13b72435f99151dd9a5469c96b3b5f86aa29b7e785ca7f35cf5e538f74c0/aiohttp-3.13.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:bcf0c9902085976edc0232b75006ef38f89686901249ce14226b6877f88464fb", size = 1768904, upload-time = "2026-03-28T17:17:55.991Z" }, + { url = "https://files.pythonhosted.org/packages/18/bc/28d4970e7d5452ac7776cdb5431a1164a0d9cf8bd2fffd67b4fb463aa56d/aiohttp-3.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3295f98bfeed2e867cab588f2a146a9db37a85e3ae9062abf46ba062bd29165", size = 1723378, upload-time = "2026-03-28T17:17:58.348Z" }, + { url = "https://files.pythonhosted.org/packages/47/fb/e41b63c6ce71b07a59243bb8f3b457ee0c3402a619acb9d2c0d21ef0e647/aiohttp-3.13.4-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45abbbf09a129825d13c18c7d3182fecd46d9da3cfc383756145394013604ac1", size = 781549, upload-time = "2026-03-28T17:18:05.779Z" }, + { url = "https://files.pythonhosted.org/packages/97/53/532b8d28df1e17e44c4d9a9368b78dcb6bf0b51037522136eced13afa9e8/aiohttp-3.13.4-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:74c80b2bc2c2adb7b3d1941b2b60701ee2af8296fc8aad8b8bc48bc25767266c", size = 514383, upload-time = "2026-03-28T17:18:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/1b/1f/62e5d400603e8468cd635812d99cb81cfdc08127a3dc474c647615f31339/aiohttp-3.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c97989ae40a9746650fa196894f317dafc12227c808c774929dda0ff873a5954", size = 518304, upload-time = "2026-03-28T17:18:10.642Z" }, + { url = "https://files.pythonhosted.org/packages/90/57/2326b37b10896447e3c6e0cbef4fe2486d30913639a5cfd1332b5d870f82/aiohttp-3.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dae86be9811493f9990ef44fff1685f5c1a3192e9061a71a109d527944eed551", size = 1893433, upload-time = "2026-03-28T17:18:13.121Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b4/a24d82112c304afdb650167ef2fe190957d81cbddac7460bedd245f765aa/aiohttp-3.13.4-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1db491abe852ca2fa6cc48a3341985b0174b3741838e1341b82ac82c8bd9e871", size = 1755901, upload-time = "2026-03-28T17:18:16.21Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2d/0883ef9d878d7846287f036c162a951968f22aabeef3ac97b0bea6f76d5d/aiohttp-3.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0e5d701c0aad02a7dce72eef6b93226cf3734330f1a31d69ebbf69f33b86666e", size = 1876093, upload-time = "2026-03-28T17:18:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/ad/52/9204bb59c014869b71971addad6778f005daa72a96eed652c496789d7468/aiohttp-3.13.4-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8ac32a189081ae0a10ba18993f10f338ec94341f0d5df8fff348043962f3c6f8", size = 1970815, upload-time = "2026-03-28T17:18:21.858Z" }, + { url = "https://files.pythonhosted.org/packages/d6/b5/e4eb20275a866dde0f570f411b36c6b48f7b53edfe4f4071aa1b0728098a/aiohttp-3.13.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98e968cdaba43e45c73c3f306fca418c8009a957733bac85937c9f9cf3f4de27", size = 1816223, upload-time = "2026-03-28T17:18:24.729Z" }, + { url = "https://files.pythonhosted.org/packages/d8/23/e98075c5bb146aa61a1239ee1ac7714c85e814838d6cebbe37d3fe19214a/aiohttp-3.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca114790c9144c335d538852612d3e43ea0f075288f4849cf4b05d6cd2238ce7", size = 1649145, upload-time = "2026-03-28T17:18:27.269Z" }, + { url = "https://files.pythonhosted.org/packages/d6/c1/7bad8be33bb06c2bb224b6468874346026092762cbec388c3bdb65a368ee/aiohttp-3.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ea2e071661ba9cfe11eabbc81ac5376eaeb3061f6e72ec4cc86d7cdd1ffbdbbb", size = 1816562, upload-time = "2026-03-28T17:18:29.847Z" }, + { url = "https://files.pythonhosted.org/packages/5c/10/c00323348695e9a5e316825969c88463dcc24c7e9d443244b8a2c9cf2eae/aiohttp-3.13.4-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:34e89912b6c20e0fd80e07fa401fd218a410aa1ce9f1c2f1dad6db1bd0ce0927", size = 1800333, upload-time = "2026-03-28T17:18:32.269Z" }, + { url = "https://files.pythonhosted.org/packages/84/43/9b2147a1df3559f49bd723e22905b46a46c068a53adb54abdca32c4de180/aiohttp-3.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0e217cf9f6a42908c52b46e42c568bd57adc39c9286ced31aaace614b6087965", size = 1820617, upload-time = "2026-03-28T17:18:35.238Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7f/b3481a81e7a586d02e99387b18c6dafff41285f6efd3daa2124c01f87eae/aiohttp-3.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:0c296f1221e21ba979f5ac1964c3b78cfde15c5c5f855ffd2caab337e9cd9182", size = 1643417, upload-time = "2026-03-28T17:18:37.949Z" }, + { url = "https://files.pythonhosted.org/packages/8f/72/07181226bc99ce1124e0f89280f5221a82d3ae6a6d9d1973ce429d48e52b/aiohttp-3.13.4-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d99a9d168ebaffb74f36d011750e490085ac418f4db926cce3989c8fe6cb6b1b", size = 1849286, upload-time = "2026-03-28T17:18:40.534Z" }, + { url = "https://files.pythonhosted.org/packages/1a/e6/1b3566e103eca6da5be4ae6713e112a053725c584e96574caf117568ffef/aiohttp-3.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cb19177205d93b881f3f89e6081593676043a6828f59c78c17a0fd6c1fbed2ba", size = 1782635, upload-time = "2026-03-28T17:18:43.073Z" }, ] [[package]] From aed9abe48c02b1b7df07e429db3f2ed8c3a58ce8 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:38:22 -0700 Subject: [PATCH 095/113] Feature: Replace Whoosh with tantivy search backend (#12471) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Claude Sonnet 4.6 Co-authored-by: Antoine Mérino <3023499+Merinorus@users.noreply.github.com> --- .../s6-overlay/s6-rc.d/init-search-index/run | 28 +- docs/administration.md | 47 +- docs/api.md | 5 +- docs/configuration.md | 26 + docs/migration-v3.md | 31 + docs/usage.md | 84 +- pyproject.toml | 4 +- src/documents/admin.py | 15 +- src/documents/bulk_edit.py | 6 +- src/documents/index.py | 675 -------------- .../management/commands/document_index.py | 57 +- ...7_migrate_fulltext_query_field_prefixes.py | 39 + src/documents/models.py | 33 +- src/documents/sanity_checker.py | 17 +- src/documents/search/__init__.py | 21 + src/documents/search/_backend.py | 858 ++++++++++++++++++ src/documents/search/_query.py | 497 ++++++++++ src/documents/search/_schema.py | 165 ++++ src/documents/search/_tokenizer.py | 116 +++ src/documents/serialisers.py | 18 +- src/documents/signals/handlers.py | 13 +- src/documents/tasks.py | 45 +- src/documents/tests/conftest.py | 21 + src/documents/tests/search/__init__.py | 0 src/documents/tests/search/conftest.py | 33 + src/documents/tests/search/test_backend.py | 502 ++++++++++ ...migration_fulltext_query_field_prefixes.py | 138 +++ src/documents/tests/search/test_query.py | 530 +++++++++++ src/documents/tests/search/test_schema.py | 63 ++ src/documents/tests/search/test_tokenizer.py | 78 ++ src/documents/tests/test_admin.py | 33 +- .../tests/test_api_document_versions.py | 37 +- src/documents/tests/test_api_search.py | 421 +++++---- src/documents/tests/test_api_status.py | 30 +- src/documents/tests/test_delayedquery.py | 58 -- src/documents/tests/test_index.py | 371 -------- src/documents/tests/test_management.py | 73 +- src/documents/tests/test_matchables.py | 6 + src/documents/tests/test_tag_hierarchy.py | 4 +- src/documents/tests/test_task_signals.py | 30 +- src/documents/tests/test_tasks.py | 25 +- src/documents/tests/test_workflows.py | 1 + src/documents/tests/utils.py | 6 + src/documents/utils.py | 13 + src/documents/views.py | 236 ++--- src/paperless/settings/__init__.py | 51 ++ src/paperless/settings/parsers.py | 2 +- .../parsers/test_tesseract_custom_settings.py | 5 + src/paperless/tests/settings/test_settings.py | 45 + src/paperless/views.py | 19 +- src/paperless_ai/indexing.py | 14 +- uv.lock | 113 ++- 52 files changed, 4050 insertions(+), 1708 deletions(-) delete mode 100644 src/documents/index.py create mode 100644 src/documents/migrations/0017_migrate_fulltext_query_field_prefixes.py create mode 100644 src/documents/search/__init__.py create mode 100644 src/documents/search/_backend.py create mode 100644 src/documents/search/_query.py create mode 100644 src/documents/search/_schema.py create mode 100644 src/documents/search/_tokenizer.py create mode 100644 src/documents/tests/search/__init__.py create mode 100644 src/documents/tests/search/conftest.py create mode 100644 src/documents/tests/search/test_backend.py create mode 100644 src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py create mode 100644 src/documents/tests/search/test_query.py create mode 100644 src/documents/tests/search/test_schema.py create mode 100644 src/documents/tests/search/test_tokenizer.py delete mode 100644 src/documents/tests/test_delayedquery.py delete mode 100644 src/documents/tests/test_index.py diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-search-index/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-search-index/run index 2208faf67..8f6feeb7f 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-search-index/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-search-index/run @@ -3,26 +3,10 @@ declare -r log_prefix="[init-index]" -declare -r index_version=9 -declare -r data_dir="${PAPERLESS_DATA_DIR:-/usr/src/paperless/data}" -declare -r index_version_file="${data_dir}/.index_version" - -update_index () { - echo "${log_prefix} Search index out of date. Updating..." - cd "${PAPERLESS_SRC_DIR}" - if [[ -n "${USER_IS_NON_ROOT}" ]]; then - python3 manage.py document_index reindex --no-progress-bar - echo ${index_version} | tee "${index_version_file}" > /dev/null - else - s6-setuidgid paperless python3 manage.py document_index reindex --no-progress-bar - echo ${index_version} | s6-setuidgid paperless tee "${index_version_file}" > /dev/null - fi -} - -if [[ (! -f "${index_version_file}") ]]; then - echo "${log_prefix} No index version file found" - update_index -elif [[ $(<"${index_version_file}") != "$index_version" ]]; then - echo "${log_prefix} index version updated" - update_index +echo "${log_prefix} Checking search index..." +cd "${PAPERLESS_SRC_DIR}" +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_index reindex --if-needed --no-progress-bar +else + s6-setuidgid paperless python3 manage.py document_index reindex --if-needed --no-progress-bar fi diff --git a/docs/administration.md b/docs/administration.md index e55b899f5..013ac9fdd 100644 --- a/docs/administration.md +++ b/docs/administration.md @@ -180,6 +180,16 @@ following: This might not actually do anything. Not every new paperless version comes with new database migrations. +4. Rebuild the search index if needed. + + ```shell-session + cd src + python3 manage.py document_index reindex --if-needed + ``` + + This is a no-op if the index is already up to date, so it is safe to + run on every upgrade. + ### Database Upgrades Paperless-ngx is compatible with Django-supported versions of PostgreSQL and MariaDB and it is generally @@ -453,17 +463,42 @@ the search yields non-existing documents or won't find anything, you may need to recreate the index manually. ``` -document_index {reindex,optimize} +document_index {reindex,optimize} [--recreate] [--if-needed] ``` -Specify `reindex` to have the index created from scratch. This may take -some time. +Specify `reindex` to rebuild the index from all documents in the database. This +may take some time. -Specify `optimize` to optimize the index. This updates certain aspects -of the index and usually makes queries faster and also ensures that the -autocompletion works properly. This command is regularly invoked by the +Pass `--recreate` to wipe the existing index before rebuilding. Use this when the +index is corrupted or you want a fully clean rebuild. + +Pass `--if-needed` to skip the rebuild if the index is already up to date (schema +version and search language match). Safe to run on every startup or upgrade. + +Specify `optimize` to optimize the index. This command is regularly invoked by the task scheduler. +!!! note + + The `optimize` subcommand is deprecated and is now a no-op. Tantivy manages + segment merging automatically; no manual optimization step is needed. + +!!! note + + **Docker users:** On every startup, the container runs + `document_index reindex --if-needed` automatically. Schema changes, language + changes, and missing indexes are all detected and rebuilt before the webserver + starts. No manual step is required. + + **Bare metal users:** Run the following command after each upgrade (and after + changing `PAPERLESS_SEARCH_LANGUAGE`). It is a no-op if the index is already + up to date: + + ```shell-session + cd src + python3 manage.py document_index reindex --if-needed + ``` + ### Clearing the database read cache If the database read cache is enabled, **you must run this command** after making any changes to the database outside the application context. diff --git a/docs/api.md b/docs/api.md index 21c6b140f..2284d9d29 100644 --- a/docs/api.md +++ b/docs/api.md @@ -167,9 +167,8 @@ Query parameters: - `term`: The incomplete term. - `limit`: Amount of results. Defaults to 10. -Results returned by the endpoint are ordered by importance of the term -in the document index. The first result is the term that has the highest -[Tf/Idf](https://en.wikipedia.org/wiki/Tf%E2%80%93idf) score in the index. +Results are ordered by how many of the user's visible documents contain +each matching word. The first result is the word that appears in the most documents. ```json ["term1", "term3", "term6", "term4"] diff --git a/docs/configuration.md b/docs/configuration.md index 4ce2d9dc6..a22171ce9 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1103,6 +1103,32 @@ should be a valid crontab(5) expression describing when to run. Defaults to `0 0 * * *` or daily at midnight. +#### [`PAPERLESS_SEARCH_LANGUAGE=`](#PAPERLESS_SEARCH_LANGUAGE) {#PAPERLESS_SEARCH_LANGUAGE} + +: Sets the stemmer language for the full-text search index. +Stemming improves recall by matching word variants (e.g. "running" matches "run"). +Changing this setting causes the index to be rebuilt automatically on next startup. +An invalid value raises an error at startup. + +: Use the ISO 639-1 two-letter code (e.g. `en`, `de`, `fr`). Lowercase full names +(e.g. `english`, `german`, `french`) are also accepted. The capitalized names shown +in the [Tantivy Language enum](https://docs.rs/tantivy/latest/tantivy/tokenizer/enum.Language.html) +documentation are **not** valid — use the lowercase equivalent. + +: If not set, paperless infers the language from +[`PAPERLESS_OCR_LANGUAGE`](#PAPERLESS_OCR_LANGUAGE). If the OCR language has no +Tantivy stemmer equivalent, stemming is disabled. + + Defaults to unset (inferred from `PAPERLESS_OCR_LANGUAGE`). + +#### [`PAPERLESS_ADVANCED_FUZZY_SEARCH_THRESHOLD=`](#PAPERLESS_ADVANCED_FUZZY_SEARCH_THRESHOLD) {#PAPERLESS_ADVANCED_FUZZY_SEARCH_THRESHOLD} + +: When set to a float value, approximate/fuzzy matching is applied alongside exact +matching. Fuzzy results rank below exact matches. A value of `0.5` is a reasonable +starting point. Leave unset to disable fuzzy matching entirely. + + Defaults to unset (disabled). + #### [`PAPERLESS_SANITY_TASK_CRON=`](#PAPERLESS_SANITY_TASK_CRON) {#PAPERLESS_SANITY_TASK_CRON} : Configures the scheduled sanity checker frequency. The value should be a diff --git a/docs/migration-v3.md b/docs/migration-v3.md index 4c728a6a4..1cfb212ff 100644 --- a/docs/migration-v3.md +++ b/docs/migration-v3.md @@ -104,6 +104,37 @@ Multiple options are combined in a single value: PAPERLESS_DB_OPTIONS="sslmode=require;sslrootcert=/certs/ca.pem;pool.max_size=10" ``` +## Search Index (Whoosh -> Tantivy) + +The full-text search backend has been replaced with [Tantivy](https://github.com/quickwit-oss/tantivy). +The index format is incompatible with Whoosh, so **the search index is automatically rebuilt from +scratch on first startup after upgrading**. No manual action is required for the rebuild itself. + +### Note and custom field search syntax + +The old Whoosh index exposed `note` and `custom_field` as flat text fields that were included in +unqualified searches (e.g. just typing `invoice` would match note content). With Tantivy these are +now structured JSON fields accessed via dotted paths: + +| Old syntax | New syntax | +| -------------------- | --------------------------- | +| `note:query` | `notes.note:query` | +| `custom_field:query` | `custom_fields.value:query` | + +**Saved views are migrated automatically.** Any saved view filter rule that used an explicit +`note:` or `custom_field:` field prefix in a fulltext query is rewritten to the new syntax by a +data migration that runs on upgrade. + +**Unqualified queries are not migrated.** If you had a saved view with a plain search term (e.g. +`invoice`) that happened to match note content or custom field values, it will no longer return +those matches. Update those queries to use the explicit prefix, for example: + +``` +invoice OR notes.note:invoice OR custom_fields.value:invoice +``` + +Custom field names can also be searched with `custom_fields.name:fieldname`. + ## OpenID Connect Token Endpoint Authentication Some existing OpenID Connect setups may require an explicit token endpoint authentication method after upgrading to v3. diff --git a/docs/usage.md b/docs/usage.md index 6da6c4d77..4e2def93b 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -804,13 +804,20 @@ contract you signed 8 years ago). When you search paperless for a document, it tries to match this query against your documents. Paperless will look for matching documents by -inspecting their content, title, correspondent, type and tags. Paperless -returns a scored list of results, so that documents matching your query -better will appear further up in the search results. +inspecting their content, title, correspondent, type, tags, notes, and +custom field values. Paperless returns a scored list of results, so that +documents matching your query better will appear further up in the search +results. By default, paperless returns only documents which contain all words -typed in the search bar. However, paperless also offers advanced search -syntax if you want to drill down the results further. +typed in the search bar. A few things to know about how matching works: + +- **Word-order-independent**: "invoice unpaid" and "unpaid invoice" return the same results. +- **Accent-insensitive**: searching `resume` also finds `résumé`, `cafe` finds `café`. +- **Separator-agnostic**: punctuation and separators are stripped during indexing, so + searching a partial number like `1312` finds documents containing `A-1312/B`. + +Paperless also offers advanced search syntax if you want to drill down further. Matching documents with logical expressions: @@ -839,18 +846,69 @@ Matching inexact words: produ*name ``` +Matching natural date keywords: + +``` +added:today +modified:yesterday +created:this_week +added:last_month +modified:this_year +``` + +Supported date keywords: `today`, `yesterday`, `this_week`, `last_week`, +`this_month`, `last_month`, `this_year`, `last_year`. + +#### Searching custom fields + +Custom field values are included in the full-text index, so a plain search +already matches documents whose custom field values contain your search terms. +To narrow by field name or value specifically: + +``` +custom_fields.value:policy +custom_fields.name:"Contract Number" +custom_fields.name:Insurance custom_fields.value:policy +``` + +- `custom_fields.value` matches against the value of any custom field. +- `custom_fields.name` matches the name of the field (use quotes for multi-word names). +- Combine both to find documents where a specific named field contains a specific value. + +Because separators are stripped during indexing, individual parts of formatted +codes are searchable on their own. A value stored as `A-1312/99.50` produces the +tokens `a`, `1312`, `99`, `50` — each searchable independently: + +``` +custom_fields.value:1312 +custom_fields.name:"Contract Number" custom_fields.value:1312 +``` + !!! note - Inexact terms are hard for search indexes. These queries might take a - while to execute. That's why paperless offers auto complete and query - correction. + Custom date fields do not support relative date syntax (e.g. `[now to 2 weeks]`). + For date ranges on custom date fields, use the document list filters in the web UI. + +#### Searching notes + +Notes content is included in full-text search automatically. To search +by note author or content specifically: + +``` +notes.user:alice +notes.note:reminder +notes.user:alice notes.note:insurance +``` All of these constructs can be combined as you see fit. If you want to -learn more about the query language used by paperless, paperless uses -Whoosh's default query language. Head over to [Whoosh query -language](https://whoosh.readthedocs.io/en/latest/querylang.html). For -details on what date parsing utilities are available, see [Date -parsing](https://whoosh.readthedocs.io/en/latest/dates.html#parsing-date-queries). +learn more about the query language used by paperless, see the +[Tantivy query language documentation](https://docs.rs/tantivy/latest/tantivy/query/struct.QueryParser.html). + +!!! note + + Fuzzy (approximate) matching can be enabled by setting + [`PAPERLESS_ADVANCED_FUZZY_SEARCH_THRESHOLD`](configuration.md#PAPERLESS_ADVANCED_FUZZY_SEARCH_THRESHOLD). + When enabled, paperless will include near-miss results ranked below exact matches. ## Keyboard shortcuts / hotkeys diff --git a/pyproject.toml b/pyproject.toml index e37a7958f..5af886f0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,11 +74,11 @@ dependencies = [ "scikit-learn~=1.8.0", "sentence-transformers>=4.1", "setproctitle~=1.3.4", + "tantivy>=0.25.1", "tika-client~=0.10.0", "torch~=2.10.0", "watchfiles>=1.1.1", "whitenoise~=6.11", - "whoosh-reloaded>=2.7.5", "zxing-cpp~=3.0.0", ] [project.optional-dependencies] @@ -123,6 +123,7 @@ testing = [ "pytest-rerunfailures~=16.1", "pytest-sugar", "pytest-xdist~=3.8.0", + "time-machine>=2.13", ] typing = [ "celery-types", @@ -310,6 +311,7 @@ markers = [ "greenmail: Tests requiring Greenmail service", "date_parsing: Tests which cover date parsing from content or filename", "management: Tests which cover management commands/functionality", + "search: Tests for the Tantivy search backend", ] [tool.pytest_env] diff --git a/src/documents/admin.py b/src/documents/admin.py index 6c7a6f304..f0e5ccd25 100644 --- a/src/documents/admin.py +++ b/src/documents/admin.py @@ -100,24 +100,23 @@ class DocumentAdmin(GuardedModelAdmin): return Document.global_objects.all() def delete_queryset(self, request, queryset): - from documents import index + from documents.search import get_backend - with index.open_index_writer() as writer: + with get_backend().batch_update() as batch: for o in queryset: - index.remove_document(writer, o) - + batch.remove(o.pk) super().delete_queryset(request, queryset) def delete_model(self, request, obj): - from documents import index + from documents.search import get_backend - index.remove_document_from_index(obj) + get_backend().remove(obj.pk) super().delete_model(request, obj) def save_model(self, request, obj, form, change): - from documents import index + from documents.search import get_backend - index.add_or_update_document(obj) + get_backend().add_or_update(obj) super().save_model(request, obj, form, change) diff --git a/src/documents/bulk_edit.py b/src/documents/bulk_edit.py index 8dbcdb8a4..3f80b699d 100644 --- a/src/documents/bulk_edit.py +++ b/src/documents/bulk_edit.py @@ -349,11 +349,11 @@ def delete(doc_ids: list[int]) -> Literal["OK"]: Document.objects.filter(id__in=delete_ids).delete() - from documents import index + from documents.search import get_backend - with index.open_index_writer() as writer: + with get_backend().batch_update() as batch: for id in delete_ids: - index.remove_document_by_id(writer, id) + batch.remove(id) status_mgr = DocumentsStatusManager() status_mgr.send_documents_deleted(delete_ids) diff --git a/src/documents/index.py b/src/documents/index.py deleted file mode 100644 index 24d74d8c1..000000000 --- a/src/documents/index.py +++ /dev/null @@ -1,675 +0,0 @@ -from __future__ import annotations - -import logging -import math -import re -from collections import Counter -from contextlib import contextmanager -from datetime import UTC -from datetime import datetime -from datetime import time -from datetime import timedelta -from shutil import rmtree -from time import sleep -from typing import TYPE_CHECKING -from typing import Literal - -from dateutil.relativedelta import relativedelta -from django.conf import settings -from django.utils import timezone as django_timezone -from django.utils.timezone import get_current_timezone -from django.utils.timezone import now -from guardian.shortcuts import get_users_with_perms -from whoosh import classify -from whoosh import highlight -from whoosh import query -from whoosh.fields import BOOLEAN -from whoosh.fields import DATETIME -from whoosh.fields import KEYWORD -from whoosh.fields import NUMERIC -from whoosh.fields import TEXT -from whoosh.fields import Schema -from whoosh.highlight import HtmlFormatter -from whoosh.idsets import BitSet -from whoosh.idsets import DocIdSet -from whoosh.index import FileIndex -from whoosh.index import LockError -from whoosh.index import create_in -from whoosh.index import exists_in -from whoosh.index import open_dir -from whoosh.qparser import MultifieldParser -from whoosh.qparser import QueryParser -from whoosh.qparser.dateparse import DateParserPlugin -from whoosh.qparser.dateparse import English -from whoosh.qparser.plugins import FieldsPlugin -from whoosh.scoring import TF_IDF -from whoosh.util.times import timespan -from whoosh.writing import AsyncWriter - -from documents.models import CustomFieldInstance -from documents.models import Document -from documents.models import Note -from documents.models import User - -if TYPE_CHECKING: - from django.db.models import QuerySet - from whoosh.reading import IndexReader - from whoosh.searching import ResultsPage - from whoosh.searching import Searcher - -logger = logging.getLogger("paperless.index") - - -def get_schema() -> Schema: - return Schema( - id=NUMERIC(stored=True, unique=True), - title=TEXT(sortable=True), - content=TEXT(), - asn=NUMERIC(sortable=True, signed=False), - correspondent=TEXT(sortable=True), - correspondent_id=NUMERIC(), - has_correspondent=BOOLEAN(), - tag=KEYWORD(commas=True, scorable=True, lowercase=True), - tag_id=KEYWORD(commas=True, scorable=True), - has_tag=BOOLEAN(), - type=TEXT(sortable=True), - type_id=NUMERIC(), - has_type=BOOLEAN(), - created=DATETIME(sortable=True), - modified=DATETIME(sortable=True), - added=DATETIME(sortable=True), - path=TEXT(sortable=True), - path_id=NUMERIC(), - has_path=BOOLEAN(), - notes=TEXT(), - num_notes=NUMERIC(sortable=True, signed=False), - custom_fields=TEXT(), - custom_field_count=NUMERIC(sortable=True, signed=False), - has_custom_fields=BOOLEAN(), - custom_fields_id=KEYWORD(commas=True), - owner=TEXT(), - owner_id=NUMERIC(), - has_owner=BOOLEAN(), - viewer_id=KEYWORD(commas=True), - checksum=TEXT(), - page_count=NUMERIC(sortable=True), - original_filename=TEXT(sortable=True), - is_shared=BOOLEAN(), - ) - - -def open_index(*, recreate=False) -> FileIndex: - transient_exceptions = (FileNotFoundError, LockError) - max_retries = 3 - retry_delay = 0.1 - - for attempt in range(max_retries + 1): - try: - if exists_in(settings.INDEX_DIR) and not recreate: - return open_dir(settings.INDEX_DIR, schema=get_schema()) - break - except transient_exceptions as exc: - is_last_attempt = attempt == max_retries or recreate - if is_last_attempt: - logger.exception( - "Error while opening the index after retries, recreating.", - ) - break - - logger.warning( - "Transient error while opening the index (attempt %s/%s): %s. Retrying.", - attempt + 1, - max_retries + 1, - exc, - ) - sleep(retry_delay) - except Exception: - logger.exception("Error while opening the index, recreating.") - break - - # create_in doesn't handle corrupted indexes very well, remove the directory entirely first - if settings.INDEX_DIR.is_dir(): - rmtree(settings.INDEX_DIR) - settings.INDEX_DIR.mkdir(parents=True, exist_ok=True) - - return create_in(settings.INDEX_DIR, get_schema()) - - -@contextmanager -def open_index_writer(*, optimize=False) -> AsyncWriter: - writer = AsyncWriter(open_index()) - - try: - yield writer - except Exception as e: - logger.exception(str(e)) - writer.cancel() - finally: - writer.commit(optimize=optimize) - - -@contextmanager -def open_index_searcher() -> Searcher: - searcher = open_index().searcher() - - try: - yield searcher - finally: - searcher.close() - - -def update_document( - writer: AsyncWriter, - doc: Document, - effective_content: str | None = None, -) -> None: - tags = ",".join([t.name for t in doc.tags.all()]) - tags_ids = ",".join([str(t.id) for t in doc.tags.all()]) - notes = ",".join([str(c.note) for c in Note.objects.filter(document=doc)]) - custom_fields = ",".join( - [str(c) for c in CustomFieldInstance.objects.filter(document=doc)], - ) - custom_fields_ids = ",".join( - [str(f.field.id) for f in CustomFieldInstance.objects.filter(document=doc)], - ) - asn: int | None = doc.archive_serial_number - if asn is not None and ( - asn < Document.ARCHIVE_SERIAL_NUMBER_MIN - or asn > Document.ARCHIVE_SERIAL_NUMBER_MAX - ): - logger.error( - f"Not indexing Archive Serial Number {asn} of document {doc.pk}. " - f"ASN is out of range " - f"[{Document.ARCHIVE_SERIAL_NUMBER_MIN:,}, " - f"{Document.ARCHIVE_SERIAL_NUMBER_MAX:,}.", - ) - asn = 0 - users_with_perms = get_users_with_perms( - doc, - only_with_perms_in=["view_document"], - ) - viewer_ids: str = ",".join([str(u.id) for u in users_with_perms]) - writer.update_document( - id=doc.pk, - title=doc.title, - content=effective_content or doc.content, - correspondent=doc.correspondent.name if doc.correspondent else None, - correspondent_id=doc.correspondent.id if doc.correspondent else None, - has_correspondent=doc.correspondent is not None, - tag=tags if tags else None, - tag_id=tags_ids if tags_ids else None, - has_tag=len(tags) > 0, - type=doc.document_type.name if doc.document_type else None, - type_id=doc.document_type.id if doc.document_type else None, - has_type=doc.document_type is not None, - created=datetime.combine(doc.created, time.min), - added=doc.added, - asn=asn, - modified=doc.modified, - path=doc.storage_path.name if doc.storage_path else None, - path_id=doc.storage_path.id if doc.storage_path else None, - has_path=doc.storage_path is not None, - notes=notes, - num_notes=len(notes), - custom_fields=custom_fields, - custom_field_count=len(doc.custom_fields.all()), - has_custom_fields=len(custom_fields) > 0, - custom_fields_id=custom_fields_ids if custom_fields_ids else None, - owner=doc.owner.username if doc.owner else None, - owner_id=doc.owner.id if doc.owner else None, - has_owner=doc.owner is not None, - viewer_id=viewer_ids if viewer_ids else None, - checksum=doc.checksum, - page_count=doc.page_count, - original_filename=doc.original_filename, - is_shared=len(viewer_ids) > 0, - ) - logger.debug(f"Index updated for document {doc.pk}.") - - -def remove_document(writer: AsyncWriter, doc: Document) -> None: - remove_document_by_id(writer, doc.pk) - - -def remove_document_by_id(writer: AsyncWriter, doc_id) -> None: - writer.delete_by_term("id", doc_id) - - -def add_or_update_document( - document: Document, - effective_content: str | None = None, -) -> None: - with open_index_writer() as writer: - update_document(writer, document, effective_content=effective_content) - - -def remove_document_from_index(document: Document) -> None: - with open_index_writer() as writer: - remove_document(writer, document) - - -class MappedDocIdSet(DocIdSet): - """ - A DocIdSet backed by a set of `Document` IDs. - Supports efficiently looking up if a whoosh docnum is in the provided `filter_queryset`. - """ - - def __init__(self, filter_queryset: QuerySet, ixreader: IndexReader) -> None: - super().__init__() - document_ids = filter_queryset.order_by("id").values_list("id", flat=True) - max_id = document_ids.last() or 0 - self.document_ids = BitSet(document_ids, size=max_id) - self.ixreader = ixreader - - def __contains__(self, docnum) -> bool: - document_id = self.ixreader.stored_fields(docnum)["id"] - return document_id in self.document_ids - - def __bool__(self) -> Literal[True]: - # searcher.search ignores a filter if it's "falsy". - # We use this hack so this DocIdSet, when used as a filter, is never ignored. - return True - - -class DelayedQuery: - def _get_query(self): - raise NotImplementedError # pragma: no cover - - def _get_query_sortedby(self) -> tuple[None, Literal[False]] | tuple[str, bool]: - if "ordering" not in self.query_params: - return None, False - - field: str = self.query_params["ordering"] - - sort_fields_map: dict[str, str] = { - "created": "created", - "modified": "modified", - "added": "added", - "title": "title", - "correspondent__name": "correspondent", - "document_type__name": "type", - "archive_serial_number": "asn", - "num_notes": "num_notes", - "owner": "owner", - "page_count": "page_count", - } - - if field.startswith("-"): - field = field[1:] - reverse = True - else: - reverse = False - - if field not in sort_fields_map: - return None, False - else: - return sort_fields_map[field], reverse - - def __init__( - self, - searcher: Searcher, - query_params, - page_size, - filter_queryset: QuerySet, - ) -> None: - self.searcher = searcher - self.query_params = query_params - self.page_size = page_size - self.saved_results = dict() - self.first_score = None - self.filter_queryset = filter_queryset - self.suggested_correction = None - self._manual_hits_cache: list | None = None - - def __len__(self) -> int: - if self._manual_sort_requested(): - manual_hits = self._manual_hits() - return len(manual_hits) - - page = self[0:1] - return len(page) - - def _manual_sort_requested(self): - ordering = self.query_params.get("ordering", "") - return ordering.lstrip("-").startswith("custom_field_") - - def _manual_hits(self): - if self._manual_hits_cache is None: - q, mask, suggested_correction = self._get_query() - self.suggested_correction = suggested_correction - - results = self.searcher.search( - q, - mask=mask, - filter=MappedDocIdSet(self.filter_queryset, self.searcher.ixreader), - limit=None, - ) - results.fragmenter = highlight.ContextFragmenter(surround=50) - results.formatter = HtmlFormatter(tagname="span", between=" ... ") - - if not self.first_score and len(results) > 0: - self.first_score = results[0].score - - if self.first_score: - results.top_n = [ - ( - (hit[0] / self.first_score) if self.first_score else None, - hit[1], - ) - for hit in results.top_n - ] - - hits_by_id = {hit["id"]: hit for hit in results} - matching_ids = list(hits_by_id.keys()) - - ordered_ids = list( - self.filter_queryset.filter(id__in=matching_ids).values_list( - "id", - flat=True, - ), - ) - ordered_ids = list(dict.fromkeys(ordered_ids)) - - self._manual_hits_cache = [ - hits_by_id[_id] for _id in ordered_ids if _id in hits_by_id - ] - return self._manual_hits_cache - - def get_result_ids(self) -> list[int]: - """ - Return all matching document IDs for the current query and ordering. - """ - if self._manual_sort_requested(): - return [hit["id"] for hit in self._manual_hits()] - - q, mask, suggested_correction = self._get_query() - self.suggested_correction = suggested_correction - sortedby, reverse = self._get_query_sortedby() - results = self.searcher.search( - q, - mask=mask, - filter=MappedDocIdSet(self.filter_queryset, self.searcher.ixreader), - limit=None, - sortedby=sortedby, - reverse=reverse, - ) - return [hit["id"] for hit in results] - - def __getitem__(self, item): - if item.start in self.saved_results: - return self.saved_results[item.start] - - if self._manual_sort_requested(): - manual_hits = self._manual_hits() - start = 0 if item.start is None else item.start - stop = item.stop - hits = manual_hits[start:stop] if stop is not None else manual_hits[start:] - page = ManualResultsPage(hits) - self.saved_results[start] = page - return page - - q, mask, suggested_correction = self._get_query() - self.suggested_correction = suggested_correction - sortedby, reverse = self._get_query_sortedby() - - page: ResultsPage = self.searcher.search_page( - q, - mask=mask, - filter=MappedDocIdSet(self.filter_queryset, self.searcher.ixreader), - pagenum=math.floor(item.start / self.page_size) + 1, - pagelen=self.page_size, - sortedby=sortedby, - reverse=reverse, - ) - page.results.fragmenter = highlight.ContextFragmenter(surround=50) - page.results.formatter = HtmlFormatter(tagname="span", between=" ... ") - - if not self.first_score and len(page.results) > 0 and sortedby is None: - self.first_score = page.results[0].score - - page.results.top_n = [ - ( - (hit[0] / self.first_score) if self.first_score else None, - hit[1], - ) - for hit in page.results.top_n - ] - - self.saved_results[item.start] = page - - return page - - -class ManualResultsPage(list): - def __init__(self, hits) -> None: - super().__init__(hits) - self.results = ManualResults(hits) - - -class ManualResults: - def __init__(self, hits) -> None: - self._docnums = [hit.docnum for hit in hits] - - def docs(self): - return self._docnums - - -class LocalDateParser(English): - def reverse_timezone_offset(self, d): - return (d.replace(tzinfo=django_timezone.get_current_timezone())).astimezone( - UTC, - ) - - def date_from(self, *args, **kwargs): - d = super().date_from(*args, **kwargs) - if isinstance(d, timespan): - d.start = self.reverse_timezone_offset(d.start) - d.end = self.reverse_timezone_offset(d.end) - elif isinstance(d, datetime): - d = self.reverse_timezone_offset(d) - return d - - -class DelayedFullTextQuery(DelayedQuery): - def _get_query(self) -> tuple: - q_str = self.query_params["query"] - q_str = rewrite_natural_date_keywords(q_str) - qp = MultifieldParser( - [ - "content", - "title", - "correspondent", - "tag", - "type", - "notes", - "custom_fields", - ], - self.searcher.ixreader.schema, - ) - qp.add_plugin( - DateParserPlugin( - basedate=django_timezone.now(), - dateparser=LocalDateParser(), - ), - ) - q = qp.parse(q_str) - suggested_correction = None - try: - corrected = self.searcher.correct_query(q, q_str) - if corrected.string != q_str: - corrected_results = self.searcher.search( - corrected.query, - limit=1, - filter=MappedDocIdSet(self.filter_queryset, self.searcher.ixreader), - scored=False, - ) - if len(corrected_results) > 0: - suggested_correction = corrected.string - except Exception as e: - logger.info( - "Error while correcting query %s: %s", - f"{q_str!r}", - e, - ) - - return q, None, suggested_correction - - -class DelayedMoreLikeThisQuery(DelayedQuery): - def _get_query(self) -> tuple: - more_like_doc_id = int(self.query_params["more_like_id"]) - content = Document.objects.get(id=more_like_doc_id).content - - docnum = self.searcher.document_number(id=more_like_doc_id) - kts = self.searcher.key_terms_from_text( - "content", - content, - numterms=20, - model=classify.Bo1Model, - normalize=False, - ) - q = query.Or( - [query.Term("content", word, boost=weight) for word, weight in kts], - ) - mask: set = {docnum} - - return q, mask, None - - -def autocomplete( - ix: FileIndex, - term: str, - limit: int = 10, - user: User | None = None, -) -> list: - """ - Mimics whoosh.reading.IndexReader.most_distinctive_terms with permissions - and without scoring - """ - terms = [] - - with ix.searcher(weighting=TF_IDF()) as s: - qp = QueryParser("content", schema=ix.schema) - # Don't let searches with a query that happen to match a field override the - # content field query instead and return bogus, not text data - qp.remove_plugin_class(FieldsPlugin) - q = qp.parse(f"{term.lower()}*") - user_criterias: list = get_permissions_criterias(user) - - results = s.search( - q, - terms=True, - filter=query.Or(user_criterias) if user_criterias is not None else None, - ) - - termCounts = Counter() - if results.has_matched_terms(): - for hit in results: - for _, match in hit.matched_terms(): - termCounts[match] += 1 - terms = [t for t, _ in termCounts.most_common(limit)] - - term_encoded: bytes = term.encode("UTF-8") - if term_encoded in terms: - terms.insert(0, terms.pop(terms.index(term_encoded))) - - return terms - - -def get_permissions_criterias(user: User | None = None) -> list: - user_criterias = [query.Term("has_owner", text=False)] - if user is not None: - if user.is_superuser: # superusers see all docs - user_criterias = [] - else: - user_criterias.append(query.Term("owner_id", user.id)) - user_criterias.append( - query.Term("viewer_id", str(user.id)), - ) - return user_criterias - - -def rewrite_natural_date_keywords(query_string: str) -> str: - """ - Rewrites natural date keywords (e.g. added:today or added:"yesterday") to UTC range syntax for Whoosh. - This resolves timezone issues with date parsing in Whoosh as well as adding support for more - natural date keywords. - """ - - tz = get_current_timezone() - local_now = now().astimezone(tz) - today = local_now.date() - - # all supported Keywords - pattern = r"(\b(?:added|created|modified))\s*:\s*[\"']?(today|yesterday|this month|previous month|previous week|previous quarter|this year|previous year)[\"']?" - - def repl(m): - field = m.group(1) - keyword = m.group(2).lower() - - match keyword: - case "today": - start = datetime.combine(today, time.min, tzinfo=tz) - end = datetime.combine(today, time.max, tzinfo=tz) - - case "yesterday": - yesterday = today - timedelta(days=1) - start = datetime.combine(yesterday, time.min, tzinfo=tz) - end = datetime.combine(yesterday, time.max, tzinfo=tz) - - case "this month": - start = datetime(local_now.year, local_now.month, 1, 0, 0, 0, tzinfo=tz) - end = start + relativedelta(months=1) - timedelta(seconds=1) - - case "previous month": - this_month_start = datetime( - local_now.year, - local_now.month, - 1, - 0, - 0, - 0, - tzinfo=tz, - ) - start = this_month_start - relativedelta(months=1) - end = this_month_start - timedelta(seconds=1) - - case "this year": - start = datetime(local_now.year, 1, 1, 0, 0, 0, tzinfo=tz) - end = datetime(local_now.year, 12, 31, 23, 59, 59, tzinfo=tz) - - case "previous week": - days_since_monday = local_now.weekday() - this_week_start = datetime.combine( - today - timedelta(days=days_since_monday), - time.min, - tzinfo=tz, - ) - start = this_week_start - timedelta(days=7) - end = this_week_start - timedelta(seconds=1) - - case "previous quarter": - current_quarter = (local_now.month - 1) // 3 + 1 - this_quarter_start_month = (current_quarter - 1) * 3 + 1 - this_quarter_start = datetime( - local_now.year, - this_quarter_start_month, - 1, - 0, - 0, - 0, - tzinfo=tz, - ) - start = this_quarter_start - relativedelta(months=3) - end = this_quarter_start - timedelta(seconds=1) - - case "previous year": - start = datetime(local_now.year - 1, 1, 1, 0, 0, 0, tzinfo=tz) - end = datetime(local_now.year - 1, 12, 31, 23, 59, 59, tzinfo=tz) - - # Convert to UTC and format - start_str = start.astimezone(UTC).strftime("%Y%m%d%H%M%S") - end_str = end.astimezone(UTC).strftime("%Y%m%d%H%M%S") - return f"{field}:[{start_str} TO {end_str}]" - - return re.sub(pattern, repl, query_string, flags=re.IGNORECASE) diff --git a/src/documents/management/commands/document_index.py b/src/documents/management/commands/document_index.py index 742922010..c4f72dd3a 100644 --- a/src/documents/management/commands/document_index.py +++ b/src/documents/management/commands/document_index.py @@ -1,11 +1,26 @@ +import logging + +from django.conf import settings from django.db import transaction from documents.management.commands.base import PaperlessCommand -from documents.tasks import index_optimize -from documents.tasks import index_reindex +from documents.models import Document +from documents.search import get_backend +from documents.search import needs_rebuild +from documents.search import reset_backend +from documents.search import wipe_index + +logger = logging.getLogger("paperless.management.document_index") class Command(PaperlessCommand): + """ + Django management command for search index operations. + + Provides subcommands for reindexing documents and optimizing the search index. + Supports conditional reindexing based on schema version and language changes. + """ + help = "Manages the document index." supports_progress_bar = True @@ -14,15 +29,49 @@ class Command(PaperlessCommand): def add_arguments(self, parser): super().add_arguments(parser) parser.add_argument("command", choices=["reindex", "optimize"]) + parser.add_argument( + "--recreate", + action="store_true", + default=False, + help="Wipe and recreate the index from scratch (only used with reindex).", + ) + parser.add_argument( + "--if-needed", + action="store_true", + default=False, + help=( + "Skip reindex if the index is already up to date. " + "Checks schema version and search language sentinels. " + "Safe to run on every startup or upgrade." + ), + ) def handle(self, *args, **options): with transaction.atomic(): if options["command"] == "reindex": - index_reindex( + if options.get("if_needed") and not needs_rebuild(settings.INDEX_DIR): + self.stdout.write("Search index is up to date.") + return + if options.get("recreate"): + wipe_index(settings.INDEX_DIR) + + documents = Document.objects.select_related( + "correspondent", + "document_type", + "storage_path", + "owner", + ).prefetch_related("tags", "notes", "custom_fields", "versions") + get_backend().rebuild( + documents, iter_wrapper=lambda docs: self.track( docs, description="Indexing documents...", ), ) + reset_backend() + elif options["command"] == "optimize": - index_optimize() + logger.info( + "document_index optimize is a no-op — Tantivy manages " + "segment merging automatically.", + ) diff --git a/src/documents/migrations/0017_migrate_fulltext_query_field_prefixes.py b/src/documents/migrations/0017_migrate_fulltext_query_field_prefixes.py new file mode 100644 index 000000000..040780a60 --- /dev/null +++ b/src/documents/migrations/0017_migrate_fulltext_query_field_prefixes.py @@ -0,0 +1,39 @@ +import re + +from django.db import migrations + +# Matches "note:" when NOT preceded by a word character or dot. +# This avoids false positives like "denote:" or already-migrated "notes.note:". +# Handles start-of-string, whitespace, parentheses, +/- operators per Whoosh syntax. +_NOTE_RE = re.compile(r"(? "custom_fields.value:" +_CUSTOM_FIELD_RE = re.compile(r"(? str: - value = ( - next( - option.get("label") - for option in self.field.extra_data["select_options"] - if option.get("id") == self.value_select - ) - if ( - self.field.data_type == CustomField.FieldDataType.SELECT - and self.value_select is not None - ) - else self.value - ) - return str(self.field.name) + f" : {value}" + return str(self.field.name) + f" : {self.value_for_search}" @classmethod def get_value_field_name(cls, data_type: CustomField.FieldDataType): @@ -1144,6 +1132,25 @@ class CustomFieldInstance(SoftDeleteModel): value_field_name = self.get_value_field_name(self.field.data_type) return getattr(self, value_field_name) + @property + def value_for_search(self) -> str | None: + """ + Return the value suitable for full-text indexing and display, or None + if the value is unset. + + For SELECT fields, resolves the human-readable label rather than the + opaque option ID stored in value_select. + """ + if self.value is None: + return None + if self.field.data_type == CustomField.FieldDataType.SELECT: + options = (self.field.extra_data or {}).get("select_options", []) + return next( + (o["label"] for o in options if o.get("id") == self.value), + None, + ) + return str(self.value) + if settings.AUDIT_LOG_ENABLED: auditlog.register( diff --git a/src/documents/sanity_checker.py b/src/documents/sanity_checker.py index b53ed8cfb..0b3dea368 100644 --- a/src/documents/sanity_checker.py +++ b/src/documents/sanity_checker.py @@ -9,19 +9,14 @@ to wrap the document queryset (e.g., with a progress bar). The default is an identity function that adds no overhead. """ -from __future__ import annotations - import logging import uuid from collections import defaultdict -from collections.abc import Callable -from collections.abc import Iterable from collections.abc import Iterator from pathlib import Path from typing import TYPE_CHECKING from typing import Final from typing import TypedDict -from typing import TypeVar from celery import states from django.conf import settings @@ -29,14 +24,13 @@ from django.utils import timezone from documents.models import Document from documents.models import PaperlessTask +from documents.utils import IterWrapper from documents.utils import compute_checksum +from documents.utils import identity from paperless.config import GeneralConfig logger = logging.getLogger("paperless.sanity_checker") -_T = TypeVar("_T") -IterWrapper = Callable[[Iterable[_T]], Iterable[_T]] - class MessageEntry(TypedDict): """A single sanity check message with its severity level.""" @@ -45,11 +39,6 @@ class MessageEntry(TypedDict): message: str -def _identity(iterable: Iterable[_T]) -> Iterable[_T]: - """Pass through an iterable unchanged (default iter_wrapper).""" - return iterable - - class SanityCheckMessages: """Collects sanity check messages grouped by document primary key. @@ -296,7 +285,7 @@ def _check_document( def check_sanity( *, scheduled: bool = True, - iter_wrapper: IterWrapper[Document] = _identity, + iter_wrapper: IterWrapper[Document] = identity, ) -> SanityCheckMessages: """Run a full sanity check on the document archive. diff --git a/src/documents/search/__init__.py b/src/documents/search/__init__.py new file mode 100644 index 000000000..b0a89f242 --- /dev/null +++ b/src/documents/search/__init__.py @@ -0,0 +1,21 @@ +from documents.search._backend import SearchIndexLockError +from documents.search._backend import SearchResults +from documents.search._backend import TantivyBackend +from documents.search._backend import TantivyRelevanceList +from documents.search._backend import WriteBatch +from documents.search._backend import get_backend +from documents.search._backend import reset_backend +from documents.search._schema import needs_rebuild +from documents.search._schema import wipe_index + +__all__ = [ + "SearchIndexLockError", + "SearchResults", + "TantivyBackend", + "TantivyRelevanceList", + "WriteBatch", + "get_backend", + "needs_rebuild", + "reset_backend", + "wipe_index", +] diff --git a/src/documents/search/_backend.py b/src/documents/search/_backend.py new file mode 100644 index 000000000..a1bff8a9f --- /dev/null +++ b/src/documents/search/_backend.py @@ -0,0 +1,858 @@ +from __future__ import annotations + +import logging +import threading +import unicodedata +from collections import Counter +from dataclasses import dataclass +from datetime import UTC +from datetime import datetime +from typing import TYPE_CHECKING +from typing import Self +from typing import TypedDict +from typing import TypeVar + +import filelock +import regex +import tantivy +from django.conf import settings +from django.utils.timezone import get_current_timezone +from guardian.shortcuts import get_users_with_perms + +from documents.search._query import build_permission_filter +from documents.search._query import parse_user_query +from documents.search._schema import _write_sentinels +from documents.search._schema import build_schema +from documents.search._schema import open_or_rebuild_index +from documents.search._schema import wipe_index +from documents.search._tokenizer import register_tokenizers +from documents.utils import IterWrapper +from documents.utils import identity + +if TYPE_CHECKING: + from pathlib import Path + + from django.contrib.auth.base_user import AbstractBaseUser + from django.db.models import QuerySet + + from documents.models import Document + +logger = logging.getLogger("paperless.search") + +_WORD_RE = regex.compile(r"\w+") +_AUTOCOMPLETE_REGEX_TIMEOUT = 1.0 # seconds; guards against ReDoS on untrusted content + +T = TypeVar("T") + + +def _ascii_fold(s: str) -> str: + """ + Normalize unicode to ASCII equivalent characters for search consistency. + + Converts accented characters (e.g., "café") to their ASCII base forms ("cafe") + to enable cross-language searching without requiring exact diacritic matching. + """ + return unicodedata.normalize("NFD", s).encode("ascii", "ignore").decode() + + +def _extract_autocomplete_words(text_sources: list[str]) -> set[str]: + """Extract and normalize words for autocomplete. + + Splits on non-word characters (matching Tantivy's simple tokenizer), lowercases, + and ascii-folds each token. Uses the regex library with a timeout to guard against + ReDoS on untrusted document content. + """ + words = set() + for text in text_sources: + if not text: + continue + try: + tokens = _WORD_RE.findall(text, timeout=_AUTOCOMPLETE_REGEX_TIMEOUT) + except TimeoutError: # pragma: no cover + logger.warning( + "Autocomplete word extraction timed out for a text source; skipping.", + ) + continue + for token in tokens: + normalized = _ascii_fold(token.lower()) + if normalized: + words.add(normalized) + return words + + +class SearchHit(TypedDict): + """Type definition for search result hits.""" + + id: int + score: float + rank: int + highlights: dict[str, str] + + +@dataclass(frozen=True, slots=True) +class SearchResults: + """ + Container for search results with pagination metadata. + + Attributes: + hits: List of search results with scores and highlights + total: Total matching documents across all pages (for pagination) + query: Preprocessed query string after date/syntax rewriting + """ + + hits: list[SearchHit] + total: int # total matching documents (for pagination) + query: str # preprocessed query string + + +class TantivyRelevanceList: + """ + DRF-compatible list wrapper for Tantivy search hits. + + Provides paginated access to search results while storing all hits in memory + for efficient ID retrieval. Used by Django REST framework for pagination. + + Methods: + __len__: Returns total hit count for pagination calculations + __getitem__: Slices the hit list for page-specific results + + Note: Stores ALL post-filter hits so get_all_result_ids() can return + every matching document ID without requiring a second search query. + """ + + def __init__(self, hits: list[SearchHit]) -> None: + self._hits = hits + + def __len__(self) -> int: + return len(self._hits) + + def __getitem__(self, key: slice) -> list[SearchHit]: + return self._hits[key] + + +class SearchIndexLockError(Exception): + """Raised when the search index file lock cannot be acquired within the timeout.""" + + +class WriteBatch: + """ + Context manager for bulk index operations with file locking. + + Provides transactional batch updates to the search index with proper + concurrency control via file locking. All operations within the batch + are committed atomically or rolled back on exception. + + Usage: + with backend.batch_update() as batch: + batch.add_or_update(document) + batch.remove(doc_id) + """ + + def __init__(self, backend: TantivyBackend, lock_timeout: float): + self._backend = backend + self._lock_timeout = lock_timeout + self._writer = None + self._lock = None + + def __enter__(self) -> Self: + if self._backend._path is not None: + lock_path = self._backend._path / ".tantivy.lock" + self._lock = filelock.FileLock(str(lock_path)) + try: + self._lock.acquire(timeout=self._lock_timeout) + except filelock.Timeout as e: # pragma: no cover + raise SearchIndexLockError( + f"Could not acquire index lock within {self._lock_timeout}s", + ) from e + + self._writer = self._backend._index.writer() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + try: + if exc_type is None: + self._writer.commit() + self._backend._index.reload() + # Explicitly delete writer to release tantivy's internal lock. + # On exception the uncommitted writer is simply discarded. + if self._writer is not None: + del self._writer + self._writer = None + finally: + if self._lock is not None: + self._lock.release() + + def add_or_update( + self, + document: Document, + effective_content: str | None = None, + ) -> None: + """ + Add or update a document in the batch. + + Implements upsert behavior by deleting any existing document with the same ID + and adding the new version. This ensures stale document data (e.g., after + permission changes) doesn't persist in the index. + + Args: + document: Django Document instance to index + effective_content: Override document.content for indexing (used when + re-indexing with newer OCR text from document versions) + """ + self.remove(document.pk) + doc = self._backend._build_tantivy_doc(document, effective_content) + self._writer.add_document(doc) + + def remove(self, doc_id: int) -> None: + """ + Remove a document from the batch by its primary key. + + Uses range query instead of term query to work around unsigned integer + type detection bug in tantivy-py 0.25. + """ + # Use range query to work around u64 deletion bug + self._writer.delete_documents_by_query( + tantivy.Query.range_query( + self._backend._schema, + "id", + tantivy.FieldType.Unsigned, + doc_id, + doc_id, + ), + ) + + +class TantivyBackend: + """ + Tantivy search backend with explicit lifecycle management. + + Provides full-text search capabilities using the Tantivy search engine. + Supports in-memory indexes (for testing) and persistent on-disk indexes + (for production use). Handles document indexing, search queries, autocompletion, + and "more like this" functionality. + + The backend manages its own connection lifecycle and can be reset when + the underlying index directory changes (e.g., during test isolation). + """ + + def __init__(self, path: Path | None = None): + # path=None → in-memory index (for tests) + # path=some_dir → on-disk index (for production) + self._path = path + self._index = None + self._schema = None + + def open(self) -> None: + """ + Open or rebuild the index as needed. + + For disk-based indexes, checks if rebuilding is needed due to schema + version or language changes. Registers custom tokenizers after opening. + Safe to call multiple times - subsequent calls are no-ops. + """ + if self._index is not None: + return # pragma: no cover + if self._path is not None: + self._index = open_or_rebuild_index(self._path) + else: + self._index = tantivy.Index(build_schema()) + register_tokenizers(self._index, settings.SEARCH_LANGUAGE) + self._schema = self._index.schema + + def close(self) -> None: + """ + Close the index and release resources. + + Safe to call multiple times - subsequent calls are no-ops. + """ + self._index = None + self._schema = None + + def _ensure_open(self) -> None: + """Ensure the index is open before operations.""" + if self._index is None: + self.open() # pragma: no cover + + def _build_tantivy_doc( + self, + document: Document, + effective_content: str | None = None, + ) -> tantivy.Document: + """Build a tantivy Document from a Django Document instance. + + ``effective_content`` overrides ``document.content`` for indexing — + used when re-indexing a root document with a newer version's OCR text. + """ + content = ( + effective_content if effective_content is not None else document.content + ) + + doc = tantivy.Document() + + # Basic fields + doc.add_unsigned("id", document.pk) + doc.add_text("checksum", document.checksum) + doc.add_text("title", document.title) + doc.add_text("title_sort", document.title) + doc.add_text("content", content) + doc.add_text("bigram_content", content) + + # Original filename - only add if not None/empty + if document.original_filename: + doc.add_text("original_filename", document.original_filename) + + # Correspondent + if document.correspondent: + doc.add_text("correspondent", document.correspondent.name) + doc.add_text("correspondent_sort", document.correspondent.name) + doc.add_unsigned("correspondent_id", document.correspondent_id) + + # Document type + if document.document_type: + doc.add_text("document_type", document.document_type.name) + doc.add_text("type_sort", document.document_type.name) + doc.add_unsigned("document_type_id", document.document_type_id) + + # Storage path + if document.storage_path: + doc.add_text("storage_path", document.storage_path.name) + doc.add_unsigned("storage_path_id", document.storage_path_id) + + # Tags — collect names for autocomplete in the same pass + tag_names: list[str] = [] + for tag in document.tags.all(): + doc.add_text("tag", tag.name) + doc.add_unsigned("tag_id", tag.pk) + tag_names.append(tag.name) + + # Notes — JSON for structured queries (notes.user:alice, notes.note:text), + # companion text field for default full-text search. + num_notes = 0 + for note in document.notes.all(): + num_notes += 1 + doc.add_json("notes", {"note": note.note, "user": note.user.username}) + + # Custom fields — JSON for structured queries (custom_fields.name:x, custom_fields.value:y), + # companion text field for default full-text search. + for cfi in document.custom_fields.all(): + search_value = cfi.value_for_search + # Skip fields where there is no value yet + if search_value is None: + continue + doc.add_json( + "custom_fields", + { + "name": cfi.field.name, + "value": search_value, + }, + ) + + # Dates + created_date = datetime( + document.created.year, + document.created.month, + document.created.day, + tzinfo=UTC, + ) + doc.add_date("created", created_date) + doc.add_date("modified", document.modified) + doc.add_date("added", document.added) + + if document.archive_serial_number is not None: + doc.add_unsigned("asn", document.archive_serial_number) + + if document.page_count is not None: + doc.add_unsigned("page_count", document.page_count) + + doc.add_unsigned("num_notes", num_notes) + + # Owner + if document.owner_id: + doc.add_unsigned("owner_id", document.owner_id) + + # Viewers with permission + users_with_perms = get_users_with_perms( + document, + only_with_perms_in=["view_document"], + ) + for user in users_with_perms: + doc.add_unsigned("viewer_id", user.pk) + + # Autocomplete words + text_sources = [document.title, content] + if document.correspondent: + text_sources.append(document.correspondent.name) + if document.document_type: + text_sources.append(document.document_type.name) + text_sources.extend(tag_names) + + for word in sorted(_extract_autocomplete_words(text_sources)): + doc.add_text("autocomplete_word", word) + + return doc + + def add_or_update( + self, + document: Document, + effective_content: str | None = None, + ) -> None: + """ + Add or update a single document with file locking. + + Convenience method for single-document updates. For bulk operations, + use batch_update() context manager for better performance. + + Args: + document: Django Document instance to index + effective_content: Override document.content for indexing + """ + self._ensure_open() + with self.batch_update(lock_timeout=5.0) as batch: + batch.add_or_update(document, effective_content) + + def remove(self, doc_id: int) -> None: + """ + Remove a single document from the index with file locking. + + Convenience method for single-document removal. For bulk operations, + use batch_update() context manager for better performance. + + Args: + doc_id: Primary key of the document to remove + """ + self._ensure_open() + with self.batch_update(lock_timeout=5.0) as batch: + batch.remove(doc_id) + + def search( + self, + query: str, + user: AbstractBaseUser | None, + page: int, + page_size: int, + sort_field: str | None, + *, + sort_reverse: bool, + ) -> SearchResults: + """ + Execute a search query against the document index. + + Processes the user query through date rewriting, normalization, and + permission filtering before executing against Tantivy. Supports both + relevance-based and field-based sorting. + + Args: + query: User's search query (supports natural date keywords, field filters) + user: User for permission filtering (None for superuser/no filtering) + page: Page number (1-indexed) for pagination + page_size: Number of results per page + sort_field: Field to sort by (None for relevance ranking) + sort_reverse: Whether to reverse the sort order + + Returns: + SearchResults with hits, total count, and processed query + """ + self._ensure_open() + tz = get_current_timezone() + user_query = parse_user_query(self._index, query, tz) + + # Apply permission filter if user is not None (not superuser) + if user is not None: + permission_filter = build_permission_filter(self._schema, user) + final_query = tantivy.Query.boolean_query( + [ + (tantivy.Occur.Must, user_query), + (tantivy.Occur.Must, permission_filter), + ], + ) + else: + final_query = user_query + + searcher = self._index.searcher() + offset = (page - 1) * page_size + + # Map sort fields + sort_field_map = { + "title": "title_sort", + "correspondent__name": "correspondent_sort", + "document_type__name": "type_sort", + "created": "created", + "added": "added", + "modified": "modified", + "archive_serial_number": "asn", + "page_count": "page_count", + "num_notes": "num_notes", + } + + # Perform search + if sort_field and sort_field in sort_field_map: + mapped_field = sort_field_map[sort_field] + results = searcher.search( + final_query, + limit=offset + page_size, + order_by_field=mapped_field, + order=tantivy.Order.Desc if sort_reverse else tantivy.Order.Asc, + ) + # Field sorting: hits are still (score, DocAddress) tuples; score unused + all_hits = [(hit[1], 0.0) for hit in results.hits] + else: + # Score-based search: hits are (score, DocAddress) tuples + results = searcher.search(final_query, limit=offset + page_size) + all_hits = [(hit[1], hit[0]) for hit in results.hits] + + total = results.count + + # Normalize scores for score-based searches + if not sort_field and all_hits: + max_score = max(hit[1] for hit in all_hits) or 1.0 + all_hits = [(hit[0], hit[1] / max_score) for hit in all_hits] + + # Apply threshold filter if configured (score-based search only) + threshold = settings.ADVANCED_FUZZY_SEARCH_THRESHOLD + if threshold is not None and not sort_field: + all_hits = [hit for hit in all_hits if hit[1] >= threshold] + + # Get the page's hits + page_hits = all_hits[offset : offset + page_size] + + # Build result hits with highlights + hits: list[SearchHit] = [] + snippet_generator = None + + for rank, (doc_address, score) in enumerate(page_hits, start=offset + 1): + # Get the actual document from the searcher using the doc address + actual_doc = searcher.doc(doc_address) + doc_dict = actual_doc.to_dict() + doc_id = doc_dict["id"][0] + + highlights: dict[str, str] = {} + + # Generate highlights if score > 0 + if score > 0: + try: + if snippet_generator is None: + snippet_generator = tantivy.SnippetGenerator.create( + searcher, + final_query, + self._schema, + "content", + ) + + content_snippet = snippet_generator.snippet_from_doc(actual_doc) + if content_snippet: + highlights["content"] = str(content_snippet) + + # Try notes highlights + if "notes" in doc_dict: + notes_generator = tantivy.SnippetGenerator.create( + searcher, + final_query, + self._schema, + "notes", + ) + notes_snippet = notes_generator.snippet_from_doc(actual_doc) + if notes_snippet: + highlights["notes"] = str(notes_snippet) + + except Exception: # pragma: no cover + logger.debug("Failed to generate highlights for doc %s", doc_id) + + hits.append( + SearchHit( + id=doc_id, + score=score, + rank=rank, + highlights=highlights, + ), + ) + + return SearchResults( + hits=hits, + total=total, + query=query, + ) + + def autocomplete( + self, + term: str, + limit: int, + user: AbstractBaseUser | None = None, + ) -> list[str]: + """ + Get autocomplete suggestions for search queries. + + Returns words that start with the given term prefix, ranked by document + frequency (how many documents contain each word). Optionally filters + results to only words from documents visible to the specified user. + + Args: + term: Prefix to match against autocomplete words + limit: Maximum number of suggestions to return + user: User for permission filtering (None for no filtering) + + Returns: + List of word suggestions ordered by frequency, then alphabetically + """ + self._ensure_open() + normalized_term = _ascii_fold(term.lower()) + + searcher = self._index.searcher() + + # Apply permission filter for non-superusers so autocomplete words + # from invisible documents don't leak to other users. + if user is not None and not user.is_superuser: + base_query = build_permission_filter(self._schema, user) + else: + base_query = tantivy.Query.all_query() + + results = searcher.search(base_query, limit=10000) + + # Count how many visible documents each word appears in. + # Using Counter (not set) preserves per-word document frequency so + # we can rank suggestions by how commonly they occur — the same + # signal Whoosh used for Tf/Idf-based autocomplete ordering. + word_counts: Counter[str] = Counter() + for _score, doc_address in results.hits: + stored_doc = searcher.doc(doc_address) + doc_dict = stored_doc.to_dict() + if "autocomplete_word" in doc_dict: + word_counts.update(doc_dict["autocomplete_word"]) + + # Filter to prefix matches, sort by document frequency descending; + # break ties alphabetically for stable, deterministic output. + matches = sorted( + (w for w in word_counts if w.startswith(normalized_term)), + key=lambda w: (-word_counts[w], w), + ) + + return matches[:limit] + + def more_like_this( + self, + doc_id: int, + user: AbstractBaseUser | None, + page: int, + page_size: int, + ) -> SearchResults: + """ + Find documents similar to the given document using content analysis. + + Uses Tantivy's "more like this" query to find documents with similar + content patterns. The original document is excluded from results. + + Args: + doc_id: Primary key of the reference document + user: User for permission filtering (None for no filtering) + page: Page number (1-indexed) for pagination + page_size: Number of results per page + + Returns: + SearchResults with similar documents (excluding the original) + """ + self._ensure_open() + searcher = self._index.searcher() + + # First find the document address + id_query = tantivy.Query.range_query( + self._schema, + "id", + tantivy.FieldType.Unsigned, + doc_id, + doc_id, + ) + results = searcher.search(id_query, limit=1) + + if not results.hits: + # Document not found + return SearchResults(hits=[], total=0, query=f"more_like:{doc_id}") + + # Extract doc_address from (score, doc_address) tuple + doc_address = results.hits[0][1] + + # Build more like this query + mlt_query = tantivy.Query.more_like_this_query( + doc_address, + min_doc_frequency=1, + max_doc_frequency=None, + min_term_frequency=1, + max_query_terms=12, + min_word_length=None, + max_word_length=None, + boost_factor=None, + ) + + # Apply permission filter + if user is not None: + permission_filter = build_permission_filter(self._schema, user) + final_query = tantivy.Query.boolean_query( + [ + (tantivy.Occur.Must, mlt_query), + (tantivy.Occur.Must, permission_filter), + ], + ) + else: + final_query = mlt_query + + # Search + offset = (page - 1) * page_size + results = searcher.search(final_query, limit=offset + page_size) + + total = results.count + # Convert from (score, doc_address) to (doc_address, score) + all_hits = [(hit[1], hit[0]) for hit in results.hits] + + # Normalize scores + if all_hits: + max_score = max(hit[1] for hit in all_hits) or 1.0 + all_hits = [(hit[0], hit[1] / max_score) for hit in all_hits] + + # Get page hits + page_hits = all_hits[offset : offset + page_size] + + # Build results + hits: list[SearchHit] = [] + for rank, (doc_address, score) in enumerate(page_hits, start=offset + 1): + actual_doc = searcher.doc(doc_address) + doc_dict = actual_doc.to_dict() + result_doc_id = doc_dict["id"][0] + + # Skip the original document + if result_doc_id == doc_id: + continue + + hits.append( + SearchHit( + id=result_doc_id, + score=score, + rank=rank, + highlights={}, # MLT doesn't generate highlights + ), + ) + + return SearchResults( + hits=hits, + total=max(0, total - 1), # Subtract 1 for the original document + query=f"more_like:{doc_id}", + ) + + def batch_update(self, lock_timeout: float = 30.0) -> WriteBatch: + """ + Get a batch context manager for bulk index operations. + + Use this for efficient bulk document updates/deletions. All operations + within the batch are committed atomically at the end of the context. + + Args: + lock_timeout: Seconds to wait for file lock acquisition + + Returns: + WriteBatch context manager + + Raises: + SearchIndexLockError: If lock cannot be acquired within timeout + """ + self._ensure_open() + return WriteBatch(self, lock_timeout) + + def rebuild( + self, + documents: QuerySet[Document], + iter_wrapper: IterWrapper[Document] = identity, + ) -> None: + """ + Rebuild the entire search index from scratch. + + Wipes the existing index and re-indexes all provided documents. + On failure, restores the previous index state to keep the backend usable. + + Args: + documents: QuerySet of Document instances to index + iter_wrapper: Optional wrapper function for progress tracking + (e.g., progress bar). Should yield each document unchanged. + """ + # Create new index (on-disk or in-memory) + if self._path is not None: + wipe_index(self._path) + new_index = tantivy.Index(build_schema(), path=str(self._path)) + _write_sentinels(self._path) + else: + new_index = tantivy.Index(build_schema()) + register_tokenizers(new_index, settings.SEARCH_LANGUAGE) + + # Point instance at the new index so _build_tantivy_doc uses it + old_index, old_schema = self._index, self._schema + self._index = new_index + self._schema = new_index.schema + + try: + writer = new_index.writer() + for document in iter_wrapper(documents): + doc = self._build_tantivy_doc( + document, + document.get_effective_content(), + ) + writer.add_document(doc) + writer.commit() + new_index.reload() + except BaseException: # pragma: no cover + # Restore old index on failure so the backend remains usable + self._index = old_index + self._schema = old_schema + raise + + +# Module-level singleton with proper thread safety +_backend: TantivyBackend | None = None +_backend_path: Path | None = None # tracks which INDEX_DIR the singleton uses +_backend_lock = threading.RLock() + + +def get_backend() -> TantivyBackend: + """ + Get the global backend instance with thread safety. + + Returns a singleton TantivyBackend instance, automatically reinitializing + when settings.INDEX_DIR changes. This ensures proper test isolation when + using pytest-xdist or @override_settings that change the index directory. + + Returns: + Thread-safe singleton TantivyBackend instance + """ + global _backend, _backend_path + + current_path: Path = settings.INDEX_DIR + + # Fast path: backend is initialized and path hasn't changed (no lock needed) + if _backend is not None and _backend_path == current_path: + return _backend + + # Slow path: first call, or INDEX_DIR changed between calls + with _backend_lock: + # Double-check after acquiring lock — another thread may have beaten us + if _backend is not None and _backend_path == current_path: + return _backend # pragma: no cover + + if _backend is not None: + _backend.close() + + _backend = TantivyBackend(path=current_path) + _backend.open() + _backend_path = current_path + + return _backend + + +def reset_backend() -> None: + """ + Reset the global backend instance with thread safety. + + Forces creation of a new backend instance on the next get_backend() call. + Used for test isolation and when switching between different index directories. + """ + global _backend, _backend_path + + with _backend_lock: + if _backend is not None: + _backend.close() + _backend = None + _backend_path = None diff --git a/src/documents/search/_query.py b/src/documents/search/_query.py new file mode 100644 index 000000000..212df1516 --- /dev/null +++ b/src/documents/search/_query.py @@ -0,0 +1,497 @@ +from __future__ import annotations + +from datetime import UTC +from datetime import date +from datetime import datetime +from datetime import timedelta +from typing import TYPE_CHECKING +from typing import Final + +import regex +import tantivy +from dateutil.relativedelta import relativedelta +from django.conf import settings + +if TYPE_CHECKING: + from datetime import tzinfo + + from django.contrib.auth.base_user import AbstractBaseUser + +# Maximum seconds any single regex substitution may run. +# Prevents ReDoS on adversarial user-supplied query strings. +_REGEX_TIMEOUT: Final[float] = 1.0 + +_DATE_ONLY_FIELDS = frozenset({"created"}) + +_DATE_KEYWORDS = frozenset( + { + "today", + "yesterday", + "this_week", + "last_week", + "this_month", + "last_month", + "this_year", + "last_year", + }, +) + +_FIELD_DATE_RE = regex.compile( + r"(\w+):(" + "|".join(_DATE_KEYWORDS) + r")\b", +) +_COMPACT_DATE_RE = regex.compile(r"\b(\d{14})\b") +_RELATIVE_RANGE_RE = regex.compile( + r"\[now([+-]\d+[dhm])?\s+TO\s+now([+-]\d+[dhm])?\]", + regex.IGNORECASE, +) +# Whoosh-style relative date range: e.g. [-1 week to now], [-7 days to now] +_WHOOSH_REL_RANGE_RE = regex.compile( + r"\[-(?P\d+)\s+(?Psecond|minute|hour|day|week|month|year)s?\s+to\s+now\]", + regex.IGNORECASE, +) +# Whoosh-style 8-digit date: field:YYYYMMDD — field-aware so timezone can be applied correctly +_DATE8_RE = regex.compile(r"(?P\w+):(?P\d{8})\b") + + +def _fmt(dt: datetime) -> str: + """Format a datetime as an ISO 8601 UTC string for use in Tantivy range queries.""" + return dt.astimezone(UTC).strftime("%Y-%m-%dT%H:%M:%SZ") + + +def _iso_range(lo: datetime, hi: datetime) -> str: + """Format a [lo TO hi] range string in ISO 8601 for Tantivy query syntax.""" + return f"[{_fmt(lo)} TO {_fmt(hi)}]" + + +def _date_only_range(keyword: str, tz: tzinfo) -> str: + """ + For `created` (DateField): use the local calendar date, converted to + midnight UTC boundaries. No offset arithmetic — date only. + """ + + today = datetime.now(tz).date() + + if keyword == "today": + lo = datetime(today.year, today.month, today.day, tzinfo=UTC) + return _iso_range(lo, lo + timedelta(days=1)) + if keyword == "yesterday": + y = today - timedelta(days=1) + lo = datetime(y.year, y.month, y.day, tzinfo=UTC) + hi = datetime(today.year, today.month, today.day, tzinfo=UTC) + return _iso_range(lo, hi) + if keyword == "this_week": + mon = today - timedelta(days=today.weekday()) + lo = datetime(mon.year, mon.month, mon.day, tzinfo=UTC) + return _iso_range(lo, lo + timedelta(weeks=1)) + if keyword == "last_week": + this_mon = today - timedelta(days=today.weekday()) + last_mon = this_mon - timedelta(weeks=1) + lo = datetime(last_mon.year, last_mon.month, last_mon.day, tzinfo=UTC) + hi = datetime(this_mon.year, this_mon.month, this_mon.day, tzinfo=UTC) + return _iso_range(lo, hi) + if keyword == "this_month": + lo = datetime(today.year, today.month, 1, tzinfo=UTC) + if today.month == 12: + hi = datetime(today.year + 1, 1, 1, tzinfo=UTC) + else: + hi = datetime(today.year, today.month + 1, 1, tzinfo=UTC) + return _iso_range(lo, hi) + if keyword == "last_month": + if today.month == 1: + lo = datetime(today.year - 1, 12, 1, tzinfo=UTC) + else: + lo = datetime(today.year, today.month - 1, 1, tzinfo=UTC) + hi = datetime(today.year, today.month, 1, tzinfo=UTC) + return _iso_range(lo, hi) + if keyword == "this_year": + lo = datetime(today.year, 1, 1, tzinfo=UTC) + return _iso_range(lo, datetime(today.year + 1, 1, 1, tzinfo=UTC)) + if keyword == "last_year": + lo = datetime(today.year - 1, 1, 1, tzinfo=UTC) + return _iso_range(lo, datetime(today.year, 1, 1, tzinfo=UTC)) + raise ValueError(f"Unknown keyword: {keyword}") + + +def _datetime_range(keyword: str, tz: tzinfo) -> str: + """ + For `added` / `modified` (DateTimeField, stored as UTC): convert local day + boundaries to UTC — full offset arithmetic required. + """ + + now_local = datetime.now(tz) + today = now_local.date() + + def _midnight(d: date) -> datetime: + return datetime(d.year, d.month, d.day, tzinfo=tz).astimezone(UTC) + + if keyword == "today": + return _iso_range(_midnight(today), _midnight(today + timedelta(days=1))) + if keyword == "yesterday": + y = today - timedelta(days=1) + return _iso_range(_midnight(y), _midnight(today)) + if keyword == "this_week": + mon = today - timedelta(days=today.weekday()) + return _iso_range(_midnight(mon), _midnight(mon + timedelta(weeks=1))) + if keyword == "last_week": + this_mon = today - timedelta(days=today.weekday()) + last_mon = this_mon - timedelta(weeks=1) + return _iso_range(_midnight(last_mon), _midnight(this_mon)) + if keyword == "this_month": + first = today.replace(day=1) + if today.month == 12: + next_first = date(today.year + 1, 1, 1) + else: + next_first = date(today.year, today.month + 1, 1) + return _iso_range(_midnight(first), _midnight(next_first)) + if keyword == "last_month": + this_first = today.replace(day=1) + if today.month == 1: + last_first = date(today.year - 1, 12, 1) + else: + last_first = date(today.year, today.month - 1, 1) + return _iso_range(_midnight(last_first), _midnight(this_first)) + if keyword == "this_year": + return _iso_range( + _midnight(date(today.year, 1, 1)), + _midnight(date(today.year + 1, 1, 1)), + ) + if keyword == "last_year": + return _iso_range( + _midnight(date(today.year - 1, 1, 1)), + _midnight(date(today.year, 1, 1)), + ) + raise ValueError(f"Unknown keyword: {keyword}") + + +def _rewrite_compact_date(query: str) -> str: + """Rewrite Whoosh compact date tokens (14-digit YYYYMMDDHHmmss) to ISO 8601.""" + + def _sub(m: regex.Match[str]) -> str: + raw = m.group(1) + try: + dt = datetime( + int(raw[0:4]), + int(raw[4:6]), + int(raw[6:8]), + int(raw[8:10]), + int(raw[10:12]), + int(raw[12:14]), + tzinfo=UTC, + ) + return dt.strftime("%Y-%m-%dT%H:%M:%SZ") + except ValueError: + return str(m.group(0)) + + try: + return _COMPACT_DATE_RE.sub(_sub, query, timeout=_REGEX_TIMEOUT) + except TimeoutError: # pragma: no cover + raise ValueError( + "Query too complex to process (compact date rewrite timed out)", + ) + + +def _rewrite_relative_range(query: str) -> str: + """Rewrite Whoosh relative ranges ([now-7d TO now]) to concrete ISO 8601 UTC boundaries.""" + + def _sub(m: regex.Match[str]) -> str: + now = datetime.now(UTC) + + def _offset(s: str | None) -> timedelta: + if not s: + return timedelta(0) + sign = 1 if s[0] == "+" else -1 + n, unit = int(s[1:-1]), s[-1] + return ( + sign + * { + "d": timedelta(days=n), + "h": timedelta(hours=n), + "m": timedelta(minutes=n), + }[unit] + ) + + lo, hi = now + _offset(m.group(1)), now + _offset(m.group(2)) + if lo > hi: + lo, hi = hi, lo + return f"[{_fmt(lo)} TO {_fmt(hi)}]" + + try: + return _RELATIVE_RANGE_RE.sub(_sub, query, timeout=_REGEX_TIMEOUT) + except TimeoutError: # pragma: no cover + raise ValueError( + "Query too complex to process (relative range rewrite timed out)", + ) + + +def _rewrite_whoosh_relative_range(query: str) -> str: + """Rewrite Whoosh-style relative date ranges ([-N unit to now]) to ISO 8601. + + Supports: second, minute, hour, day, week, month, year (singular and plural). + Example: ``added:[-1 week to now]`` → ``added:[2025-01-01T… TO 2025-01-08T…]`` + """ + now = datetime.now(UTC) + + def _sub(m: regex.Match[str]) -> str: + n = int(m.group("n")) + unit = m.group("unit").lower() + delta_map: dict[str, timedelta | relativedelta] = { + "second": timedelta(seconds=n), + "minute": timedelta(minutes=n), + "hour": timedelta(hours=n), + "day": timedelta(days=n), + "week": timedelta(weeks=n), + "month": relativedelta(months=n), + "year": relativedelta(years=n), + } + lo = now - delta_map[unit] + return f"[{_fmt(lo)} TO {_fmt(now)}]" + + try: + return _WHOOSH_REL_RANGE_RE.sub(_sub, query, timeout=_REGEX_TIMEOUT) + except TimeoutError: # pragma: no cover + raise ValueError( + "Query too complex to process (Whoosh relative range rewrite timed out)", + ) + + +def _rewrite_8digit_date(query: str, tz: tzinfo) -> str: + """Rewrite field:YYYYMMDD date tokens to an ISO 8601 day range. + + Runs after ``_rewrite_compact_date`` so 14-digit timestamps are already + converted and won't spuriously match here. + + For DateField fields (e.g. ``created``) uses UTC midnight boundaries. + For DateTimeField fields (e.g. ``added``, ``modified``) uses local TZ + midnight boundaries converted to UTC — matching the ``_datetime_range`` + behaviour for keyword dates. + """ + + def _sub(m: regex.Match[str]) -> str: + field = m.group("field") + raw = m.group("date8") + try: + year, month, day = int(raw[0:4]), int(raw[4:6]), int(raw[6:8]) + d = date(year, month, day) + if field in _DATE_ONLY_FIELDS: + lo = datetime(d.year, d.month, d.day, tzinfo=UTC) + hi = lo + timedelta(days=1) + else: + # DateTimeField: use local-timezone midnight → UTC + lo = datetime(d.year, d.month, d.day, tzinfo=tz).astimezone(UTC) + hi = datetime( + (d + timedelta(days=1)).year, + (d + timedelta(days=1)).month, + (d + timedelta(days=1)).day, + tzinfo=tz, + ).astimezone(UTC) + return f"{field}:[{_fmt(lo)} TO {_fmt(hi)}]" + except ValueError: + return m.group(0) + + try: + return _DATE8_RE.sub(_sub, query, timeout=_REGEX_TIMEOUT) + except TimeoutError: # pragma: no cover + raise ValueError( + "Query too complex to process (8-digit date rewrite timed out)", + ) + + +def rewrite_natural_date_keywords(query: str, tz: tzinfo) -> str: + """ + Rewrite natural date syntax to ISO 8601 format for Tantivy compatibility. + + Performs the first stage of query preprocessing, converting various date + formats and keywords to ISO 8601 datetime ranges that Tantivy can parse: + - Compact 14-digit dates (YYYYMMDDHHmmss) + - Whoosh relative ranges ([-7 days to now], [now-1h TO now+2h]) + - 8-digit dates with field awareness (created:20240115) + - Natural keywords (field:today, field:last_week, etc.) + + Args: + query: Raw user query string + tz: Timezone for converting local date boundaries to UTC + + Returns: + Query with date syntax rewritten to ISO 8601 ranges + + Note: + Bare keywords without field prefixes pass through unchanged. + """ + query = _rewrite_compact_date(query) + query = _rewrite_whoosh_relative_range(query) + query = _rewrite_8digit_date(query, tz) + query = _rewrite_relative_range(query) + + def _replace(m: regex.Match[str]) -> str: + field, keyword = m.group(1), m.group(2) + if field in _DATE_ONLY_FIELDS: + return f"{field}:{_date_only_range(keyword, tz)}" + return f"{field}:{_datetime_range(keyword, tz)}" + + try: + return _FIELD_DATE_RE.sub(_replace, query, timeout=_REGEX_TIMEOUT) + except TimeoutError: # pragma: no cover + raise ValueError( + "Query too complex to process (date keyword rewrite timed out)", + ) + + +def normalize_query(query: str) -> str: + """ + Normalize query syntax for better search behavior. + + Expands comma-separated field values to explicit AND clauses and + collapses excessive whitespace for cleaner parsing: + - tag:foo,bar → tag:foo AND tag:bar + - multiple spaces → single spaces + + Args: + query: Query string after date rewriting + + Returns: + Normalized query string ready for Tantivy parsing + """ + + def _expand(m: regex.Match[str]) -> str: + field = m.group(1) + values = [v.strip() for v in m.group(2).split(",") if v.strip()] + return " AND ".join(f"{field}:{v}" for v in values) + + try: + query = regex.sub( + r"(\w+):([^\s\[\]]+(?:,[^\s\[\]]+)+)", + _expand, + query, + timeout=_REGEX_TIMEOUT, + ) + return regex.sub(r" {2,}", " ", query, timeout=_REGEX_TIMEOUT).strip() + except TimeoutError: # pragma: no cover + raise ValueError("Query too complex to process (normalization timed out)") + + +_MAX_U64 = 2**64 - 1 # u64 max — used as inclusive upper bound for "any owner" range + + +def build_permission_filter( + schema: tantivy.Schema, + user: AbstractBaseUser, +) -> tantivy.Query: + """ + Build a query filter for user document permissions. + + Creates a query that matches only documents visible to the specified user + according to paperless-ngx permission rules: + - Public documents (no owner) are visible to all users + - Private documents are visible to their owner + - Documents explicitly shared with the user are visible + + Args: + schema: Tantivy schema for field validation + user: User to check permissions for + + Returns: + Tantivy query that filters results to visible documents + + Implementation Notes: + - Uses range_query instead of term_query to work around unsigned integer + type detection bug in tantivy-py 0.25 + - Uses boolean_query for "no owner" check since exists_query is not + available in tantivy-py 0.25.1 (available in master) + - Uses disjunction_max_query to combine permission clauses with OR logic + """ + owner_any = tantivy.Query.range_query( + schema, + "owner_id", + tantivy.FieldType.Unsigned, + 1, + _MAX_U64, + ) + no_owner = tantivy.Query.boolean_query( + [ + (tantivy.Occur.Must, tantivy.Query.all_query()), + (tantivy.Occur.MustNot, owner_any), + ], + ) + owned = tantivy.Query.range_query( + schema, + "owner_id", + tantivy.FieldType.Unsigned, + user.pk, + user.pk, + ) + shared = tantivy.Query.range_query( + schema, + "viewer_id", + tantivy.FieldType.Unsigned, + user.pk, + user.pk, + ) + return tantivy.Query.disjunction_max_query([no_owner, owned, shared]) + + +DEFAULT_SEARCH_FIELDS = [ + "title", + "content", + "correspondent", + "document_type", + "tag", +] +_FIELD_BOOSTS = {"title": 2.0} + + +def parse_user_query( + index: tantivy.Index, + raw_query: str, + tz: tzinfo, +) -> tantivy.Query: + """ + Parse user query through the complete preprocessing pipeline. + + Transforms the raw user query through multiple stages: + 1. Date keyword rewriting (today → ISO 8601 ranges) + 2. Query normalization (comma expansion, whitespace cleanup) + 3. Tantivy parsing with field boosts + 4. Optional fuzzy query blending (if ADVANCED_FUZZY_SEARCH_THRESHOLD set) + + Args: + index: Tantivy index with registered tokenizers + raw_query: Original user query string + tz: Timezone for date boundary calculations + + Returns: + Parsed Tantivy query ready for execution + + Note: + When ADVANCED_FUZZY_SEARCH_THRESHOLD is configured, adds a low-priority + fuzzy query as a Should clause (0.1 boost) to catch approximate matches + while keeping exact matches ranked higher. The threshold value is applied + as a post-search score filter, not during query construction. + """ + + query_str = rewrite_natural_date_keywords(raw_query, tz) + query_str = normalize_query(query_str) + + exact = index.parse_query( + query_str, + DEFAULT_SEARCH_FIELDS, + field_boosts=_FIELD_BOOSTS, + ) + + threshold = settings.ADVANCED_FUZZY_SEARCH_THRESHOLD + if threshold is not None: + fuzzy = index.parse_query( + query_str, + DEFAULT_SEARCH_FIELDS, + field_boosts=_FIELD_BOOSTS, + # (prefix=True, distance=1, transposition_cost_one=True) — edit-distance fuzziness + fuzzy_fields={f: (True, 1, True) for f in DEFAULT_SEARCH_FIELDS}, + ) + return tantivy.Query.boolean_query( + [ + (tantivy.Occur.Should, exact), + # 0.1 boost keeps fuzzy hits ranked below exact matches (intentional) + (tantivy.Occur.Should, tantivy.Query.boost_query(fuzzy, 0.1)), + ], + ) + + return exact diff --git a/src/documents/search/_schema.py b/src/documents/search/_schema.py new file mode 100644 index 000000000..ba6646007 --- /dev/null +++ b/src/documents/search/_schema.py @@ -0,0 +1,165 @@ +from __future__ import annotations + +import logging +import shutil +from typing import TYPE_CHECKING + +import tantivy +from django.conf import settings + +if TYPE_CHECKING: + from pathlib import Path + +logger = logging.getLogger("paperless.search") + +SCHEMA_VERSION = 1 + + +def build_schema() -> tantivy.Schema: + """ + Build the Tantivy schema for the paperless document index. + + Creates a comprehensive schema supporting full-text search, filtering, + sorting, and autocomplete functionality. Includes fields for document + content, metadata, permissions, custom fields, and notes. + + Returns: + Configured Tantivy schema ready for index creation + """ + sb = tantivy.SchemaBuilder() + + sb.add_unsigned_field("id", stored=True, indexed=True, fast=True) + sb.add_text_field("checksum", stored=True, tokenizer_name="raw") + + for field in ( + "title", + "correspondent", + "document_type", + "storage_path", + "original_filename", + "content", + ): + sb.add_text_field(field, stored=True, tokenizer_name="paperless_text") + + # Shadow sort fields - fast, not stored/indexed + for field in ("title_sort", "correspondent_sort", "type_sort"): + sb.add_text_field( + field, + stored=False, + tokenizer_name="simple_analyzer", + fast=True, + ) + + # CJK support - not stored, indexed only + sb.add_text_field("bigram_content", stored=False, tokenizer_name="bigram_analyzer") + + # Autocomplete prefix scan - stored, not indexed + sb.add_text_field("autocomplete_word", stored=True, tokenizer_name="raw") + + sb.add_text_field("tag", stored=True, tokenizer_name="paperless_text") + + # JSON fields — structured queries: notes.user:alice, custom_fields.name:invoice + sb.add_json_field("notes", stored=True, tokenizer_name="paperless_text") + sb.add_json_field("custom_fields", stored=True, tokenizer_name="paperless_text") + + for field in ( + "correspondent_id", + "document_type_id", + "storage_path_id", + "tag_id", + "owner_id", + "viewer_id", + ): + sb.add_unsigned_field(field, stored=False, indexed=True, fast=True) + + for field in ("created", "modified", "added"): + sb.add_date_field(field, stored=True, indexed=True, fast=True) + + for field in ("asn", "page_count", "num_notes"): + sb.add_unsigned_field(field, stored=True, indexed=True, fast=True) + + return sb.build() + + +def needs_rebuild(index_dir: Path) -> bool: + """ + Check if the search index needs rebuilding. + + Compares the current schema version and search language configuration + against sentinel files to determine if the index is compatible with + the current paperless-ngx version and settings. + + Args: + index_dir: Path to the search index directory + + Returns: + True if the index needs rebuilding, False if it's up to date + """ + version_file = index_dir / ".schema_version" + if not version_file.exists(): + return True + try: + if int(version_file.read_text().strip()) != SCHEMA_VERSION: + logger.info("Search index schema version mismatch - rebuilding.") + return True + except ValueError: + return True + + language_file = index_dir / ".schema_language" + if not language_file.exists(): + logger.info("Search index language sentinel missing - rebuilding.") + return True + if language_file.read_text().strip() != (settings.SEARCH_LANGUAGE or ""): + logger.info("Search index language changed - rebuilding.") + return True + + return False + + +def wipe_index(index_dir: Path) -> None: + """ + Delete all contents of the index directory to prepare for rebuild. + + Recursively removes all files and subdirectories within the index + directory while preserving the directory itself. + + Args: + index_dir: Path to the search index directory to clear + """ + for child in index_dir.iterdir(): + if child.is_dir(): + shutil.rmtree(child) + else: + child.unlink() + + +def _write_sentinels(index_dir: Path) -> None: + """Write schema version and language sentinel files so the next index open can skip rebuilding.""" + (index_dir / ".schema_version").write_text(str(SCHEMA_VERSION)) + (index_dir / ".schema_language").write_text(settings.SEARCH_LANGUAGE or "") + + +def open_or_rebuild_index(index_dir: Path | None = None) -> tantivy.Index: + """ + Open the Tantivy index, creating or rebuilding as needed. + + Checks if the index needs rebuilding due to schema version or language + changes. If rebuilding is needed, wipes the directory and creates a fresh + index with the current schema and configuration. + + Args: + index_dir: Path to index directory (defaults to settings.INDEX_DIR) + + Returns: + Opened Tantivy index (caller must register custom tokenizers) + """ + if index_dir is None: + index_dir = settings.INDEX_DIR + if not index_dir.exists(): + return tantivy.Index(build_schema()) + if needs_rebuild(index_dir): + wipe_index(index_dir) + idx = tantivy.Index(build_schema(), path=str(index_dir)) + _write_sentinels(index_dir) + return idx + return tantivy.Index.open(str(index_dir)) diff --git a/src/documents/search/_tokenizer.py b/src/documents/search/_tokenizer.py new file mode 100644 index 000000000..e597a879e --- /dev/null +++ b/src/documents/search/_tokenizer.py @@ -0,0 +1,116 @@ +from __future__ import annotations + +import logging + +import tantivy + +logger = logging.getLogger("paperless.search") + +# Mapping of ISO 639-1 codes (and common aliases) -> Tantivy Snowball name +_LANGUAGE_MAP: dict[str, str] = { + "ar": "Arabic", + "arabic": "Arabic", + "da": "Danish", + "danish": "Danish", + "nl": "Dutch", + "dutch": "Dutch", + "en": "English", + "english": "English", + "fi": "Finnish", + "finnish": "Finnish", + "fr": "French", + "french": "French", + "de": "German", + "german": "German", + "el": "Greek", + "greek": "Greek", + "hu": "Hungarian", + "hungarian": "Hungarian", + "it": "Italian", + "italian": "Italian", + "no": "Norwegian", + "norwegian": "Norwegian", + "pt": "Portuguese", + "portuguese": "Portuguese", + "ro": "Romanian", + "romanian": "Romanian", + "ru": "Russian", + "russian": "Russian", + "es": "Spanish", + "spanish": "Spanish", + "sv": "Swedish", + "swedish": "Swedish", + "ta": "Tamil", + "tamil": "Tamil", + "tr": "Turkish", + "turkish": "Turkish", +} + +SUPPORTED_LANGUAGES: frozenset[str] = frozenset(_LANGUAGE_MAP) + + +def register_tokenizers(index: tantivy.Index, language: str | None) -> None: + """ + Register all custom tokenizers required by the paperless schema. + + Must be called on every Index instance since Tantivy requires tokenizer + re-registration after each index open/creation. Registers tokenizers for + full-text search, sorting, CJK language support, and fast-field indexing. + + Args: + index: Tantivy index instance to register tokenizers on + language: ISO 639-1 language code for stemming (None to disable) + + Note: + simple_analyzer is registered as both a text and fast-field tokenizer + since sort shadow fields (title_sort, correspondent_sort, type_sort) + use fast=True and Tantivy requires fast-field tokenizers to exist + even for documents that omit those fields. + """ + index.register_tokenizer("paperless_text", _paperless_text(language)) + index.register_tokenizer("simple_analyzer", _simple_analyzer()) + index.register_tokenizer("bigram_analyzer", _bigram_analyzer()) + # Fast-field tokenizer required for fast=True text fields in the schema + index.register_fast_field_tokenizer("simple_analyzer", _simple_analyzer()) + + +def _paperless_text(language: str | None) -> tantivy.TextAnalyzer: + """Main full-text tokenizer for content, title, etc: simple -> remove_long(65) -> lowercase -> ascii_fold [-> stemmer]""" + builder = ( + tantivy.TextAnalyzerBuilder(tantivy.Tokenizer.simple()) + .filter(tantivy.Filter.remove_long(65)) + .filter(tantivy.Filter.lowercase()) + .filter(tantivy.Filter.ascii_fold()) + ) + if language: + tantivy_lang = _LANGUAGE_MAP.get(language.lower()) + if tantivy_lang: + builder = builder.filter(tantivy.Filter.stemmer(tantivy_lang)) + else: + logger.warning( + "Unsupported search language '%s' - stemming disabled. Supported: %s", + language, + ", ".join(sorted(SUPPORTED_LANGUAGES)), + ) + return builder.build() + + +def _simple_analyzer() -> tantivy.TextAnalyzer: + """Tokenizer for shadow sort fields (title_sort, correspondent_sort, type_sort): simple -> lowercase -> ascii_fold.""" + return ( + tantivy.TextAnalyzerBuilder(tantivy.Tokenizer.simple()) + .filter(tantivy.Filter.lowercase()) + .filter(tantivy.Filter.ascii_fold()) + .build() + ) + + +def _bigram_analyzer() -> tantivy.TextAnalyzer: + """Enables substring search in CJK text: ngram(2,2) -> lowercase. CJK / no-whitespace language support.""" + return ( + tantivy.TextAnalyzerBuilder( + tantivy.Tokenizer.ngram(min_gram=2, max_gram=2, prefix_only=False), + ) + .filter(tantivy.Filter.lowercase()) + .build() + ) diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index a8beb70c0..9a026ba54 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -1293,22 +1293,18 @@ class SearchResultSerializer(DocumentSerializer): documents = self.context.get("documents") # Otherwise we fetch this document. if documents is None: # pragma: no cover - # In practice we only serialize **lists** of whoosh.searching.Hit. - # I'm keeping this check for completeness but marking it no cover for now. + # In practice we only serialize **lists** of SearchHit dicts. + # Keeping this check for completeness but marking it no cover for now. documents = self.fetch_documents([hit["id"]]) document = documents[hit["id"]] - notes = ",".join( - [str(c.note) for c in document.notes.all()], - ) + highlights = hit.get("highlights", {}) r = super().to_representation(document) r["__search_hit__"] = { - "score": hit.score, - "highlights": hit.highlights("content", text=document.content), - "note_highlights": ( - hit.highlights("notes", text=notes) if document else None - ), - "rank": hit.rank, + "score": hit["score"], + "highlights": highlights.get("content", ""), + "note_highlights": highlights.get("notes") or None, + "rank": hit["rank"], } return r diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index 82a691696..a72abc2d5 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -790,15 +790,12 @@ def cleanup_user_deletion(sender, instance: User | Group, **kwargs) -> None: def add_to_index(sender, document, **kwargs) -> None: - from documents import index + from documents.search import get_backend - index.add_or_update_document(document) - if document.root_document_id is not None and document.root_document is not None: - # keep in sync when a new version is consumed. - index.add_or_update_document( - document.root_document, - effective_content=document.content, - ) + get_backend().add_or_update( + document, + effective_content=document.get_effective_content(), + ) def run_workflows_added( diff --git a/src/documents/tasks.py b/src/documents/tasks.py index adf1f016c..ae65a5fbe 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -4,11 +4,9 @@ import shutil import uuid import zipfile from collections.abc import Callable -from collections.abc import Iterable from pathlib import Path from tempfile import TemporaryDirectory from tempfile import mkstemp -from typing import TypeVar from celery import Task from celery import shared_task @@ -20,9 +18,7 @@ from django.db import transaction from django.db.models.signals import post_save from django.utils import timezone from filelock import FileLock -from whoosh.writing import AsyncWriter -from documents import index from documents import sanity_checker from documents.barcodes import BarcodePlugin from documents.bulk_download import ArchiveOnlyStrategy @@ -60,7 +56,9 @@ from documents.signals import document_updated from documents.signals.handlers import cleanup_document_deletion from documents.signals.handlers import run_workflows from documents.signals.handlers import send_websocket_document_updated +from documents.utils import IterWrapper from documents.utils import compute_checksum +from documents.utils import identity from documents.workflows.utils import get_workflows_for_trigger from paperless.config import AIConfig from paperless.parsers import ParserContext @@ -69,34 +67,16 @@ from paperless_ai.indexing import llm_index_add_or_update_document from paperless_ai.indexing import llm_index_remove_document from paperless_ai.indexing import update_llm_index -_T = TypeVar("_T") -IterWrapper = Callable[[Iterable[_T]], Iterable[_T]] - - if settings.AUDIT_LOG_ENABLED: from auditlog.models import LogEntry logger = logging.getLogger("paperless.tasks") -def _identity(iterable: Iterable[_T]) -> Iterable[_T]: - return iterable - - @shared_task def index_optimize() -> None: - ix = index.open_index() - writer = AsyncWriter(ix) - writer.commit(optimize=True) - - -def index_reindex(*, iter_wrapper: IterWrapper[Document] = _identity) -> None: - documents = Document.objects.all() - - ix = index.open_index(recreate=True) - - with AsyncWriter(ix) as writer: - for document in iter_wrapper(documents): - index.update_document(writer, document) + logger.info( + "index_optimize is a no-op — Tantivy manages segment merging automatically.", + ) @shared_task @@ -270,9 +250,9 @@ def sanity_check(*, scheduled=True, raise_on_error=True): @shared_task def bulk_update_documents(document_ids) -> None: - documents = Document.objects.filter(id__in=document_ids) + from documents.search import get_backend - ix = index.open_index() + documents = Document.objects.filter(id__in=document_ids) for doc in documents: clear_document_caches(doc.pk) @@ -283,9 +263,9 @@ def bulk_update_documents(document_ids) -> None: ) post_save.send(Document, instance=doc, created=False) - with AsyncWriter(ix) as writer: + with get_backend().batch_update() as batch: for doc in documents: - index.update_document(writer, doc) + batch.add_or_update(doc) ai_config = AIConfig() if ai_config.llm_index_enabled: @@ -389,8 +369,9 @@ def update_document_content_maybe_archive_file(document_id) -> None: logger.info( f"Updating index for document {document_id} ({document.archive_checksum})", ) - with index.open_index_writer() as writer: - index.update_document(writer, document) + from documents.search import get_backend + + get_backend().add_or_update(document) ai_config = AIConfig() if ai_config.llm_index_enabled: @@ -633,7 +614,7 @@ def update_document_parent_tags(tag: Tag, new_parent: Tag) -> None: @shared_task def llmindex_index( *, - iter_wrapper: IterWrapper[Document] = _identity, + iter_wrapper: IterWrapper[Document] = identity, rebuild=False, scheduled=True, auto=False, diff --git a/src/documents/tests/conftest.py b/src/documents/tests/conftest.py index 7e75b9194..5cde34768 100644 --- a/src/documents/tests/conftest.py +++ b/src/documents/tests/conftest.py @@ -1,5 +1,6 @@ import shutil import zoneinfo +from collections.abc import Generator from dataclasses import dataclass from pathlib import Path from typing import TYPE_CHECKING @@ -92,6 +93,26 @@ def sample_doc( ) +@pytest.fixture() +def _search_index( + tmp_path: Path, + settings: SettingsWrapper, +) -> Generator[None, None, None]: + """Create a temp index directory and point INDEX_DIR at it. + + Resets the backend singleton before and after so each test gets a clean + index rather than reusing a stale singleton from another test. + """ + from documents.search import reset_backend + + index_dir = tmp_path / "index" + index_dir.mkdir() + settings.INDEX_DIR = index_dir + reset_backend() + yield + reset_backend() + + @pytest.fixture() def settings_timezone(settings: SettingsWrapper) -> zoneinfo.ZoneInfo: return zoneinfo.ZoneInfo(settings.TIME_ZONE) diff --git a/src/documents/tests/search/__init__.py b/src/documents/tests/search/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/documents/tests/search/conftest.py b/src/documents/tests/search/conftest.py new file mode 100644 index 000000000..ccc26d695 --- /dev/null +++ b/src/documents/tests/search/conftest.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest + +from documents.search._backend import TantivyBackend +from documents.search._backend import reset_backend + +if TYPE_CHECKING: + from collections.abc import Generator + from pathlib import Path + + from pytest_django.fixtures import SettingsWrapper + + +@pytest.fixture +def index_dir(tmp_path: Path, settings: SettingsWrapper) -> Path: + path = tmp_path / "index" + path.mkdir() + settings.INDEX_DIR = path + return path + + +@pytest.fixture +def backend() -> Generator[TantivyBackend, None, None]: + b = TantivyBackend() # path=None → in-memory index + b.open() + try: + yield b + finally: + b.close() + reset_backend() diff --git a/src/documents/tests/search/test_backend.py b/src/documents/tests/search/test_backend.py new file mode 100644 index 000000000..5c92da447 --- /dev/null +++ b/src/documents/tests/search/test_backend.py @@ -0,0 +1,502 @@ +import pytest +from django.contrib.auth.models import User + +from documents.models import CustomField +from documents.models import CustomFieldInstance +from documents.models import Document +from documents.models import Note +from documents.search._backend import TantivyBackend +from documents.search._backend import get_backend +from documents.search._backend import reset_backend + +pytestmark = [pytest.mark.search, pytest.mark.django_db] + + +class TestWriteBatch: + """Test WriteBatch context manager functionality.""" + + def test_rolls_back_on_exception(self, backend: TantivyBackend): + """Batch operations must rollback on exception to preserve index integrity.""" + doc = Document.objects.create( + title="Rollback Target", + content="should survive", + checksum="RB1", + pk=1, + ) + backend.add_or_update(doc) + + try: + with backend.batch_update() as batch: + batch.remove(doc.pk) + raise RuntimeError("simulated failure") + except RuntimeError: + pass + + r = backend.search( + "should survive", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ) + assert r.total == 1 + + +class TestSearch: + """Test search functionality.""" + + def test_scores_normalised_top_hit_is_one(self, backend: TantivyBackend): + """Search scores must be normalized so top hit has score 1.0 for UI consistency.""" + for i, title in enumerate(["bank invoice", "bank statement", "bank receipt"]): + doc = Document.objects.create( + title=title, + content=title, + checksum=f"SN{i}", + pk=10 + i, + ) + backend.add_or_update(doc) + r = backend.search( + "bank", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ) + assert r.hits[0]["score"] == pytest.approx(1.0) + assert all(0.0 <= h["score"] <= 1.0 for h in r.hits) + + def test_sort_field_ascending(self, backend: TantivyBackend): + """Searching with sort_reverse=False must return results in ascending ASN order.""" + for asn in [30, 10, 20]: + doc = Document.objects.create( + title="sortable", + content="sortable content", + checksum=f"SFA{asn}", + archive_serial_number=asn, + ) + backend.add_or_update(doc) + + r = backend.search( + "sortable", + user=None, + page=1, + page_size=10, + sort_field="archive_serial_number", + sort_reverse=False, + ) + assert r.total == 3 + asns = [Document.objects.get(pk=h["id"]).archive_serial_number for h in r.hits] + assert asns == [10, 20, 30] + + def test_sort_field_descending(self, backend: TantivyBackend): + """Searching with sort_reverse=True must return results in descending ASN order.""" + for asn in [30, 10, 20]: + doc = Document.objects.create( + title="sortable", + content="sortable content", + checksum=f"SFD{asn}", + archive_serial_number=asn, + ) + backend.add_or_update(doc) + + r = backend.search( + "sortable", + user=None, + page=1, + page_size=10, + sort_field="archive_serial_number", + sort_reverse=True, + ) + assert r.total == 3 + asns = [Document.objects.get(pk=h["id"]).archive_serial_number for h in r.hits] + assert asns == [30, 20, 10] + + def test_fuzzy_threshold_filters_low_score_hits( + self, + backend: TantivyBackend, + settings, + ): + """When ADVANCED_FUZZY_SEARCH_THRESHOLD exceeds all normalized scores, hits must be filtered out.""" + doc = Document.objects.create( + title="Invoice document", + content="financial report", + checksum="FT1", + pk=120, + ) + backend.add_or_update(doc) + + # Threshold above 1.0 filters every hit (normalized scores top out at 1.0) + settings.ADVANCED_FUZZY_SEARCH_THRESHOLD = 1.1 + r = backend.search( + "invoice", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ) + assert r.hits == [] + + def test_owner_filter(self, backend: TantivyBackend): + """Document owners can search their private documents; other users cannot access them.""" + owner = User.objects.create_user("owner") + other = User.objects.create_user("other") + doc = Document.objects.create( + title="Private", + content="secret", + checksum="PF1", + pk=20, + owner=owner, + ) + backend.add_or_update(doc) + + assert ( + backend.search( + "secret", + user=owner, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ).total + == 1 + ) + assert ( + backend.search( + "secret", + user=other, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ).total + == 0 + ) + + +class TestRebuild: + """Test index rebuilding functionality.""" + + def test_with_iter_wrapper_called(self, backend: TantivyBackend): + """Index rebuild must pass documents through iter_wrapper for progress tracking.""" + seen = [] + + def wrapper(docs): + for doc in docs: + seen.append(doc.pk) + yield doc + + Document.objects.create(title="Tracked", content="x", checksum="TW1", pk=30) + backend.rebuild(Document.objects.all(), iter_wrapper=wrapper) + assert 30 in seen + + +class TestAutocomplete: + """Test autocomplete functionality.""" + + def test_basic_functionality(self, backend: TantivyBackend): + """Autocomplete must return words matching the given prefix.""" + doc = Document.objects.create( + title="Invoice from Microsoft Corporation", + content="payment details", + checksum="AC1", + pk=40, + ) + backend.add_or_update(doc) + + results = backend.autocomplete("micro", limit=10) + assert "microsoft" in results + + def test_results_ordered_by_document_frequency(self, backend: TantivyBackend): + """Autocomplete results must be ordered by document frequency to prioritize common terms.""" + # "payment" appears in 3 docs; "payslip" in 1 — "pay" prefix should + # return "payment" before "payslip". + for i, (title, checksum) in enumerate( + [ + ("payment invoice", "AF1"), + ("payment receipt", "AF2"), + ("payment confirmation", "AF3"), + ("payslip march", "AF4"), + ], + start=41, + ): + doc = Document.objects.create( + title=title, + content="details", + checksum=checksum, + pk=i, + ) + backend.add_or_update(doc) + + results = backend.autocomplete("pay", limit=10) + assert results.index("payment") < results.index("payslip") + + +class TestMoreLikeThis: + """Test more like this functionality.""" + + def test_excludes_original(self, backend: TantivyBackend): + """More like this queries must exclude the reference document from results.""" + doc1 = Document.objects.create( + title="Important document", + content="financial information", + checksum="MLT1", + pk=50, + ) + doc2 = Document.objects.create( + title="Another document", + content="financial report", + checksum="MLT2", + pk=51, + ) + backend.add_or_update(doc1) + backend.add_or_update(doc2) + + results = backend.more_like_this(doc_id=50, user=None, page=1, page_size=10) + returned_ids = [hit["id"] for hit in results.hits] + assert 50 not in returned_ids # Original document excluded + + def test_with_user_applies_permission_filter(self, backend: TantivyBackend): + """more_like_this with a user must exclude documents that user cannot see.""" + viewer = User.objects.create_user("mlt_viewer") + other = User.objects.create_user("mlt_other") + public_doc = Document.objects.create( + title="Public financial document", + content="quarterly financial analysis report figures", + checksum="MLT3", + pk=52, + ) + private_doc = Document.objects.create( + title="Private financial document", + content="quarterly financial analysis report figures", + checksum="MLT4", + pk=53, + owner=other, + ) + backend.add_or_update(public_doc) + backend.add_or_update(private_doc) + + results = backend.more_like_this(doc_id=52, user=viewer, page=1, page_size=10) + returned_ids = [hit["id"] for hit in results.hits] + # private_doc is owned by other, so viewer cannot see it + assert 53 not in returned_ids + + def test_document_not_in_index_returns_empty(self, backend: TantivyBackend): + """more_like_this for a doc_id absent from the index must return empty results.""" + results = backend.more_like_this(doc_id=9999, user=None, page=1, page_size=10) + assert results.hits == [] + assert results.total == 0 + + +class TestSingleton: + """Test get_backend() and reset_backend() singleton lifecycle.""" + + @pytest.fixture(autouse=True) + def _clean(self): + reset_backend() + yield + reset_backend() + + def test_returns_same_instance_on_repeated_calls(self, index_dir): + """Singleton pattern: repeated calls to get_backend() must return the same instance.""" + assert get_backend() is get_backend() + + def test_reinitializes_when_index_dir_changes(self, tmp_path, settings): + """Backend singleton must reinitialize when INDEX_DIR setting changes for test isolation.""" + settings.INDEX_DIR = tmp_path / "a" + (tmp_path / "a").mkdir() + b1 = get_backend() + + settings.INDEX_DIR = tmp_path / "b" + (tmp_path / "b").mkdir() + b2 = get_backend() + + assert b1 is not b2 + assert b2._path == tmp_path / "b" + + def test_reset_forces_new_instance(self, index_dir): + """reset_backend() must force creation of a new backend instance on next get_backend() call.""" + b1 = get_backend() + reset_backend() + b2 = get_backend() + assert b1 is not b2 + + +class TestFieldHandling: + """Test handling of various document fields.""" + + def test_none_values_handled_correctly(self, backend: TantivyBackend): + """Document fields with None values must not cause indexing errors.""" + doc = Document.objects.create( + title="Test Doc", + content="test content", + checksum="NV1", + pk=60, + original_filename=None, + page_count=None, + ) + # Should not raise an exception + backend.add_or_update(doc) + + results = backend.search( + "test", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ) + assert results.total == 1 + + def test_custom_fields_include_name_and_value(self, backend: TantivyBackend): + """Custom fields must be indexed with both field name and value for structured queries.""" + # Create a custom field + field = CustomField.objects.create( + name="Invoice Number", + data_type=CustomField.FieldDataType.STRING, + ) + doc = Document.objects.create( + title="Invoice", + content="test", + checksum="CF1", + pk=70, + ) + CustomFieldInstance.objects.create( + document=doc, + field=field, + value_text="INV-2024-001", + ) + + # Should not raise an exception during indexing + backend.add_or_update(doc) + + results = backend.search( + "invoice", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ) + assert results.total == 1 + + def test_select_custom_field_indexes_label_not_id(self, backend: TantivyBackend): + """SELECT custom fields must index the human-readable label, not the opaque option ID.""" + field = CustomField.objects.create( + name="Category", + data_type=CustomField.FieldDataType.SELECT, + extra_data={ + "select_options": [ + {"id": "opt_abc", "label": "Invoice"}, + {"id": "opt_def", "label": "Receipt"}, + ], + }, + ) + doc = Document.objects.create( + title="Categorised doc", + content="test", + checksum="SEL1", + pk=71, + ) + CustomFieldInstance.objects.create( + document=doc, + field=field, + value_select="opt_abc", + ) + backend.add_or_update(doc) + + # Label should be findable + results = backend.search( + "custom_fields.value:invoice", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ) + assert results.total == 1 + + # Opaque ID must not appear in the index + results = backend.search( + "custom_fields.value:opt_abc", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ) + assert results.total == 0 + + def test_none_custom_field_value_not_indexed(self, backend: TantivyBackend): + """Custom field instances with no value set must not produce an index entry.""" + field = CustomField.objects.create( + name="Optional", + data_type=CustomField.FieldDataType.SELECT, + extra_data={"select_options": [{"id": "opt_1", "label": "Yes"}]}, + ) + doc = Document.objects.create( + title="Unset field doc", + content="test", + checksum="SEL2", + pk=72, + ) + CustomFieldInstance.objects.create( + document=doc, + field=field, + value_select=None, + ) + backend.add_or_update(doc) + + # The string "none" must not appear as an indexed value + results = backend.search( + "custom_fields.value:none", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ) + assert results.total == 0 + + def test_notes_include_user_information(self, backend: TantivyBackend): + """Notes must be indexed with user information when available for structured queries.""" + user = User.objects.create_user("notewriter") + doc = Document.objects.create( + title="Doc with notes", + content="test", + checksum="NT1", + pk=80, + ) + Note.objects.create(document=doc, note="Important note", user=user) + + # Should not raise an exception during indexing + backend.add_or_update(doc) + + # Test basic document search first + results = backend.search( + "test", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ) + assert results.total == 1, ( + f"Expected 1, got {results.total}. Document content should be searchable." + ) + + # Test notes search — must use structured JSON syntax now that note + # is no longer in DEFAULT_SEARCH_FIELDS + results = backend.search( + "notes.note:important", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + ) + assert results.total == 1, ( + f"Expected 1, got {results.total}. Note content should be searchable via notes.note: prefix." + ) diff --git a/src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py b/src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py new file mode 100644 index 000000000..739ea996c --- /dev/null +++ b/src/documents/tests/search/test_migration_fulltext_query_field_prefixes.py @@ -0,0 +1,138 @@ +import pytest + +from documents.tests.utils import TestMigrations + +pytestmark = pytest.mark.search + + +class TestMigrateFulltextQueryFieldPrefixes(TestMigrations): + migrate_from = "0016_sha256_checksums" + migrate_to = "0017_migrate_fulltext_query_field_prefixes" + + def setUpBeforeMigration(self, apps) -> None: + User = apps.get_model("auth", "User") + SavedView = apps.get_model("documents", "SavedView") + SavedViewFilterRule = apps.get_model("documents", "SavedViewFilterRule") + + user = User.objects.create(username="testuser") + + def make_rule(value: str): + view = SavedView.objects.create( + owner=user, + name=f"view-{value}", + sort_field="created", + ) + return SavedViewFilterRule.objects.create( + saved_view=view, + rule_type=20, # fulltext query + value=value, + ) + + # Simple field prefixes + self.rule_note = make_rule("note:invoice") + self.rule_cf = make_rule("custom_field:amount") + + # Combined query + self.rule_combined = make_rule("note:invoice AND custom_field:total") + + # Parenthesized groups (Whoosh syntax) + self.rule_parens = make_rule("(note:invoice OR note:receipt)") + + # Prefix operators + self.rule_plus = make_rule("+note:foo") + self.rule_minus = make_rule("-note:bar") + + # Boosted + self.rule_boost = make_rule("note:test^2") + + # Should NOT be rewritten — no field prefix match + self.rule_no_match = make_rule("title:hello content:world") + + # Should NOT false-positive on word boundaries + self.rule_denote = make_rule("denote:foo") + + # Already using new syntax — should be idempotent + self.rule_already_migrated = make_rule("notes.note:foo") + self.rule_already_migrated_cf = make_rule("custom_fields.value:bar") + + # Null value — should not crash + view_null = SavedView.objects.create( + owner=user, + name="view-null", + sort_field="created", + ) + self.rule_null = SavedViewFilterRule.objects.create( + saved_view=view_null, + rule_type=20, + value=None, + ) + + # Non-fulltext rule type — should be untouched + view_other = SavedView.objects.create( + owner=user, + name="view-other-type", + sort_field="created", + ) + self.rule_other_type = SavedViewFilterRule.objects.create( + saved_view=view_other, + rule_type=0, # title contains + value="note:something", + ) + + def test_note_prefix_rewritten(self): + self.rule_note.refresh_from_db() + self.assertEqual(self.rule_note.value, "notes.note:invoice") + + def test_custom_field_prefix_rewritten(self): + self.rule_cf.refresh_from_db() + self.assertEqual(self.rule_cf.value, "custom_fields.value:amount") + + def test_combined_query_rewritten(self): + self.rule_combined.refresh_from_db() + self.assertEqual( + self.rule_combined.value, + "notes.note:invoice AND custom_fields.value:total", + ) + + def test_parenthesized_groups(self): + self.rule_parens.refresh_from_db() + self.assertEqual( + self.rule_parens.value, + "(notes.note:invoice OR notes.note:receipt)", + ) + + def test_plus_prefix(self): + self.rule_plus.refresh_from_db() + self.assertEqual(self.rule_plus.value, "+notes.note:foo") + + def test_minus_prefix(self): + self.rule_minus.refresh_from_db() + self.assertEqual(self.rule_minus.value, "-notes.note:bar") + + def test_boosted(self): + self.rule_boost.refresh_from_db() + self.assertEqual(self.rule_boost.value, "notes.note:test^2") + + def test_no_match_unchanged(self): + self.rule_no_match.refresh_from_db() + self.assertEqual(self.rule_no_match.value, "title:hello content:world") + + def test_word_boundary_no_false_positive(self): + self.rule_denote.refresh_from_db() + self.assertEqual(self.rule_denote.value, "denote:foo") + + def test_already_migrated_idempotent(self): + self.rule_already_migrated.refresh_from_db() + self.assertEqual(self.rule_already_migrated.value, "notes.note:foo") + + def test_already_migrated_cf_idempotent(self): + self.rule_already_migrated_cf.refresh_from_db() + self.assertEqual(self.rule_already_migrated_cf.value, "custom_fields.value:bar") + + def test_null_value_no_crash(self): + self.rule_null.refresh_from_db() + self.assertIsNone(self.rule_null.value) + + def test_non_fulltext_rule_untouched(self): + self.rule_other_type.refresh_from_db() + self.assertEqual(self.rule_other_type.value, "note:something") diff --git a/src/documents/tests/search/test_query.py b/src/documents/tests/search/test_query.py new file mode 100644 index 000000000..74a064dbb --- /dev/null +++ b/src/documents/tests/search/test_query.py @@ -0,0 +1,530 @@ +from __future__ import annotations + +import re +from datetime import UTC +from datetime import datetime +from datetime import tzinfo +from typing import TYPE_CHECKING +from zoneinfo import ZoneInfo + +import pytest +import tantivy +import time_machine + +from documents.search._query import _date_only_range +from documents.search._query import _datetime_range +from documents.search._query import _rewrite_compact_date +from documents.search._query import build_permission_filter +from documents.search._query import normalize_query +from documents.search._query import parse_user_query +from documents.search._query import rewrite_natural_date_keywords +from documents.search._schema import build_schema +from documents.search._tokenizer import register_tokenizers + +if TYPE_CHECKING: + from django.contrib.auth.base_user import AbstractBaseUser + +pytestmark = pytest.mark.search + +EASTERN = ZoneInfo("America/New_York") # UTC-5 / UTC-4 (DST) +AUCKLAND = ZoneInfo("Pacific/Auckland") # UTC+13 in southern-hemisphere summer + + +def _range(result: str, field: str) -> tuple[str, str]: + m = re.search(rf"{field}:\[(.+?) TO (.+?)\]", result) + assert m, f"No range for {field!r} in: {result!r}" + return m.group(1), m.group(2) + + +class TestCreatedDateField: + """ + created is a Django DateField: indexed as midnight UTC of the local calendar + date. No offset arithmetic needed - the local calendar date is what matters. + """ + + @pytest.mark.parametrize( + ("tz", "expected_lo", "expected_hi"), + [ + pytest.param(UTC, "2026-03-28T00:00:00Z", "2026-03-29T00:00:00Z", id="utc"), + pytest.param( + EASTERN, + "2026-03-28T00:00:00Z", + "2026-03-29T00:00:00Z", + id="eastern_same_calendar_date", + ), + ], + ) + @time_machine.travel(datetime(2026, 3, 28, 15, 30, tzinfo=UTC), tick=False) + def test_today(self, tz: tzinfo, expected_lo: str, expected_hi: str) -> None: + lo, hi = _range(rewrite_natural_date_keywords("created:today", tz), "created") + assert lo == expected_lo + assert hi == expected_hi + + @time_machine.travel(datetime(2026, 3, 28, 3, 0, tzinfo=UTC), tick=False) + def test_today_auckland_ahead_of_utc(self) -> None: + # UTC 03:00 -> Auckland (UTC+13) = 16:00 same date; local date = 2026-03-28 + lo, _ = _range( + rewrite_natural_date_keywords("created:today", AUCKLAND), + "created", + ) + assert lo == "2026-03-28T00:00:00Z" + + @pytest.mark.parametrize( + ("field", "keyword", "expected_lo", "expected_hi"), + [ + pytest.param( + "created", + "yesterday", + "2026-03-27T00:00:00Z", + "2026-03-28T00:00:00Z", + id="yesterday", + ), + pytest.param( + "created", + "this_week", + "2026-03-23T00:00:00Z", + "2026-03-30T00:00:00Z", + id="this_week_mon_sun", + ), + pytest.param( + "created", + "last_week", + "2026-03-16T00:00:00Z", + "2026-03-23T00:00:00Z", + id="last_week", + ), + pytest.param( + "created", + "this_month", + "2026-03-01T00:00:00Z", + "2026-04-01T00:00:00Z", + id="this_month", + ), + pytest.param( + "created", + "last_month", + "2026-02-01T00:00:00Z", + "2026-03-01T00:00:00Z", + id="last_month", + ), + pytest.param( + "created", + "this_year", + "2026-01-01T00:00:00Z", + "2027-01-01T00:00:00Z", + id="this_year", + ), + pytest.param( + "created", + "last_year", + "2025-01-01T00:00:00Z", + "2026-01-01T00:00:00Z", + id="last_year", + ), + ], + ) + @time_machine.travel(datetime(2026, 3, 28, 15, 0, tzinfo=UTC), tick=False) + def test_date_keywords( + self, + field: str, + keyword: str, + expected_lo: str, + expected_hi: str, + ) -> None: + # 2026-03-28 is Saturday; Mon-Sun week calculation built into expectations + query = f"{field}:{keyword}" + lo, hi = _range(rewrite_natural_date_keywords(query, UTC), field) + assert lo == expected_lo + assert hi == expected_hi + + @time_machine.travel(datetime(2026, 12, 15, 12, 0, tzinfo=UTC), tick=False) + def test_this_month_december_wraps_to_next_year(self) -> None: + # December: next month must roll over to January 1 of next year + lo, hi = _range( + rewrite_natural_date_keywords("created:this_month", UTC), + "created", + ) + assert lo == "2026-12-01T00:00:00Z" + assert hi == "2027-01-01T00:00:00Z" + + @time_machine.travel(datetime(2026, 1, 15, 12, 0, tzinfo=UTC), tick=False) + def test_last_month_january_wraps_to_previous_year(self) -> None: + # January: last month must roll back to December 1 of previous year + lo, hi = _range( + rewrite_natural_date_keywords("created:last_month", UTC), + "created", + ) + assert lo == "2025-12-01T00:00:00Z" + assert hi == "2026-01-01T00:00:00Z" + + def test_unknown_keyword_raises(self) -> None: + with pytest.raises(ValueError, match="Unknown keyword"): + _date_only_range("bogus_keyword", UTC) + + +class TestDateTimeFields: + """ + added/modified store full UTC datetimes. Natural keywords must convert + the local day boundaries to UTC - timezone offset arithmetic IS required. + """ + + @time_machine.travel(datetime(2026, 3, 28, 15, 30, tzinfo=UTC), tick=False) + def test_added_today_eastern(self) -> None: + # EDT = UTC-4; local midnight 2026-03-28 00:00 EDT = 2026-03-28 04:00 UTC + lo, hi = _range(rewrite_natural_date_keywords("added:today", EASTERN), "added") + assert lo == "2026-03-28T04:00:00Z" + assert hi == "2026-03-29T04:00:00Z" + + @time_machine.travel(datetime(2026, 3, 29, 2, 0, tzinfo=UTC), tick=False) + def test_added_today_auckland_midnight_crossing(self) -> None: + # UTC 02:00 on 2026-03-29 -> Auckland (UTC+13) = 2026-03-29 15:00 local + # Auckland midnight = UTC 2026-03-28 11:00 + lo, hi = _range(rewrite_natural_date_keywords("added:today", AUCKLAND), "added") + assert lo == "2026-03-28T11:00:00Z" + assert hi == "2026-03-29T11:00:00Z" + + @time_machine.travel(datetime(2026, 3, 28, 15, 0, tzinfo=UTC), tick=False) + def test_modified_today_utc(self) -> None: + lo, hi = _range( + rewrite_natural_date_keywords("modified:today", UTC), + "modified", + ) + assert lo == "2026-03-28T00:00:00Z" + assert hi == "2026-03-29T00:00:00Z" + + @pytest.mark.parametrize( + ("keyword", "expected_lo", "expected_hi"), + [ + pytest.param( + "yesterday", + "2026-03-27T00:00:00Z", + "2026-03-28T00:00:00Z", + id="yesterday", + ), + pytest.param( + "this_week", + "2026-03-23T00:00:00Z", + "2026-03-30T00:00:00Z", + id="this_week", + ), + pytest.param( + "last_week", + "2026-03-16T00:00:00Z", + "2026-03-23T00:00:00Z", + id="last_week", + ), + pytest.param( + "this_month", + "2026-03-01T00:00:00Z", + "2026-04-01T00:00:00Z", + id="this_month", + ), + pytest.param( + "last_month", + "2026-02-01T00:00:00Z", + "2026-03-01T00:00:00Z", + id="last_month", + ), + pytest.param( + "this_year", + "2026-01-01T00:00:00Z", + "2027-01-01T00:00:00Z", + id="this_year", + ), + pytest.param( + "last_year", + "2025-01-01T00:00:00Z", + "2026-01-01T00:00:00Z", + id="last_year", + ), + ], + ) + @time_machine.travel(datetime(2026, 3, 28, 12, 0, tzinfo=UTC), tick=False) + def test_datetime_keywords_utc( + self, + keyword: str, + expected_lo: str, + expected_hi: str, + ) -> None: + # 2026-03-28 is Saturday; weekday()==5 so Monday=2026-03-23 + lo, hi = _range(rewrite_natural_date_keywords(f"added:{keyword}", UTC), "added") + assert lo == expected_lo + assert hi == expected_hi + + @time_machine.travel(datetime(2026, 12, 15, 12, 0, tzinfo=UTC), tick=False) + def test_this_month_december_wraps_to_next_year(self) -> None: + # December: next month wraps to January of next year + lo, hi = _range(rewrite_natural_date_keywords("added:this_month", UTC), "added") + assert lo == "2026-12-01T00:00:00Z" + assert hi == "2027-01-01T00:00:00Z" + + @time_machine.travel(datetime(2026, 1, 15, 12, 0, tzinfo=UTC), tick=False) + def test_last_month_january_wraps_to_previous_year(self) -> None: + # January: last month wraps back to December of previous year + lo, hi = _range(rewrite_natural_date_keywords("added:last_month", UTC), "added") + assert lo == "2025-12-01T00:00:00Z" + assert hi == "2026-01-01T00:00:00Z" + + def test_unknown_keyword_raises(self) -> None: + with pytest.raises(ValueError, match="Unknown keyword"): + _datetime_range("bogus_keyword", UTC) + + +class TestWhooshQueryRewriting: + """All Whoosh query syntax variants must be rewritten to ISO 8601 before Tantivy parses them.""" + + @time_machine.travel(datetime(2026, 3, 28, 15, 0, tzinfo=UTC), tick=False) + def test_compact_date_shim_rewrites_to_iso(self) -> None: + result = rewrite_natural_date_keywords("created:20240115120000", UTC) + assert "2024-01-15" in result + assert "20240115120000" not in result + + @time_machine.travel(datetime(2026, 3, 28, 15, 0, tzinfo=UTC), tick=False) + def test_relative_range_shim_removes_now(self) -> None: + result = rewrite_natural_date_keywords("added:[now-7d TO now]", UTC) + assert "now" not in result + assert "2026-03-" in result + + @time_machine.travel(datetime(2026, 3, 28, 12, 0, tzinfo=UTC), tick=False) + def test_bracket_minus_7_days(self) -> None: + lo, hi = _range( + rewrite_natural_date_keywords("added:[-7 days to now]", UTC), + "added", + ) + assert lo == "2026-03-21T12:00:00Z" + assert hi == "2026-03-28T12:00:00Z" + + @time_machine.travel(datetime(2026, 3, 28, 12, 0, tzinfo=UTC), tick=False) + def test_bracket_minus_1_week(self) -> None: + lo, hi = _range( + rewrite_natural_date_keywords("added:[-1 week to now]", UTC), + "added", + ) + assert lo == "2026-03-21T12:00:00Z" + assert hi == "2026-03-28T12:00:00Z" + + @time_machine.travel(datetime(2026, 3, 28, 12, 0, tzinfo=UTC), tick=False) + def test_bracket_minus_1_month_uses_relativedelta(self) -> None: + # relativedelta(months=1) from 2026-03-28 = 2026-02-28 (not 29) + lo, hi = _range( + rewrite_natural_date_keywords("created:[-1 month to now]", UTC), + "created", + ) + assert lo == "2026-02-28T12:00:00Z" + assert hi == "2026-03-28T12:00:00Z" + + @time_machine.travel(datetime(2026, 3, 28, 12, 0, tzinfo=UTC), tick=False) + def test_bracket_minus_1_year(self) -> None: + lo, hi = _range( + rewrite_natural_date_keywords("modified:[-1 year to now]", UTC), + "modified", + ) + assert lo == "2025-03-28T12:00:00Z" + assert hi == "2026-03-28T12:00:00Z" + + @time_machine.travel(datetime(2026, 3, 28, 12, 0, tzinfo=UTC), tick=False) + def test_bracket_plural_unit_hours(self) -> None: + lo, hi = _range( + rewrite_natural_date_keywords("added:[-3 hours to now]", UTC), + "added", + ) + assert lo == "2026-03-28T09:00:00Z" + assert hi == "2026-03-28T12:00:00Z" + + @time_machine.travel(datetime(2026, 3, 28, 12, 0, tzinfo=UTC), tick=False) + def test_bracket_case_insensitive(self) -> None: + result = rewrite_natural_date_keywords("added:[-1 WEEK TO NOW]", UTC) + assert "now" not in result.lower() + lo, hi = _range(result, "added") + assert lo == "2026-03-21T12:00:00Z" + assert hi == "2026-03-28T12:00:00Z" + + @time_machine.travel(datetime(2026, 3, 28, 12, 0, tzinfo=UTC), tick=False) + def test_relative_range_swaps_bounds_when_lo_exceeds_hi(self) -> None: + # [now+1h TO now-1h] has lo > hi before substitution; they must be swapped + lo, hi = _range( + rewrite_natural_date_keywords("added:[now+1h TO now-1h]", UTC), + "added", + ) + assert lo == "2026-03-28T11:00:00Z" + assert hi == "2026-03-28T13:00:00Z" + + def test_8digit_created_date_field_always_uses_utc_midnight(self) -> None: + # created is a DateField: boundaries are always UTC midnight, no TZ offset + result = rewrite_natural_date_keywords("created:20231201", EASTERN) + lo, hi = _range(result, "created") + assert lo == "2023-12-01T00:00:00Z" + assert hi == "2023-12-02T00:00:00Z" + + def test_8digit_added_datetime_field_converts_local_midnight_to_utc(self) -> None: + # added is DateTimeField: midnight Dec 1 Eastern (EST = UTC-5) = 05:00 UTC + result = rewrite_natural_date_keywords("added:20231201", EASTERN) + lo, hi = _range(result, "added") + assert lo == "2023-12-01T05:00:00Z" + assert hi == "2023-12-02T05:00:00Z" + + def test_8digit_modified_datetime_field_converts_local_midnight_to_utc( + self, + ) -> None: + result = rewrite_natural_date_keywords("modified:20231201", EASTERN) + lo, hi = _range(result, "modified") + assert lo == "2023-12-01T05:00:00Z" + assert hi == "2023-12-02T05:00:00Z" + + def test_8digit_invalid_date_passes_through_unchanged(self) -> None: + assert rewrite_natural_date_keywords("added:20231340", UTC) == "added:20231340" + + def test_compact_14digit_invalid_date_passes_through_unchanged(self) -> None: + # Month=13 makes datetime() raise ValueError; the token must be left as-is + assert _rewrite_compact_date("20231300120000") == "20231300120000" + + +class TestParseUserQuery: + """parse_user_query runs the full preprocessing pipeline.""" + + @pytest.fixture + def query_index(self) -> tantivy.Index: + schema = build_schema() + idx = tantivy.Index(schema, path=None) + register_tokenizers(idx, "") + return idx + + def test_returns_tantivy_query(self, query_index: tantivy.Index) -> None: + assert isinstance(parse_user_query(query_index, "invoice", UTC), tantivy.Query) + + def test_fuzzy_mode_does_not_raise( + self, + query_index: tantivy.Index, + settings, + ) -> None: + settings.ADVANCED_FUZZY_SEARCH_THRESHOLD = 0.5 + assert isinstance(parse_user_query(query_index, "invoice", UTC), tantivy.Query) + + def test_date_rewriting_applied_before_tantivy_parse( + self, + query_index: tantivy.Index, + ) -> None: + # created:today must be rewritten to an ISO range before Tantivy parses it; + # if passed raw, Tantivy would reject "today" as an invalid date value + with time_machine.travel(datetime(2026, 3, 28, 12, 0, tzinfo=UTC), tick=False): + q = parse_user_query(query_index, "created:today", UTC) + assert isinstance(q, tantivy.Query) + + +class TestPassthrough: + """Queries without field prefixes or unrelated content pass through unchanged.""" + + def test_bare_keyword_no_field_prefix_unchanged(self) -> None: + # Bare 'today' with no field: prefix passes through unchanged + result = rewrite_natural_date_keywords("bank statement today", UTC) + assert "today" in result + + def test_unrelated_query_unchanged(self) -> None: + assert rewrite_natural_date_keywords("title:invoice", UTC) == "title:invoice" + + +class TestNormalizeQuery: + """normalize_query expands comma-separated values and collapses whitespace.""" + + def test_normalize_expands_comma_separated_tags(self) -> None: + assert normalize_query("tag:foo,bar") == "tag:foo AND tag:bar" + + def test_normalize_expands_three_values(self) -> None: + assert normalize_query("tag:foo,bar,baz") == "tag:foo AND tag:bar AND tag:baz" + + def test_normalize_collapses_whitespace(self) -> None: + assert normalize_query("bank statement") == "bank statement" + + def test_normalize_no_commas_unchanged(self) -> None: + assert normalize_query("bank statement") == "bank statement" + + +class TestPermissionFilter: + """ + build_permission_filter tests use an in-memory index — no DB access needed. + + Users are constructed as unsaved model instances (django_user_model(pk=N)) + so no database round-trip occurs; only .pk is read by build_permission_filter. + """ + + @pytest.fixture + def perm_index(self) -> tantivy.Index: + schema = build_schema() + idx = tantivy.Index(schema, path=None) + register_tokenizers(idx, "") + return idx + + def _add_doc( + self, + idx: tantivy.Index, + doc_id: int, + owner_id: int | None = None, + viewer_ids: tuple[int, ...] = (), + ) -> None: + writer = idx.writer() + doc = tantivy.Document() + doc.add_unsigned("id", doc_id) + # Only add owner_id field if the document has an owner + if owner_id is not None: + doc.add_unsigned("owner_id", owner_id) + for vid in viewer_ids: + doc.add_unsigned("viewer_id", vid) + writer.add_document(doc) + writer.commit() + idx.reload() + + def test_perm_no_owner_visible_to_any_user( + self, + perm_index: tantivy.Index, + django_user_model: type[AbstractBaseUser], + ) -> None: + """Documents with no owner must be visible to every user.""" + self._add_doc(perm_index, doc_id=1, owner_id=None) + user = django_user_model(pk=99) + perm = build_permission_filter(perm_index.schema, user) + assert perm_index.searcher().search(perm, limit=10).count == 1 + + def test_perm_owned_by_user_is_visible( + self, + perm_index: tantivy.Index, + django_user_model: type[AbstractBaseUser], + ) -> None: + """A document owned by the requesting user must be visible.""" + self._add_doc(perm_index, doc_id=2, owner_id=42) + user = django_user_model(pk=42) + perm = build_permission_filter(perm_index.schema, user) + assert perm_index.searcher().search(perm, limit=10).count == 1 + + def test_perm_owned_by_other_not_visible( + self, + perm_index: tantivy.Index, + django_user_model: type[AbstractBaseUser], + ) -> None: + """A document owned by a different user must not be visible.""" + self._add_doc(perm_index, doc_id=3, owner_id=42) + user = django_user_model(pk=99) + perm = build_permission_filter(perm_index.schema, user) + assert perm_index.searcher().search(perm, limit=10).count == 0 + + def test_perm_shared_viewer_is_visible( + self, + perm_index: tantivy.Index, + django_user_model: type[AbstractBaseUser], + ) -> None: + """A document explicitly shared with a user must be visible to that user.""" + self._add_doc(perm_index, doc_id=4, owner_id=42, viewer_ids=(99,)) + user = django_user_model(pk=99) + perm = build_permission_filter(perm_index.schema, user) + assert perm_index.searcher().search(perm, limit=10).count == 1 + + def test_perm_only_owned_docs_hidden_from_others( + self, + perm_index: tantivy.Index, + django_user_model: type[AbstractBaseUser], + ) -> None: + """Only unowned documents appear when the user owns none of them.""" + self._add_doc(perm_index, doc_id=5, owner_id=10) # owned by 10 + self._add_doc(perm_index, doc_id=6, owner_id=None) # unowned + user = django_user_model(pk=20) + perm = build_permission_filter(perm_index.schema, user) + assert perm_index.searcher().search(perm, limit=10).count == 1 # only unowned diff --git a/src/documents/tests/search/test_schema.py b/src/documents/tests/search/test_schema.py new file mode 100644 index 000000000..1ff9bee32 --- /dev/null +++ b/src/documents/tests/search/test_schema.py @@ -0,0 +1,63 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest + +from documents.search._schema import SCHEMA_VERSION +from documents.search._schema import needs_rebuild + +if TYPE_CHECKING: + from pathlib import Path + + from pytest_django.fixtures import SettingsWrapper + +pytestmark = pytest.mark.search + + +class TestNeedsRebuild: + """needs_rebuild covers all sentinel-file states that require a full reindex.""" + + def test_returns_true_when_version_file_missing(self, index_dir: Path) -> None: + assert needs_rebuild(index_dir) is True + + def test_returns_false_when_version_and_language_match( + self, + index_dir: Path, + settings: SettingsWrapper, + ) -> None: + settings.SEARCH_LANGUAGE = "en" + (index_dir / ".schema_version").write_text(str(SCHEMA_VERSION)) + (index_dir / ".schema_language").write_text("en") + assert needs_rebuild(index_dir) is False + + def test_returns_true_on_schema_version_mismatch(self, index_dir: Path) -> None: + (index_dir / ".schema_version").write_text(str(SCHEMA_VERSION - 1)) + assert needs_rebuild(index_dir) is True + + def test_returns_true_when_version_file_not_an_integer( + self, + index_dir: Path, + ) -> None: + (index_dir / ".schema_version").write_text("not-a-number") + assert needs_rebuild(index_dir) is True + + def test_returns_true_when_language_sentinel_missing( + self, + index_dir: Path, + settings: SettingsWrapper, + ) -> None: + settings.SEARCH_LANGUAGE = "en" + (index_dir / ".schema_version").write_text(str(SCHEMA_VERSION)) + # .schema_language intentionally absent + assert needs_rebuild(index_dir) is True + + def test_returns_true_when_language_sentinel_content_differs( + self, + index_dir: Path, + settings: SettingsWrapper, + ) -> None: + settings.SEARCH_LANGUAGE = "de" + (index_dir / ".schema_version").write_text(str(SCHEMA_VERSION)) + (index_dir / ".schema_language").write_text("en") + assert needs_rebuild(index_dir) is True diff --git a/src/documents/tests/search/test_tokenizer.py b/src/documents/tests/search/test_tokenizer.py new file mode 100644 index 000000000..aee52a567 --- /dev/null +++ b/src/documents/tests/search/test_tokenizer.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING + +import pytest +import tantivy + +from documents.search._tokenizer import _bigram_analyzer +from documents.search._tokenizer import _paperless_text +from documents.search._tokenizer import register_tokenizers + +if TYPE_CHECKING: + from _pytest.logging import LogCaptureFixture + +pytestmark = pytest.mark.search + + +class TestTokenizers: + @pytest.fixture + def content_index(self) -> tantivy.Index: + """Index with just a content field for ASCII folding tests.""" + sb = tantivy.SchemaBuilder() + sb.add_text_field("content", stored=True, tokenizer_name="paperless_text") + schema = sb.build() + idx = tantivy.Index(schema, path=None) + idx.register_tokenizer("paperless_text", _paperless_text("")) + return idx + + @pytest.fixture + def bigram_index(self) -> tantivy.Index: + """Index with bigram field for CJK tests.""" + sb = tantivy.SchemaBuilder() + sb.add_text_field( + "bigram_content", + stored=False, + tokenizer_name="bigram_analyzer", + ) + schema = sb.build() + idx = tantivy.Index(schema, path=None) + idx.register_tokenizer("bigram_analyzer", _bigram_analyzer()) + return idx + + def test_ascii_fold_finds_accented_content( + self, + content_index: tantivy.Index, + ) -> None: + """ASCII folding allows searching accented text with plain ASCII queries.""" + writer = content_index.writer() + doc = tantivy.Document() + doc.add_text("content", "café résumé") + writer.add_document(doc) + writer.commit() + content_index.reload() + q = content_index.parse_query("cafe resume", ["content"]) + assert content_index.searcher().search(q, limit=5).count == 1 + + def test_bigram_finds_cjk_substring(self, bigram_index: tantivy.Index) -> None: + """Bigram tokenizer enables substring search in CJK languages without whitespace delimiters.""" + writer = bigram_index.writer() + doc = tantivy.Document() + doc.add_text("bigram_content", "東京都") + writer.add_document(doc) + writer.commit() + bigram_index.reload() + q = bigram_index.parse_query("東京", ["bigram_content"]) + assert bigram_index.searcher().search(q, limit=5).count == 1 + + def test_unsupported_language_logs_warning(self, caplog: LogCaptureFixture) -> None: + """Unsupported language codes should log a warning and disable stemming gracefully.""" + sb = tantivy.SchemaBuilder() + sb.add_text_field("content", stored=True, tokenizer_name="paperless_text") + schema = sb.build() + idx = tantivy.Index(schema, path=None) + + with caplog.at_level(logging.WARNING, logger="paperless.search"): + register_tokenizers(idx, "klingon") + assert "klingon" in caplog.text diff --git a/src/documents/tests/test_admin.py b/src/documents/tests/test_admin.py index de2f07df5..533319c2f 100644 --- a/src/documents/tests/test_admin.py +++ b/src/documents/tests/test_admin.py @@ -1,6 +1,7 @@ import types from unittest.mock import patch +import tantivy from django.contrib.admin.sites import AdminSite from django.contrib.auth.models import Permission from django.contrib.auth.models import User @@ -8,36 +9,54 @@ from django.test import TestCase from django.utils import timezone from rest_framework import status -from documents import index from documents.admin import DocumentAdmin from documents.admin import TagAdmin from documents.models import Document from documents.models import Tag +from documents.search import get_backend +from documents.search import reset_backend from documents.tests.utils import DirectoriesMixin from paperless.admin import PaperlessUserAdmin class TestDocumentAdmin(DirectoriesMixin, TestCase): def get_document_from_index(self, doc): - ix = index.open_index() - with ix.searcher() as searcher: - return searcher.document(id=doc.id) + backend = get_backend() + searcher = backend._index.searcher() + results = searcher.search( + tantivy.Query.range_query( + backend._schema, + "id", + tantivy.FieldType.Unsigned, + doc.pk, + doc.pk, + ), + limit=1, + ) + if results.hits: + return searcher.doc(results.hits[0][1]).to_dict() + return None def setUp(self) -> None: super().setUp() + reset_backend() self.doc_admin = DocumentAdmin(model=Document, admin_site=AdminSite()) + def tearDown(self) -> None: + reset_backend() + super().tearDown() + def test_save_model(self) -> None: doc = Document.objects.create(title="test") doc.title = "new title" self.doc_admin.save_model(None, doc, None, None) self.assertEqual(Document.objects.get(id=doc.id).title, "new title") - self.assertEqual(self.get_document_from_index(doc)["id"], doc.id) + self.assertEqual(self.get_document_from_index(doc)["id"], [doc.id]) def test_delete_model(self) -> None: doc = Document.objects.create(title="test") - index.add_or_update_document(doc) + get_backend().add_or_update(doc) self.assertIsNotNone(self.get_document_from_index(doc)) self.doc_admin.delete_model(None, doc) @@ -53,7 +72,7 @@ class TestDocumentAdmin(DirectoriesMixin, TestCase): checksum=f"{i:02}", ) docs.append(doc) - index.add_or_update_document(doc) + get_backend().add_or_update(doc) self.assertEqual(Document.objects.count(), 42) diff --git a/src/documents/tests/test_api_document_versions.py b/src/documents/tests/test_api_document_versions.py index f5c1a7346..d95e78fe9 100644 --- a/src/documents/tests/test_api_document_versions.py +++ b/src/documents/tests/test_api_document_versions.py @@ -109,7 +109,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): mime_type="application/pdf", ) - with mock.patch("documents.index.remove_document_from_index"): + with mock.patch("documents.search.get_backend"): resp = self.client.delete(f"/api/documents/{root.id}/versions/{root.id}/") self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) @@ -137,10 +137,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): content="v2-content", ) - with ( - mock.patch("documents.index.remove_document_from_index"), - mock.patch("documents.index.add_or_update_document"), - ): + with mock.patch("documents.search.get_backend"): resp = self.client.delete(f"/api/documents/{root.id}/versions/{v2.id}/") self.assertEqual(resp.status_code, status.HTTP_200_OK) @@ -149,10 +146,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): root.refresh_from_db() self.assertEqual(root.content, "root-content") - with ( - mock.patch("documents.index.remove_document_from_index"), - mock.patch("documents.index.add_or_update_document"), - ): + with mock.patch("documents.search.get_backend"): resp = self.client.delete(f"/api/documents/{root.id}/versions/{v1.id}/") self.assertEqual(resp.status_code, status.HTTP_200_OK) @@ -175,10 +169,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): ) version_id = version.id - with ( - mock.patch("documents.index.remove_document_from_index"), - mock.patch("documents.index.add_or_update_document"), - ): + with mock.patch("documents.search.get_backend"): resp = self.client.delete( f"/api/documents/{root.id}/versions/{version_id}/", ) @@ -225,7 +216,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): root_document=other_root, ) - with mock.patch("documents.index.remove_document_from_index"): + with mock.patch("documents.search.get_backend"): resp = self.client.delete( f"/api/documents/{root.id}/versions/{other_version.id}/", ) @@ -245,10 +236,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): root_document=root, ) - with ( - mock.patch("documents.index.remove_document_from_index"), - mock.patch("documents.index.add_or_update_document"), - ): + with mock.patch("documents.search.get_backend"): resp = self.client.delete( f"/api/documents/{version.id}/versions/{version.id}/", ) @@ -275,18 +263,17 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): root_document=root, ) - with ( - mock.patch("documents.index.remove_document_from_index") as remove_index, - mock.patch("documents.index.add_or_update_document") as add_or_update, - ): + with mock.patch("documents.search.get_backend") as mock_get_backend: + mock_backend = mock.MagicMock() + mock_get_backend.return_value = mock_backend resp = self.client.delete( f"/api/documents/{root.id}/versions/{version.id}/", ) self.assertEqual(resp.status_code, status.HTTP_200_OK) - remove_index.assert_called_once_with(version) - add_or_update.assert_called_once() - self.assertEqual(add_or_update.call_args[0][0].id, root.id) + mock_backend.remove.assert_called_once_with(version.pk) + mock_backend.add_or_update.assert_called_once() + self.assertEqual(mock_backend.add_or_update.call_args[0][0].id, root.id) def test_delete_version_returns_403_without_permission(self) -> None: owner = User.objects.create_user(username="owner") diff --git a/src/documents/tests/test_api_search.py b/src/documents/tests/test_api_search.py index 546dff233..69bd65198 100644 --- a/src/documents/tests/test_api_search.py +++ b/src/documents/tests/test_api_search.py @@ -2,6 +2,7 @@ import datetime from datetime import timedelta from unittest import mock +import pytest from dateutil.relativedelta import relativedelta from django.contrib.auth.models import Group from django.contrib.auth.models import Permission @@ -11,9 +12,7 @@ from django.utils import timezone from guardian.shortcuts import assign_perm from rest_framework import status from rest_framework.test import APITestCase -from whoosh.writing import AsyncWriter -from documents import index from documents.bulk_edit import set_permissions from documents.models import Correspondent from documents.models import CustomField @@ -25,18 +24,27 @@ from documents.models import SavedView from documents.models import StoragePath from documents.models import Tag from documents.models import Workflow +from documents.search import get_backend +from documents.search import reset_backend from documents.tests.utils import DirectoriesMixin from paperless_mail.models import MailAccount from paperless_mail.models import MailRule +pytestmark = pytest.mark.search + class TestDocumentSearchApi(DirectoriesMixin, APITestCase): def setUp(self) -> None: super().setUp() + reset_backend() self.user = User.objects.create_superuser(username="temp_admin") self.client.force_authenticate(user=self.user) + def tearDown(self) -> None: + reset_backend() + super().tearDown() + def test_search(self) -> None: d1 = Document.objects.create( title="invoice", @@ -57,13 +65,11 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): checksum="C", original_filename="someepdf.pdf", ) - with AsyncWriter(index.open_index()) as writer: - # Note to future self: there is a reason we dont use a model signal handler to update the index: some operations edit many documents at once - # (retagger, renamer) and we don't want to open a writer for each of these, but rather perform the entire operation with one writer. - # That's why we can't open the writer in a model on_save handler or something. - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) + response = self.client.get("/api/documents/?query=bank") results = response.data["results"] self.assertEqual(response.data["count"], 3) @@ -98,9 +104,9 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): checksum="B", pk=2, ) - with AsyncWriter(index.open_index()) as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) response = self.client.get( "/api/documents/?query=bank", @@ -127,8 +133,7 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): ) matching_doc.tags.add(tag) - with AsyncWriter(index.open_index()) as writer: - index.update_document(writer, matching_doc) + get_backend().add_or_update(matching_doc) response = self.client.get( "/api/documents/?query=bank&include_selection_data=true", @@ -187,10 +192,10 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): value_int=20, ) - with AsyncWriter(index.open_index()) as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) response = self.client.get( f"/api/documents/?query=match&ordering=custom_field_{custom_field.pk}", @@ -211,15 +216,15 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): ) def test_search_multi_page(self) -> None: - with AsyncWriter(index.open_index()) as writer: - for i in range(55): - doc = Document.objects.create( - checksum=str(i), - pk=i + 1, - title=f"Document {i + 1}", - content="content", - ) - index.update_document(writer, doc) + backend = get_backend() + for i in range(55): + doc = Document.objects.create( + checksum=str(i), + pk=i + 1, + title=f"Document {i + 1}", + content="content", + ) + backend.add_or_update(doc) # This is here so that we test that no document gets returned twice (might happen if the paging is not working) seen_ids = [] @@ -246,15 +251,15 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): seen_ids.append(result["id"]) def test_search_invalid_page(self) -> None: - with AsyncWriter(index.open_index()) as writer: - for i in range(15): - doc = Document.objects.create( - checksum=str(i), - pk=i + 1, - title=f"Document {i + 1}", - content="content", - ) - index.update_document(writer, doc) + backend = get_backend() + for i in range(15): + doc = Document.objects.create( + checksum=str(i), + pk=i + 1, + title=f"Document {i + 1}", + content="content", + ) + backend.add_or_update(doc) response = self.client.get("/api/documents/?query=content&page=0&page_size=10") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) @@ -292,26 +297,25 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): pk=3, checksum="C", ) - with index.open_index_writer() as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) response = self.client.get("/api/documents/?query=added:[-1 week to now]") results = response.data["results"] # Expect 3 documents returned self.assertEqual(len(results), 3) - for idx, subset in enumerate( - [ - {"id": 1, "title": "invoice"}, - {"id": 2, "title": "bank statement 1"}, - {"id": 3, "title": "bank statement 3"}, - ], - ): - result = results[idx] - # Assert subset in results - self.assertDictEqual(result, {**result, **subset}) + result_map = {r["id"]: r for r in results} + self.assertEqual(set(result_map.keys()), {1, 2, 3}) + for subset in [ + {"id": 1, "title": "invoice"}, + {"id": 2, "title": "bank statement 1"}, + {"id": 3, "title": "bank statement 3"}, + ]: + r = result_map[subset["id"]] + self.assertDictEqual(r, {**r, **subset}) @override_settings( TIME_ZONE="America/Chicago", @@ -347,10 +351,10 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): # 7 days, 1 hour and 1 minute ago added=timezone.now() - timedelta(days=7, hours=1, minutes=1), ) - with index.open_index_writer() as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) response = self.client.get("/api/documents/?query=added:[-1 week to now]") results = response.data["results"] @@ -358,12 +362,14 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): # Expect 2 documents returned self.assertEqual(len(results), 2) - for idx, subset in enumerate( - [{"id": 1, "title": "invoice"}, {"id": 2, "title": "bank statement 1"}], - ): - result = results[idx] - # Assert subset in results - self.assertDictEqual(result, {**result, **subset}) + result_map = {r["id"]: r for r in results} + self.assertEqual(set(result_map.keys()), {1, 2}) + for subset in [ + {"id": 1, "title": "invoice"}, + {"id": 2, "title": "bank statement 1"}, + ]: + r = result_map[subset["id"]] + self.assertDictEqual(r, {**r, **subset}) @override_settings( TIME_ZONE="Europe/Sofia", @@ -399,10 +405,10 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): # 7 days, 1 hour and 1 minute ago added=timezone.now() - timedelta(days=7, hours=1, minutes=1), ) - with index.open_index_writer() as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) response = self.client.get("/api/documents/?query=added:[-1 week to now]") results = response.data["results"] @@ -410,12 +416,14 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): # Expect 2 documents returned self.assertEqual(len(results), 2) - for idx, subset in enumerate( - [{"id": 1, "title": "invoice"}, {"id": 2, "title": "bank statement 1"}], - ): - result = results[idx] - # Assert subset in results - self.assertDictEqual(result, {**result, **subset}) + result_map = {r["id"]: r for r in results} + self.assertEqual(set(result_map.keys()), {1, 2}) + for subset in [ + {"id": 1, "title": "invoice"}, + {"id": 2, "title": "bank statement 1"}, + ]: + r = result_map[subset["id"]] + self.assertDictEqual(r, {**r, **subset}) def test_search_added_in_last_month(self) -> None: """ @@ -451,10 +459,10 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): added=timezone.now() - timedelta(days=7, hours=1, minutes=1), ) - with index.open_index_writer() as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) response = self.client.get("/api/documents/?query=added:[-1 month to now]") results = response.data["results"] @@ -462,12 +470,14 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): # Expect 2 documents returned self.assertEqual(len(results), 2) - for idx, subset in enumerate( - [{"id": 1, "title": "invoice"}, {"id": 3, "title": "bank statement 3"}], - ): - result = results[idx] - # Assert subset in results - self.assertDictEqual(result, {**result, **subset}) + result_map = {r["id"]: r for r in results} + self.assertEqual(set(result_map.keys()), {1, 3}) + for subset in [ + {"id": 1, "title": "invoice"}, + {"id": 3, "title": "bank statement 3"}, + ]: + r = result_map[subset["id"]] + self.assertDictEqual(r, {**r, **subset}) @override_settings( TIME_ZONE="America/Denver", @@ -507,10 +517,10 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): added=timezone.now() - timedelta(days=7, hours=1, minutes=1), ) - with index.open_index_writer() as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) response = self.client.get("/api/documents/?query=added:[-1 month to now]") results = response.data["results"] @@ -518,12 +528,14 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): # Expect 2 documents returned self.assertEqual(len(results), 2) - for idx, subset in enumerate( - [{"id": 1, "title": "invoice"}, {"id": 3, "title": "bank statement 3"}], - ): - result = results[idx] - # Assert subset in results - self.assertDictEqual(result, {**result, **subset}) + result_map = {r["id"]: r for r in results} + self.assertEqual(set(result_map.keys()), {1, 3}) + for subset in [ + {"id": 1, "title": "invoice"}, + {"id": 3, "title": "bank statement 3"}, + ]: + r = result_map[subset["id"]] + self.assertDictEqual(r, {**r, **subset}) @override_settings( TIME_ZONE="Europe/Sofia", @@ -563,10 +575,10 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): # Django converts dates to UTC d3.refresh_from_db() - with index.open_index_writer() as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) response = self.client.get("/api/documents/?query=added:20231201") results = response.data["results"] @@ -574,12 +586,8 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): # Expect 1 document returned self.assertEqual(len(results), 1) - for idx, subset in enumerate( - [{"id": 3, "title": "bank statement 3"}], - ): - result = results[idx] - # Assert subset in results - self.assertDictEqual(result, {**result, **subset}) + self.assertEqual(results[0]["id"], 3) + self.assertEqual(results[0]["title"], "bank statement 3") def test_search_added_invalid_date(self) -> None: """ @@ -588,7 +596,7 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): WHEN: - Query with invalid added date THEN: - - No documents returned + - 400 Bad Request returned (Tantivy rejects invalid date field syntax) """ d1 = Document.objects.create( title="invoice", @@ -597,16 +605,14 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): pk=1, ) - with index.open_index_writer() as writer: - index.update_document(writer, d1) + get_backend().add_or_update(d1) response = self.client.get("/api/documents/?query=added:invalid-date") - results = response.data["results"] - # Expect 0 document returned - self.assertEqual(len(results), 0) + # Tantivy rejects unparsable field queries with a 400 + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - @mock.patch("documents.index.autocomplete") + @mock.patch("documents.search._backend.TantivyBackend.autocomplete") def test_search_autocomplete_limits(self, m) -> None: """ GIVEN: @@ -618,7 +624,7 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): - Limit requests are obeyed """ - m.side_effect = lambda ix, term, limit, user: [term for _ in range(limit)] + m.side_effect = lambda term, limit, user=None: [term for _ in range(limit)] response = self.client.get("/api/search/autocomplete/?term=test") self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -671,32 +677,29 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): owner=u1, ) - with AsyncWriter(index.open_index()) as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) response = self.client.get("/api/search/autocomplete/?term=app") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, [b"apples", b"applebaum", b"appletini"]) + self.assertEqual(response.data, ["applebaum", "apples", "appletini"]) d3.owner = u2 - - with AsyncWriter(index.open_index()) as writer: - index.update_document(writer, d3) + d3.save() + backend.add_or_update(d3) response = self.client.get("/api/search/autocomplete/?term=app") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, [b"apples", b"applebaum"]) + self.assertEqual(response.data, ["applebaum", "apples"]) assign_perm("view_document", u1, d3) - - with AsyncWriter(index.open_index()) as writer: - index.update_document(writer, d3) + backend.add_or_update(d3) response = self.client.get("/api/search/autocomplete/?term=app") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, [b"apples", b"applebaum", b"appletini"]) + self.assertEqual(response.data, ["applebaum", "apples", "appletini"]) def test_search_autocomplete_field_name_match(self) -> None: """ @@ -714,8 +717,7 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): checksum="1", ) - with AsyncWriter(index.open_index()) as writer: - index.update_document(writer, d1) + get_backend().add_or_update(d1) response = self.client.get("/api/search/autocomplete/?term=created:2023") self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -736,33 +738,36 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): checksum="1", ) - with AsyncWriter(index.open_index()) as writer: - index.update_document(writer, d1) + get_backend().add_or_update(d1) response = self.client.get("/api/search/autocomplete/?term=auto") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data[0], b"auto") + self.assertEqual(response.data[0], "auto") - def test_search_spelling_suggestion(self) -> None: - with AsyncWriter(index.open_index()) as writer: - for i in range(55): - doc = Document.objects.create( - checksum=str(i), - pk=i + 1, - title=f"Document {i + 1}", - content=f"Things document {i + 1}", - ) - index.update_document(writer, doc) + def test_search_no_spelling_suggestion(self) -> None: + """ + GIVEN: + - Documents exist with various terms + WHEN: + - Query for documents with any term + THEN: + - corrected_query is always None (Tantivy has no spell correction) + """ + backend = get_backend() + for i in range(5): + doc = Document.objects.create( + checksum=str(i), + pk=i + 1, + title=f"Document {i + 1}", + content=f"Things document {i + 1}", + ) + backend.add_or_update(doc) response = self.client.get("/api/documents/?query=thing") - correction = response.data["corrected_query"] - - self.assertEqual(correction, "things") + self.assertIsNone(response.data["corrected_query"]) response = self.client.get("/api/documents/?query=things") - correction = response.data["corrected_query"] - - self.assertEqual(correction, None) + self.assertIsNone(response.data["corrected_query"]) def test_search_spelling_suggestion_suppressed_for_private_terms(self): owner = User.objects.create_user("owner") @@ -771,24 +776,24 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): Permission.objects.get(codename="view_document"), ) - with AsyncWriter(index.open_index()) as writer: - for i in range(55): - private_doc = Document.objects.create( - checksum=f"p{i}", - pk=100 + i, - title=f"Private Document {i + 1}", - content=f"treasury document {i + 1}", - owner=owner, - ) - visible_doc = Document.objects.create( - checksum=f"v{i}", - pk=200 + i, - title=f"Visible Document {i + 1}", - content=f"public ledger {i + 1}", - owner=attacker, - ) - index.update_document(writer, private_doc) - index.update_document(writer, visible_doc) + backend = get_backend() + for i in range(5): + private_doc = Document.objects.create( + checksum=f"p{i}", + pk=100 + i, + title=f"Private Document {i + 1}", + content=f"treasury document {i + 1}", + owner=owner, + ) + visible_doc = Document.objects.create( + checksum=f"v{i}", + pk=200 + i, + title=f"Visible Document {i + 1}", + content=f"public ledger {i + 1}", + owner=attacker, + ) + backend.add_or_update(private_doc) + backend.add_or_update(visible_doc) self.client.force_authenticate(user=attacker) @@ -798,26 +803,6 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): self.assertEqual(response.data["count"], 0) self.assertIsNone(response.data["corrected_query"]) - @mock.patch( - "whoosh.searching.Searcher.correct_query", - side_effect=Exception("Test error"), - ) - def test_corrected_query_error(self, mock_correct_query) -> None: - """ - GIVEN: - - A query that raises an error on correction - WHEN: - - API request for search with that query - THEN: - - The error is logged and the search proceeds - """ - with self.assertLogs("paperless.index", level="INFO") as cm: - response = self.client.get("/api/documents/?query=2025-06-04") - self.assertEqual(response.status_code, status.HTTP_200_OK) - error_str = cm.output[0] - expected_str = "Error while correcting query '2025-06-04': Test error" - self.assertIn(expected_str, error_str) - def test_search_more_like(self) -> None: """ GIVEN: @@ -847,16 +832,16 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): checksum="C", ) d4 = Document.objects.create( - title="Monty Python & the Holy Grail", - content="And now for something completely different", + title="Quarterly Report", + content="quarterly revenue profit margin earnings growth", pk=4, checksum="ABC", ) - with AsyncWriter(index.open_index()) as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) - index.update_document(writer, d4) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) + backend.add_or_update(d4) response = self.client.get(f"/api/documents/?more_like_id={d2.id}") @@ -864,9 +849,10 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): results = response.data["results"] - self.assertEqual(len(results), 2) - self.assertEqual(results[0]["id"], d3.id) - self.assertEqual(results[1]["id"], d1.id) + self.assertGreaterEqual(len(results), 1) + result_ids = [r["id"] for r in results] + self.assertIn(d3.id, result_ids) + self.assertNotIn(d4.id, result_ids) def test_search_more_like_requires_view_permission_on_seed_document( self, @@ -908,10 +894,10 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): pk=12, ) - with AsyncWriter(index.open_index()) as writer: - index.update_document(writer, private_seed) - index.update_document(writer, visible_doc) - index.update_document(writer, other_doc) + backend = get_backend() + backend.add_or_update(private_seed) + backend.add_or_update(visible_doc) + backend.add_or_update(other_doc) self.client.force_authenticate(user=attacker) @@ -985,9 +971,9 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): value_text="foobard4", ) - with AsyncWriter(index.open_index()) as writer: - for doc in Document.objects.all(): - index.update_document(writer, doc) + backend = get_backend() + for doc in Document.objects.all(): + backend.add_or_update(doc) def search_query(q): r = self.client.get("/api/documents/?query=test" + q) @@ -1203,9 +1189,9 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): Document.objects.create(checksum="3", content="test 3", owner=u2) Document.objects.create(checksum="4", content="test 4") - with AsyncWriter(index.open_index()) as writer: - for doc in Document.objects.all(): - index.update_document(writer, doc) + backend = get_backend() + for doc in Document.objects.all(): + backend.add_or_update(doc) self.client.force_authenticate(user=u1) r = self.client.get("/api/documents/?query=test") @@ -1256,9 +1242,9 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): d3 = Document.objects.create(checksum="3", content="test 3", owner=u2) Document.objects.create(checksum="4", content="test 4") - with AsyncWriter(index.open_index()) as writer: - for doc in Document.objects.all(): - index.update_document(writer, doc) + backend = get_backend() + for doc in Document.objects.all(): + backend.add_or_update(doc) self.client.force_authenticate(user=u1) r = self.client.get("/api/documents/?query=test") @@ -1278,9 +1264,9 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): assign_perm("view_document", u1, d3) assign_perm("view_document", u2, d1) - with AsyncWriter(index.open_index()) as writer: - for doc in [d1, d2, d3]: - index.update_document(writer, doc) + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) self.client.force_authenticate(user=u1) r = self.client.get("/api/documents/?query=test") @@ -1343,9 +1329,9 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): user=u1, ) - with AsyncWriter(index.open_index()) as writer: - for doc in Document.objects.all(): - index.update_document(writer, doc) + backend = get_backend() + for doc in Document.objects.all(): + backend.add_or_update(doc) def search_query(q): r = self.client.get("/api/documents/?query=test" + q) @@ -1378,13 +1364,14 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): search_query("&ordering=-num_notes"), [d1.id, d3.id, d2.id], ) + # owner sort: ORM orders by owner_id (integer); NULLs first in SQLite ASC self.assertListEqual( search_query("&ordering=owner"), - [d1.id, d2.id, d3.id], + [d3.id, d1.id, d2.id], ) self.assertListEqual( search_query("&ordering=-owner"), - [d3.id, d2.id, d1.id], + [d2.id, d1.id, d3.id], ) @mock.patch("documents.bulk_edit.bulk_update_documents") @@ -1441,12 +1428,12 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): ) set_permissions([4, 5], set_permissions={}, owner=user2, merge=False) - with index.open_index_writer() as writer: - index.update_document(writer, d1) - index.update_document(writer, d2) - index.update_document(writer, d3) - index.update_document(writer, d4) - index.update_document(writer, d5) + backend = get_backend() + backend.add_or_update(d1) + backend.add_or_update(d2) + backend.add_or_update(d3) + backend.add_or_update(d4) + backend.add_or_update(d5) correspondent1 = Correspondent.objects.create(name="bank correspondent 1") Correspondent.objects.create(name="correspondent 2") diff --git a/src/documents/tests/test_api_status.py b/src/documents/tests/test_api_status.py index b8f7d408e..32717af63 100644 --- a/src/documents/tests/test_api_status.py +++ b/src/documents/tests/test_api_status.py @@ -191,40 +191,42 @@ class TestSystemStatus(APITestCase): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["tasks"]["celery_status"], "OK") - @override_settings(INDEX_DIR=Path("/tmp/index")) - @mock.patch("whoosh.index.FileIndex.last_modified") - def test_system_status_index_ok(self, mock_last_modified) -> None: + @mock.patch("documents.search.get_backend") + def test_system_status_index_ok(self, mock_get_backend) -> None: """ GIVEN: - - The index last modified time is set + - The index is accessible WHEN: - The user requests the system status THEN: - The response contains the correct index status """ - mock_last_modified.return_value = 1707839087 - self.client.force_login(self.user) - response = self.client.get(self.ENDPOINT) + mock_get_backend.return_value = mock.MagicMock() + # Use the temp dir created in setUp (self.tmp_dir) as a real INDEX_DIR + # with a real file so the mtime lookup works + sentinel = self.tmp_dir / "sentinel.txt" + sentinel.write_text("ok") + with self.settings(INDEX_DIR=self.tmp_dir): + self.client.force_login(self.user) + response = self.client.get(self.ENDPOINT) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["tasks"]["index_status"], "OK") self.assertIsNotNone(response.data["tasks"]["index_last_modified"]) - @override_settings(INDEX_DIR=Path("/tmp/index/")) - @mock.patch("documents.index.open_index", autospec=True) - def test_system_status_index_error(self, mock_open_index) -> None: + @mock.patch("documents.search.get_backend") + def test_system_status_index_error(self, mock_get_backend) -> None: """ GIVEN: - - The index is not found + - The index cannot be opened WHEN: - The user requests the system status THEN: - The response contains the correct index status """ - mock_open_index.return_value = None - mock_open_index.side_effect = Exception("Index error") + mock_get_backend.side_effect = Exception("Index error") self.client.force_login(self.user) response = self.client.get(self.ENDPOINT) - mock_open_index.assert_called_once() + mock_get_backend.assert_called_once() self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["tasks"]["index_status"], "ERROR") self.assertIsNotNone(response.data["tasks"]["index_error"]) diff --git a/src/documents/tests/test_delayedquery.py b/src/documents/tests/test_delayedquery.py deleted file mode 100644 index 6357d9030..000000000 --- a/src/documents/tests/test_delayedquery.py +++ /dev/null @@ -1,58 +0,0 @@ -from django.test import TestCase -from whoosh import query - -from documents.index import get_permissions_criterias -from documents.models import User - - -class TestDelayedQuery(TestCase): - def setUp(self) -> None: - super().setUp() - # all tests run without permission criteria, so has_no_owner query will always - # be appended. - self.has_no_owner = query.Or([query.Term("has_owner", text=False)]) - - def _get_testset__id__in(self, param, field): - return ( - {f"{param}__id__in": "42,43"}, - query.And( - [ - query.Or( - [ - query.Term(f"{field}_id", "42"), - query.Term(f"{field}_id", "43"), - ], - ), - self.has_no_owner, - ], - ), - ) - - def _get_testset__id__none(self, param, field): - return ( - {f"{param}__id__none": "42,43"}, - query.And( - [ - query.Not(query.Term(f"{field}_id", "42")), - query.Not(query.Term(f"{field}_id", "43")), - self.has_no_owner, - ], - ), - ) - - def test_get_permission_criteria(self) -> None: - # tests contains tuples of user instances and the expected filter - tests = ( - (None, [query.Term("has_owner", text=False)]), - (User(42, username="foo", is_superuser=True), []), - ( - User(42, username="foo", is_superuser=False), - [ - query.Term("has_owner", text=False), - query.Term("owner_id", 42), - query.Term("viewer_id", "42"), - ], - ), - ) - for user, expected in tests: - self.assertEqual(get_permissions_criterias(user), expected) diff --git a/src/documents/tests/test_index.py b/src/documents/tests/test_index.py deleted file mode 100644 index 5f1c7487d..000000000 --- a/src/documents/tests/test_index.py +++ /dev/null @@ -1,371 +0,0 @@ -from datetime import datetime -from unittest import mock - -from django.conf import settings -from django.contrib.auth.models import User -from django.test import SimpleTestCase -from django.test import TestCase -from django.test import override_settings -from django.utils.timezone import get_current_timezone -from django.utils.timezone import timezone - -from documents import index -from documents.models import Document -from documents.tests.utils import DirectoriesMixin - - -class TestAutoComplete(DirectoriesMixin, TestCase): - def test_auto_complete(self) -> None: - doc1 = Document.objects.create( - title="doc1", - checksum="A", - content="test test2 test3", - ) - doc2 = Document.objects.create(title="doc2", checksum="B", content="test test2") - doc3 = Document.objects.create(title="doc3", checksum="C", content="test2") - - index.add_or_update_document(doc1) - index.add_or_update_document(doc2) - index.add_or_update_document(doc3) - - ix = index.open_index() - - self.assertListEqual( - index.autocomplete(ix, "tes"), - [b"test2", b"test", b"test3"], - ) - self.assertListEqual( - index.autocomplete(ix, "tes", limit=3), - [b"test2", b"test", b"test3"], - ) - self.assertListEqual(index.autocomplete(ix, "tes", limit=1), [b"test2"]) - self.assertListEqual(index.autocomplete(ix, "tes", limit=0), []) - - def test_archive_serial_number_ranging(self) -> None: - """ - GIVEN: - - Document with an archive serial number above schema allowed size - WHEN: - - Document is provided to the index - THEN: - - Error is logged - - Document ASN is reset to 0 for the index - """ - doc1 = Document.objects.create( - title="doc1", - checksum="A", - content="test test2 test3", - # yes, this is allowed, unless full_clean is run - # DRF does call the validators, this test won't - archive_serial_number=Document.ARCHIVE_SERIAL_NUMBER_MAX + 1, - ) - with self.assertLogs("paperless.index", level="ERROR") as cm: - with mock.patch( - "documents.index.AsyncWriter.update_document", - ) as mocked_update_doc: - index.add_or_update_document(doc1) - - mocked_update_doc.assert_called_once() - _, kwargs = mocked_update_doc.call_args - - self.assertEqual(kwargs["asn"], 0) - - error_str = cm.output[0] - expected_str = "ERROR:paperless.index:Not indexing Archive Serial Number 4294967296 of document 1" - self.assertIn(expected_str, error_str) - - def test_archive_serial_number_is_none(self) -> None: - """ - GIVEN: - - Document with no archive serial number - WHEN: - - Document is provided to the index - THEN: - - ASN isn't touched - """ - doc1 = Document.objects.create( - title="doc1", - checksum="A", - content="test test2 test3", - ) - with mock.patch( - "documents.index.AsyncWriter.update_document", - ) as mocked_update_doc: - index.add_or_update_document(doc1) - - mocked_update_doc.assert_called_once() - _, kwargs = mocked_update_doc.call_args - - self.assertIsNone(kwargs["asn"]) - - @override_settings(TIME_ZONE="Pacific/Auckland") - def test_added_today_respects_local_timezone_boundary(self) -> None: - tz = get_current_timezone() - fixed_now = datetime(2025, 7, 20, 15, 0, 0, tzinfo=tz) - - # Fake a time near the local boundary (1 AM NZT = 13:00 UTC on previous UTC day) - local_dt = datetime(2025, 7, 20, 1, 0, 0).replace(tzinfo=tz) - utc_dt = local_dt.astimezone(timezone.utc) - - doc = Document.objects.create( - title="Time zone", - content="Testing added:today", - checksum="edgecase123", - added=utc_dt, - ) - - with index.open_index_writer() as writer: - index.update_document(writer, doc) - - superuser = User.objects.create_superuser(username="testuser") - self.client.force_login(superuser) - - with mock.patch("documents.index.now", return_value=fixed_now): - response = self.client.get("/api/documents/?query=added:today") - results = response.json()["results"] - self.assertEqual(len(results), 1) - self.assertEqual(results[0]["id"], doc.id) - - response = self.client.get("/api/documents/?query=added:yesterday") - results = response.json()["results"] - self.assertEqual(len(results), 0) - - -@override_settings(TIME_ZONE="UTC") -class TestRewriteNaturalDateKeywords(SimpleTestCase): - """ - Unit tests for rewrite_natural_date_keywords function. - """ - - def _rewrite_with_now(self, query: str, now_dt: datetime) -> str: - with mock.patch("documents.index.now", return_value=now_dt): - return index.rewrite_natural_date_keywords(query) - - def _assert_rewrite_contains( - self, - query: str, - now_dt: datetime, - *expected_fragments: str, - ) -> str: - result = self._rewrite_with_now(query, now_dt) - for fragment in expected_fragments: - self.assertIn(fragment, result) - return result - - def test_range_keywords(self) -> None: - """ - Test various different range keywords - """ - cases = [ - ( - "added:today", - datetime(2025, 7, 20, 15, 30, 45, tzinfo=timezone.utc), - ("added:[20250720", "TO 20250720"), - ), - ( - "added:yesterday", - datetime(2025, 7, 20, 15, 30, 45, tzinfo=timezone.utc), - ("added:[20250719", "TO 20250719"), - ), - ( - "added:this month", - datetime(2025, 7, 15, 12, 0, 0, tzinfo=timezone.utc), - ("added:[20250701", "TO 20250731"), - ), - ( - "added:previous month", - datetime(2025, 7, 15, 12, 0, 0, tzinfo=timezone.utc), - ("added:[20250601", "TO 20250630"), - ), - ( - "added:this year", - datetime(2025, 7, 15, 12, 0, 0, tzinfo=timezone.utc), - ("added:[20250101", "TO 20251231"), - ), - ( - "added:previous year", - datetime(2025, 7, 15, 12, 0, 0, tzinfo=timezone.utc), - ("added:[20240101", "TO 20241231"), - ), - # Previous quarter from July 15, 2025 is April-June. - ( - "added:previous quarter", - datetime(2025, 7, 15, 12, 0, 0, tzinfo=timezone.utc), - ("added:[20250401", "TO 20250630"), - ), - # July 20, 2025 is a Sunday (weekday 6) so previous week is July 7-13. - ( - "added:previous week", - datetime(2025, 7, 20, 12, 0, 0, tzinfo=timezone.utc), - ("added:[20250707", "TO 20250713"), - ), - ] - - for query, now_dt, fragments in cases: - with self.subTest(query=query): - self._assert_rewrite_contains(query, now_dt, *fragments) - - def test_additional_fields(self) -> None: - fixed_now = datetime(2025, 7, 20, 15, 30, 45, tzinfo=timezone.utc) - # created - self._assert_rewrite_contains("created:today", fixed_now, "created:[20250720") - # modified - self._assert_rewrite_contains("modified:today", fixed_now, "modified:[20250720") - - def test_basic_syntax_variants(self) -> None: - """ - Test that quoting, casing, and multi-clause queries are parsed. - """ - fixed_now = datetime(2025, 7, 20, 15, 30, 45, tzinfo=timezone.utc) - - # quoted keywords - result1 = self._rewrite_with_now('added:"today"', fixed_now) - result2 = self._rewrite_with_now("added:'today'", fixed_now) - self.assertIn("added:[20250720", result1) - self.assertIn("added:[20250720", result2) - - # case insensitivity - for query in ("added:TODAY", "added:Today", "added:ToDaY"): - with self.subTest(case_variant=query): - self._assert_rewrite_contains(query, fixed_now, "added:[20250720") - - # multiple clauses - result = self._rewrite_with_now("added:today created:yesterday", fixed_now) - self.assertIn("added:[20250720", result) - self.assertIn("created:[20250719", result) - - def test_no_match(self) -> None: - """ - Test that queries without keywords are unchanged. - """ - query = "title:test content:example" - result = index.rewrite_natural_date_keywords(query) - self.assertEqual(query, result) - - @override_settings(TIME_ZONE="Pacific/Auckland") - def test_timezone_awareness(self) -> None: - """ - Test timezone conversion. - """ - # July 20, 2025 1:00 AM NZST = July 19, 2025 13:00 UTC - fixed_now = datetime(2025, 7, 20, 1, 0, 0, tzinfo=get_current_timezone()) - result = self._rewrite_with_now("added:today", fixed_now) - # Should convert to UTC properly - self.assertIn("added:[20250719", result) - - -class TestIndexResilience(DirectoriesMixin, SimpleTestCase): - def _assert_recreate_called(self, mock_create_in) -> None: - mock_create_in.assert_called_once() - path_arg, schema_arg = mock_create_in.call_args.args - self.assertEqual(path_arg, settings.INDEX_DIR) - self.assertEqual(schema_arg.__class__.__name__, "Schema") - - def test_transient_missing_segment_does_not_force_recreate(self) -> None: - """ - GIVEN: - - Index directory exists - WHEN: - - open_index is called - - Opening the index raises FileNotFoundError once due to a - transient missing segment - THEN: - - Index is opened successfully on retry - - Index is not recreated - """ - file_marker = settings.INDEX_DIR / "file_marker.txt" - file_marker.write_text("keep") - expected_index = object() - - with ( - mock.patch("documents.index.exists_in", return_value=True), - mock.patch( - "documents.index.open_dir", - side_effect=[FileNotFoundError("missing"), expected_index], - ) as mock_open_dir, - mock.patch( - "documents.index.create_in", - ) as mock_create_in, - mock.patch( - "documents.index.rmtree", - ) as mock_rmtree, - ): - ix = index.open_index() - - self.assertIs(ix, expected_index) - self.assertGreaterEqual(mock_open_dir.call_count, 2) - mock_rmtree.assert_not_called() - mock_create_in.assert_not_called() - self.assertEqual(file_marker.read_text(), "keep") - - def test_transient_errors_exhaust_retries_and_recreate(self) -> None: - """ - GIVEN: - - Index directory exists - WHEN: - - open_index is called - - Opening the index raises FileNotFoundError multiple times due to - transient missing segments - THEN: - - Index is recreated after retries are exhausted - """ - recreated_index = object() - - with ( - self.assertLogs("paperless.index", level="ERROR") as cm, - mock.patch("documents.index.exists_in", return_value=True), - mock.patch( - "documents.index.open_dir", - side_effect=FileNotFoundError("missing"), - ) as mock_open_dir, - mock.patch("documents.index.rmtree") as mock_rmtree, - mock.patch( - "documents.index.create_in", - return_value=recreated_index, - ) as mock_create_in, - ): - ix = index.open_index() - - self.assertIs(ix, recreated_index) - self.assertEqual(mock_open_dir.call_count, 4) - mock_rmtree.assert_called_once_with(settings.INDEX_DIR) - self._assert_recreate_called(mock_create_in) - self.assertIn( - "Error while opening the index after retries, recreating.", - cm.output[0], - ) - - def test_non_transient_error_recreates_index(self) -> None: - """ - GIVEN: - - Index directory exists - WHEN: - - open_index is called - - Opening the index raises a "non-transient" error - THEN: - - Index is recreated - """ - recreated_index = object() - - with ( - self.assertLogs("paperless.index", level="ERROR") as cm, - mock.patch("documents.index.exists_in", return_value=True), - mock.patch( - "documents.index.open_dir", - side_effect=RuntimeError("boom"), - ), - mock.patch("documents.index.rmtree") as mock_rmtree, - mock.patch( - "documents.index.create_in", - return_value=recreated_index, - ) as mock_create_in, - ): - ix = index.open_index() - - self.assertIs(ix, recreated_index) - mock_rmtree.assert_called_once_with(settings.INDEX_DIR) - self._assert_recreate_called(mock_create_in) - self.assertIn( - "Error while opening the index, recreating.", - cm.output[0], - ) diff --git a/src/documents/tests/test_management.py b/src/documents/tests/test_management.py index 7719d21dd..6ea4431fd 100644 --- a/src/documents/tests/test_management.py +++ b/src/documents/tests/test_management.py @@ -103,16 +103,75 @@ class TestArchiver(DirectoriesMixin, FileSystemAssertsMixin, TestCase): @pytest.mark.management -class TestMakeIndex(TestCase): - @mock.patch("documents.management.commands.document_index.index_reindex") - def test_reindex(self, m) -> None: +@pytest.mark.django_db +class TestMakeIndex: + def test_reindex(self, mocker: MockerFixture) -> None: + """Reindex command must call the backend rebuild method to recreate the index.""" + mock_get_backend = mocker.patch( + "documents.management.commands.document_index.get_backend", + ) call_command("document_index", "reindex", skip_checks=True) - m.assert_called_once() + mock_get_backend.return_value.rebuild.assert_called_once() - @mock.patch("documents.management.commands.document_index.index_optimize") - def test_optimize(self, m) -> None: + def test_optimize(self) -> None: + """Optimize command must execute without error (Tantivy handles optimization automatically).""" call_command("document_index", "optimize", skip_checks=True) - m.assert_called_once() + + def test_reindex_recreate_wipes_index(self, mocker: MockerFixture) -> None: + """Reindex with --recreate must wipe the index before rebuilding.""" + mock_wipe = mocker.patch( + "documents.management.commands.document_index.wipe_index", + ) + mock_get_backend = mocker.patch( + "documents.management.commands.document_index.get_backend", + ) + call_command("document_index", "reindex", recreate=True, skip_checks=True) + mock_wipe.assert_called_once() + mock_get_backend.return_value.rebuild.assert_called_once() + + def test_reindex_without_recreate_does_not_wipe_index( + self, + mocker: MockerFixture, + ) -> None: + """Reindex without --recreate must not wipe the index.""" + mock_wipe = mocker.patch( + "documents.management.commands.document_index.wipe_index", + ) + mocker.patch( + "documents.management.commands.document_index.get_backend", + ) + call_command("document_index", "reindex", skip_checks=True) + mock_wipe.assert_not_called() + + def test_reindex_if_needed_skips_when_up_to_date( + self, + mocker: MockerFixture, + ) -> None: + """Conditional reindex must skip rebuild when schema version and language match.""" + mocker.patch( + "documents.management.commands.document_index.needs_rebuild", + return_value=False, + ) + mock_get_backend = mocker.patch( + "documents.management.commands.document_index.get_backend", + ) + call_command("document_index", "reindex", if_needed=True, skip_checks=True) + mock_get_backend.return_value.rebuild.assert_not_called() + + def test_reindex_if_needed_runs_when_rebuild_needed( + self, + mocker: MockerFixture, + ) -> None: + """Conditional reindex must proceed with rebuild when schema version or language changed.""" + mocker.patch( + "documents.management.commands.document_index.needs_rebuild", + return_value=True, + ) + mock_get_backend = mocker.patch( + "documents.management.commands.document_index.get_backend", + ) + call_command("document_index", "reindex", if_needed=True, skip_checks=True) + mock_get_backend.return_value.rebuild.assert_called_once() @pytest.mark.management diff --git a/src/documents/tests/test_matchables.py b/src/documents/tests/test_matchables.py index e038bf786..e13d3827a 100644 --- a/src/documents/tests/test_matchables.py +++ b/src/documents/tests/test_matchables.py @@ -452,7 +452,10 @@ class TestDocumentConsumptionFinishedSignal(TestCase): """ def setUp(self) -> None: + from documents.search import reset_backend + TestCase.setUp(self) + reset_backend() User.objects.create_user(username="test_consumer", password="12345") self.doc_contains = Document.objects.create( content="I contain the keyword.", @@ -464,6 +467,9 @@ class TestDocumentConsumptionFinishedSignal(TestCase): override_settings(INDEX_DIR=self.index_dir).enable() def tearDown(self) -> None: + from documents.search import reset_backend + + reset_backend() shutil.rmtree(self.index_dir, ignore_errors=True) def test_tag_applied_any(self) -> None: diff --git a/src/documents/tests/test_tag_hierarchy.py b/src/documents/tests/test_tag_hierarchy.py index 12e5475f3..57aa27e3a 100644 --- a/src/documents/tests/test_tag_hierarchy.py +++ b/src/documents/tests/test_tag_hierarchy.py @@ -11,10 +11,12 @@ from documents.models import WorkflowAction from documents.models import WorkflowTrigger from documents.serialisers import TagSerializer from documents.signals.handlers import run_workflows +from documents.tests.utils import DirectoriesMixin -class TestTagHierarchy(APITestCase): +class TestTagHierarchy(DirectoriesMixin, APITestCase): def setUp(self) -> None: + super().setUp() self.user = User.objects.create_superuser(username="admin") self.client.force_authenticate(user=self.user) diff --git a/src/documents/tests/test_task_signals.py b/src/documents/tests/test_task_signals.py index 4f17a8fd2..3dcbbeaff 100644 --- a/src/documents/tests/test_task_signals.py +++ b/src/documents/tests/test_task_signals.py @@ -2,6 +2,7 @@ import uuid from unittest import mock import celery +from django.contrib.auth import get_user_model from django.test import TestCase from documents.data_models import ConsumableDocument @@ -20,6 +21,11 @@ from documents.tests.utils import DirectoriesMixin @mock.patch("documents.consumer.magic.from_file", fake_magic_from_file) class TestTaskSignalHandler(DirectoriesMixin, TestCase): + @classmethod + def setUpTestData(cls) -> None: + super().setUpTestData() + cls.user = get_user_model().objects.create_user(username="testuser") + def util_call_before_task_publish_handler( self, headers_to_use, @@ -57,7 +63,7 @@ class TestTaskSignalHandler(DirectoriesMixin, TestCase): ), DocumentMetadataOverrides( title="Hello world", - owner_id=1, + owner_id=self.user.id, ), ), # kwargs @@ -75,7 +81,7 @@ class TestTaskSignalHandler(DirectoriesMixin, TestCase): self.assertEqual(headers["id"], task.task_id) self.assertEqual("hello-999.pdf", task.task_file_name) self.assertEqual(PaperlessTask.TaskName.CONSUME_FILE, task.task_name) - self.assertEqual(1, task.owner_id) + self.assertEqual(self.user.id, task.owner_id) self.assertEqual(celery.states.PENDING, task.status) def test_task_prerun_handler(self) -> None: @@ -208,10 +214,12 @@ class TestTaskSignalHandler(DirectoriesMixin, TestCase): mime_type="application/pdf", ) - with mock.patch("documents.index.add_or_update_document") as add: + with mock.patch("documents.search.get_backend") as mock_get_backend: + mock_backend = mock.MagicMock() + mock_get_backend.return_value = mock_backend add_to_index(sender=None, document=root) - add.assert_called_once_with(root) + mock_backend.add_or_update.assert_called_once_with(root, effective_content="") def test_add_to_index_reindexes_root_for_version_documents(self) -> None: root = Document.objects.create( @@ -226,13 +234,17 @@ class TestTaskSignalHandler(DirectoriesMixin, TestCase): root_document=root, ) - with mock.patch("documents.index.add_or_update_document") as add: + with mock.patch("documents.search.get_backend") as mock_get_backend: + mock_backend = mock.MagicMock() + mock_get_backend.return_value = mock_backend add_to_index(sender=None, document=version) - self.assertEqual(add.call_count, 2) - self.assertEqual(add.call_args_list[0].args[0].id, version.id) - self.assertEqual(add.call_args_list[1].args[0].id, root.id) + self.assertEqual(mock_backend.add_or_update.call_count, 1) self.assertEqual( - add.call_args_list[1].kwargs, + mock_backend.add_or_update.call_args_list[0].args[0].id, + version.id, + ) + self.assertEqual( + mock_backend.add_or_update.call_args_list[0].kwargs, {"effective_content": version.content}, ) diff --git a/src/documents/tests/test_tasks.py b/src/documents/tests/test_tasks.py index 37f1e6fed..9fb9ddbc6 100644 --- a/src/documents/tests/test_tasks.py +++ b/src/documents/tests/test_tasks.py @@ -23,29 +23,10 @@ from documents.tests.utils import DirectoriesMixin from documents.tests.utils import FileSystemAssertsMixin -class TestIndexReindex(DirectoriesMixin, TestCase): - def test_index_reindex(self) -> None: - Document.objects.create( - title="test", - content="my document", - checksum="wow", - added=timezone.now(), - created=timezone.now(), - modified=timezone.now(), - ) - - tasks.index_reindex() - +@pytest.mark.django_db +class TestIndexOptimize: def test_index_optimize(self) -> None: - Document.objects.create( - title="test", - content="my document", - checksum="wow", - added=timezone.now(), - created=timezone.now(), - modified=timezone.now(), - ) - + """Index optimization task must execute without error (Tantivy handles optimization automatically).""" tasks.index_optimize() diff --git a/src/documents/tests/test_workflows.py b/src/documents/tests/test_workflows.py index 58d989882..0fd893a5b 100644 --- a/src/documents/tests/test_workflows.py +++ b/src/documents/tests/test_workflows.py @@ -4802,6 +4802,7 @@ class TestWebhookSecurity: @pytest.mark.django_db +@pytest.mark.usefixtures("_search_index") class TestDateWorkflowLocalization( SampleDirMixin, ): diff --git a/src/documents/tests/utils.py b/src/documents/tests/utils.py index 346d895aa..cc4190974 100644 --- a/src/documents/tests/utils.py +++ b/src/documents/tests/utils.py @@ -157,11 +157,17 @@ class DirectoriesMixin: """ def setUp(self) -> None: + from documents.search import reset_backend + + reset_backend() self.dirs = setup_directories() super().setUp() def tearDown(self) -> None: + from documents.search import reset_backend + super().tearDown() + reset_backend() remove_dirs(self.dirs) diff --git a/src/documents/utils.py b/src/documents/utils.py index 975185a5f..2ed6758dd 100644 --- a/src/documents/utils.py +++ b/src/documents/utils.py @@ -1,14 +1,27 @@ import hashlib import logging import shutil +from collections.abc import Callable +from collections.abc import Iterable from os import utime from pathlib import Path from subprocess import CompletedProcess from subprocess import run +from typing import TypeVar from django.conf import settings from PIL import Image +_T = TypeVar("_T") + +# A function that wraps an iterable — typically used to inject a progress bar. +IterWrapper = Callable[[Iterable[_T]], Iterable[_T]] + + +def identity(iterable: Iterable[_T]) -> Iterable[_T]: + """Return the iterable unchanged; the no-op default for IterWrapper.""" + return iterable + def _coerce_to_path( source: Path | str, diff --git a/src/documents/views.py b/src/documents/views.py index 244e81161..024e846a0 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -100,7 +100,6 @@ from rest_framework.viewsets import ReadOnlyModelViewSet from rest_framework.viewsets import ViewSet from documents import bulk_edit -from documents import index from documents.bulk_download import ArchiveOnlyStrategy from documents.bulk_download import OriginalAndArchiveStrategy from documents.bulk_download import OriginalsOnlyStrategy @@ -1029,9 +1028,9 @@ class DocumentViewSet( response_data["content"] = content_doc.content response = Response(response_data) - from documents import index + from documents.search import get_backend - index.add_or_update_document(refreshed_doc) + get_backend().add_or_update(refreshed_doc) document_updated.send( sender=self.__class__, @@ -1060,9 +1059,9 @@ class DocumentViewSet( return Response({"results": serializer.data, "selection_data": selection_data}) def destroy(self, request, *args, **kwargs): - from documents import index + from documents.search import get_backend - index.remove_document_from_index(self.get_object()) + get_backend().remove(self.get_object().pk) try: return super().destroy(request, *args, **kwargs) except Exception as e: @@ -1469,9 +1468,9 @@ class DocumentViewSet( doc.modified = timezone.now() doc.save() - from documents import index + from documents.search import get_backend - index.add_or_update_document(doc) + get_backend().add_or_update(doc) notes = serializer.to_representation(doc).get("notes") @@ -1506,9 +1505,9 @@ class DocumentViewSet( doc.modified = timezone.now() doc.save() - from documents import index + from documents.search import get_backend - index.add_or_update_document(doc) + get_backend().add_or_update(doc) notes = serializer.to_representation(doc).get("notes") @@ -1820,12 +1819,13 @@ class DocumentViewSet( "Cannot delete the root/original version. Delete the document instead.", ) - from documents import index + from documents.search import get_backend - index.remove_document_from_index(version_doc) + _backend = get_backend() + _backend.remove(version_doc.pk) version_doc_id = version_doc.id version_doc.delete() - index.add_or_update_document(root_doc) + _backend.add_or_update(root_doc) if settings.AUDIT_LOG_ENABLED: actor = ( request.user if request.user and request.user.is_authenticated else None @@ -2025,10 +2025,6 @@ class ChatStreamingView(GenericAPIView): ), ) class UnifiedSearchViewSet(DocumentViewSet): - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, **kwargs) - self.searcher = None - def get_serializer_class(self): if self._is_search_request(): return SearchResultSerializer @@ -2041,17 +2037,34 @@ class UnifiedSearchViewSet(DocumentViewSet): or "more_like_id" in self.request.query_params ) - def filter_queryset(self, queryset): - filtered_queryset = super().filter_queryset(queryset) + def list(self, request, *args, **kwargs): + if not self._is_search_request(): + return super().list(request) - if self._is_search_request(): - if "query" in self.request.query_params: - from documents import index + from documents.search import TantivyRelevanceList + from documents.search import get_backend - query_class = index.DelayedFullTextQuery - elif "more_like_id" in self.request.query_params: + try: + backend = get_backend() + # ORM-filtered queryset: permissions + field filters + ordering (DRF backends applied) + filtered_qs = self.filter_queryset(self.get_queryset()) + + user = None if request.user.is_superuser else request.user + + if "query" in request.query_params: + query_str = request.query_params["query"] + results = backend.search( + query_str, + user=user, + page=1, + page_size=10000, + sort_field=None, + sort_reverse=False, + ) + else: + # more_like_id — validate permission on the seed document first try: - more_like_doc_id = int(self.request.query_params["more_like_id"]) + more_like_doc_id = int(request.query_params["more_like_id"]) more_like_doc = Document.objects.select_related("owner").get( pk=more_like_doc_id, ) @@ -2059,76 +2072,71 @@ class UnifiedSearchViewSet(DocumentViewSet): raise PermissionDenied(_("Invalid more_like_id")) if not has_perms_owner_aware( - self.request.user, + request.user, "view_document", more_like_doc, ): raise PermissionDenied(_("Insufficient permissions.")) - from documents import index - - query_class = index.DelayedMoreLikeThisQuery - else: - raise ValueError - - return query_class( - self.searcher, - self.request.query_params, - self.paginator.get_page_size(self.request), - filter_queryset=filtered_queryset, - ) - else: - return filtered_queryset - - def list(self, request, *args, **kwargs): - if self._is_search_request(): - from documents import index - - try: - with index.open_index_searcher() as s: - self.searcher = s - queryset = self.filter_queryset(self.get_queryset()) - page = self.paginate_queryset(queryset) - - serializer = self.get_serializer(page, many=True) - response = self.get_paginated_response(serializer.data) - - response.data["corrected_query"] = ( - queryset.suggested_correction - if hasattr(queryset, "suggested_correction") - else None - ) - - if get_boolean( - str( - request.query_params.get( - "include_selection_data", - "false", - ), - ), - ): - result_ids = queryset.get_result_ids() - response.data["selection_data"] = ( - self._get_selection_data_for_queryset( - Document.objects.filter(pk__in=result_ids), - ) - ) - - return response - except NotFound: - raise - except PermissionDenied as e: - invalid_more_like_id_message = _("Invalid more_like_id") - if str(e.detail) == str(invalid_more_like_id_message): - return HttpResponseForbidden(invalid_more_like_id_message) - return HttpResponseForbidden(_("Insufficient permissions.")) - except Exception as e: - logger.warning(f"An error occurred listing search results: {e!s}") - return HttpResponseBadRequest( - "Error listing search results, check logs for more detail.", + results = backend.more_like_this( + more_like_doc_id, + user=user, + page=1, + page_size=10000, ) - else: - return super().list(request) + + hits_by_id = {h["id"]: h for h in results.hits} + + # Determine sort order: no ordering param -> Tantivy relevance; otherwise -> ORM order + ordering_param = request.query_params.get("ordering", "").lstrip("-") + if not ordering_param: + # Preserve Tantivy relevance order; intersect with ORM-visible IDs + orm_ids = set(filtered_qs.values_list("pk", flat=True)) + ordered_hits = [h for h in results.hits if h["id"] in orm_ids] + else: + # Use ORM ordering (already applied by DocumentsOrderingFilter) + hit_ids = set(hits_by_id.keys()) + orm_ordered_ids = filtered_qs.filter(id__in=hit_ids).values_list( + "pk", + flat=True, + ) + ordered_hits = [ + hits_by_id[pk] for pk in orm_ordered_ids if pk in hits_by_id + ] + + rl = TantivyRelevanceList(ordered_hits) + page = self.paginate_queryset(rl) + + if page is not None: + serializer = self.get_serializer(page, many=True) + response = self.get_paginated_response(serializer.data) + response.data["corrected_query"] = None + if get_boolean( + str(request.query_params.get("include_selection_data", "false")), + ): + all_ids = [h["id"] for h in ordered_hits] + response.data["selection_data"] = ( + self._get_selection_data_for_queryset( + filtered_qs.filter(pk__in=all_ids), + ) + ) + return response + + serializer = self.get_serializer(ordered_hits, many=True) + return Response(serializer.data) + + except NotFound: + raise + except PermissionDenied as e: + invalid_more_like_id_message = _("Invalid more_like_id") + if str(e.detail) == str(invalid_more_like_id_message): + return HttpResponseForbidden(invalid_more_like_id_message) + return HttpResponseForbidden(_("Insufficient permissions.")) + except Exception as e: + logger.warning(f"An error occurred listing search results: {e!s}") + return HttpResponseBadRequest( + "Error listing search results, check logs for more detail.", + ) @action(detail=False, methods=["GET"], name="Get Next ASN") def next_asn(self, request, *args, **kwargs): @@ -2946,18 +2954,9 @@ class SearchAutoCompleteView(GenericAPIView): else: limit = 10 - from documents import index + from documents.search import get_backend - ix = index.open_index() - - return Response( - index.autocomplete( - ix, - term, - limit, - user, - ), - ) + return Response(get_backend().autocomplete(term, limit, user)) @extend_schema_view( @@ -3023,20 +3022,21 @@ class GlobalSearchView(PassUserMixin): # First search by title docs = all_docs.filter(title__icontains=query) if not db_only and len(docs) < OBJECT_LIMIT: - # If we don't have enough results, search by content - from documents import index + # If we don't have enough results, search by content. + # Over-fetch from Tantivy (no permission filter) and rely on + # the ORM all_docs queryset for authoritative permission gating. + from documents.search import get_backend - with index.open_index_searcher() as s: - fts_query = index.DelayedFullTextQuery( - s, - request.query_params, - OBJECT_LIMIT, - filter_queryset=all_docs, - ) - results = fts_query[0:1] - docs = docs | Document.objects.filter( - id__in=[r["id"] for r in results], - ) + fts_results = get_backend().search( + query, + user=None, + page=1, + page_size=1000, + sort_field=None, + sort_reverse=False, + ) + fts_ids = {h["id"] for h in fts_results.hits} + docs = docs | all_docs.filter(id__in=fts_ids) docs = docs[:OBJECT_LIMIT] saved_views = ( get_objects_for_user_owner_aware( @@ -4279,10 +4279,16 @@ class SystemStatusView(PassUserMixin): index_error = None try: - ix = index.open_index() + from documents.search import get_backend + + get_backend() # triggers open/rebuild; raises on error index_status = "OK" - index_last_modified = make_aware( - datetime.fromtimestamp(ix.last_modified()), + # Use the most-recently modified file in the index directory as a proxy + # for last index write time (Tantivy has no single last_modified() call). + index_dir = settings.INDEX_DIR + mtimes = [p.stat().st_mtime for p in index_dir.iterdir() if p.is_file()] + index_last_modified = ( + make_aware(datetime.fromtimestamp(max(mtimes))) if mtimes else None ) except Exception as e: index_status = "ERROR" diff --git a/src/paperless/settings/__init__.py b/src/paperless/settings/__init__.py index 1c33db7c6..3522b3187 100644 --- a/src/paperless/settings/__init__.py +++ b/src/paperless/settings/__init__.py @@ -21,6 +21,7 @@ from paperless.settings.custom import parse_hosting_settings from paperless.settings.custom import parse_ignore_dates from paperless.settings.custom import parse_redis_url from paperless.settings.parsers import get_bool_from_env +from paperless.settings.parsers import get_choice_from_env from paperless.settings.parsers import get_float_from_env from paperless.settings.parsers import get_int_from_env from paperless.settings.parsers import get_list_from_env @@ -85,6 +86,11 @@ EMPTY_TRASH_DIR = ( # threads. MEDIA_LOCK = MEDIA_ROOT / "media.lock" INDEX_DIR = DATA_DIR / "index" + +ADVANCED_FUZZY_SEARCH_THRESHOLD: float | None = get_float_from_env( + "PAPERLESS_ADVANCED_FUZZY_SEARCH_THRESHOLD", +) + MODEL_FILE = get_path_from_env( "PAPERLESS_MODEL_FILE", DATA_DIR / "classification_model.pickle", @@ -1033,10 +1039,55 @@ def _get_nltk_language_setting(ocr_lang: str) -> str | None: return iso_code_to_nltk.get(ocr_lang) +def _get_search_language_setting(ocr_lang: str) -> str | None: + """ + Determine the Tantivy stemmer language. + + If PAPERLESS_SEARCH_LANGUAGE is explicitly set, it is validated against + the languages supported by Tantivy's built-in stemmer and returned as-is. + Otherwise the primary Tesseract language code from PAPERLESS_OCR_LANGUAGE + is mapped to the corresponding ISO 639-1 code understood by Tantivy. + Returns None when unset and the OCR language has no Tantivy stemmer. + """ + explicit = os.environ.get("PAPERLESS_SEARCH_LANGUAGE") + if explicit is not None: + # Lazy import avoids any app-loading order concerns; _tokenizer has no + # Django dependencies so this is safe. + from documents.search._tokenizer import SUPPORTED_LANGUAGES + + return get_choice_from_env("PAPERLESS_SEARCH_LANGUAGE", SUPPORTED_LANGUAGES) + + # Infer from the primary Tesseract language code (ISO 639-2/T → ISO 639-1) + primary = ocr_lang.split("+", maxsplit=1)[0].lower() + _ocr_to_search: dict[str, str] = { + "ara": "ar", + "dan": "da", + "nld": "nl", + "eng": "en", + "fin": "fi", + "fra": "fr", + "deu": "de", + "ell": "el", + "hun": "hu", + "ita": "it", + "nor": "no", + "por": "pt", + "ron": "ro", + "rus": "ru", + "spa": "es", + "swe": "sv", + "tam": "ta", + "tur": "tr", + } + return _ocr_to_search.get(primary) + + NLTK_ENABLED: Final[bool] = get_bool_from_env("PAPERLESS_ENABLE_NLTK", "yes") NLTK_LANGUAGE: str | None = _get_nltk_language_setting(OCR_LANGUAGE) +SEARCH_LANGUAGE: str | None = _get_search_language_setting(OCR_LANGUAGE) + ############################################################################### # Email Preprocessors # ############################################################################### diff --git a/src/paperless/settings/parsers.py b/src/paperless/settings/parsers.py index 09e474bd5..163633d84 100644 --- a/src/paperless/settings/parsers.py +++ b/src/paperless/settings/parsers.py @@ -260,7 +260,7 @@ def get_list_from_env( def get_choice_from_env( env_key: str, - choices: set[str], + choices: set[str] | frozenset[str], default: str | None = None, ) -> str: """ diff --git a/src/paperless/tests/parsers/test_tesseract_custom_settings.py b/src/paperless/tests/parsers/test_tesseract_custom_settings.py index 60d1486f4..9f3afacb6 100644 --- a/src/paperless/tests/parsers/test_tesseract_custom_settings.py +++ b/src/paperless/tests/parsers/test_tesseract_custom_settings.py @@ -14,6 +14,11 @@ from paperless.parsers.tesseract import RasterisedDocumentParser class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCase): + @classmethod + def setUpTestData(cls) -> None: + super().setUpTestData() + ApplicationConfiguration.objects.get_or_create() + @staticmethod def get_params(): """ diff --git a/src/paperless/tests/settings/test_settings.py b/src/paperless/tests/settings/test_settings.py index b0ae3c0c5..0694d9360 100644 --- a/src/paperless/tests/settings/test_settings.py +++ b/src/paperless/tests/settings/test_settings.py @@ -2,6 +2,9 @@ import os from unittest import TestCase from unittest import mock +import pytest + +from paperless.settings import _get_search_language_setting from paperless.settings import _parse_paperless_url from paperless.settings import default_threads_per_worker @@ -32,6 +35,48 @@ class TestThreadCalculation(TestCase): self.assertLessEqual(default_workers * default_threads, i) +@pytest.mark.parametrize( + ("env_value", "expected"), + [ + ("en", "en"), + ("de", "de"), + ("fr", "fr"), + ("swedish", "swedish"), + ], +) +def test_get_search_language_setting_explicit_valid( + monkeypatch: pytest.MonkeyPatch, + env_value: str, + expected: str, +) -> None: + """ + GIVEN: + - PAPERLESS_SEARCH_LANGUAGE is set to a valid Tantivy stemmer language + WHEN: + - _get_search_language_setting is called + THEN: + - The explicit value is returned regardless of the OCR language + """ + monkeypatch.setenv("PAPERLESS_SEARCH_LANGUAGE", env_value) + assert _get_search_language_setting("deu") == expected + + +def test_get_search_language_setting_explicit_invalid( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """ + GIVEN: + - PAPERLESS_SEARCH_LANGUAGE is set to an unsupported language code + WHEN: + - _get_search_language_setting is called + THEN: + - ValueError is raised + """ + monkeypatch.setenv("PAPERLESS_SEARCH_LANGUAGE", "klingon") + with pytest.raises(ValueError, match="klingon"): + _get_search_language_setting("eng") + + class TestPaperlessURLSettings(TestCase): def test_paperless_url(self) -> None: """ diff --git a/src/paperless/views.py b/src/paperless/views.py index 404bc4339..a3b965f3f 100644 --- a/src/paperless/views.py +++ b/src/paperless/views.py @@ -36,7 +36,6 @@ from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet -from documents.index import DelayedQuery from documents.permissions import PaperlessObjectPermissions from documents.tasks import llmindex_index from paperless.filters import GroupFilterSet @@ -83,20 +82,12 @@ class StandardPagination(PageNumberPagination): ) def get_all_result_ids(self): + from documents.search import TantivyRelevanceList + query = self.page.paginator.object_list - if isinstance(query, DelayedQuery): - try: - ids = [ - query.searcher.ixreader.stored_fields( - doc_num, - )["id"] - for doc_num in query.saved_results.get(0).results.docs() - ] - except Exception: - pass - else: - ids = self.page.paginator.object_list.values_list("pk", flat=True) - return ids + if isinstance(query, TantivyRelevanceList): + return [h["id"] for h in query._hits] + return self.page.paginator.object_list.values_list("pk", flat=True) def get_paginated_response_schema(self, schema): response_schema = super().get_paginated_response_schema(schema) diff --git a/src/paperless_ai/indexing.py b/src/paperless_ai/indexing.py index bee8f0dd9..a54492f1f 100644 --- a/src/paperless_ai/indexing.py +++ b/src/paperless_ai/indexing.py @@ -1,11 +1,8 @@ import logging import shutil -from collections.abc import Callable -from collections.abc import Iterable from datetime import timedelta from pathlib import Path from typing import TYPE_CHECKING -from typing import TypeVar from celery import states from django.conf import settings @@ -13,22 +10,17 @@ from django.utils import timezone from documents.models import Document from documents.models import PaperlessTask +from documents.utils import IterWrapper +from documents.utils import identity from paperless_ai.embedding import build_llm_index_text from paperless_ai.embedding import get_embedding_dim from paperless_ai.embedding import get_embedding_model -_T = TypeVar("_T") -IterWrapper = Callable[[Iterable[_T]], Iterable[_T]] - if TYPE_CHECKING: from llama_index.core import VectorStoreIndex from llama_index.core.schema import BaseNode -def _identity(iterable: Iterable[_T]) -> Iterable[_T]: - return iterable - - logger = logging.getLogger("paperless_ai.indexing") @@ -176,7 +168,7 @@ def vector_store_file_exists(): def update_llm_index( *, - iter_wrapper: IterWrapper[Document] = _identity, + iter_wrapper: IterWrapper[Document] = identity, rebuild=False, ) -> str: """ diff --git a/uv.lock b/uv.lock index 6bbfdc53b..feffefce5 100644 --- a/uv.lock +++ b/uv.lock @@ -350,15 +350,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/73/3183c9e41ca755713bdf2cc1d0810df742c09484e2e1ddd693bee53877c1/brotli-1.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2d085ded05278d1c7f65560aae97b3160aeb2ea2c0b3e26204856beccb60888", size = 1488164, upload-time = "2025-11-05T18:38:53.079Z" }, ] -[[package]] -name = "cached-property" -version = "2.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/4b/3d870836119dbe9a5e3c9a61af8cc1a8b69d75aea564572e385882d5aefb/cached_property-2.0.1.tar.gz", hash = "sha256:484d617105e3ee0e4f1f58725e72a8ef9e93deee462222dbd51cd91230897641", size = 10574, upload-time = "2024-10-25T15:43:55.667Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/0e/7d8225aab3bc1a0f5811f8e1b557aa034ac04bdf641925b30d3caf586b28/cached_property-2.0.1-py3-none-any.whl", hash = "sha256:f617d70ab1100b7bcf6e42228f9ddcb78c676ffa167278d9f730d1c2fba69ccb", size = 7428, upload-time = "2024-10-25T15:43:54.711Z" }, -] - [[package]] name = "cbor2" version = "5.9.0" @@ -2910,12 +2901,12 @@ dependencies = [ { name = "scikit-learn", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "sentence-transformers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "setproctitle", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tantivy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "tika-client", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "torch", version = "2.10.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'darwin'" }, { name = "torch", version = "2.10.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'linux'" }, { name = "watchfiles", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "whitenoise", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "whoosh-reloaded", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "zxing-cpp", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] @@ -2951,6 +2942,7 @@ dev = [ { name = "pytest-sugar", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pytest-xdist", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "ruff", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "time-machine", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "zensical", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] docs = [ @@ -2974,6 +2966,7 @@ testing = [ { name = "pytest-rerunfailures", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pytest-sugar", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pytest-xdist", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "time-machine", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] typing = [ { name = "celery-types", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -3064,11 +3057,11 @@ requires-dist = [ { name = "scikit-learn", specifier = "~=1.8.0" }, { name = "sentence-transformers", specifier = ">=4.1" }, { name = "setproctitle", specifier = "~=1.3.4" }, + { name = "tantivy", specifier = ">=0.25.1" }, { name = "tika-client", specifier = "~=0.10.0" }, { name = "torch", specifier = "~=2.10.0", index = "https://download.pytorch.org/whl/cpu" }, { name = "watchfiles", specifier = ">=1.1.1" }, { name = "whitenoise", specifier = "~=6.11" }, - { name = "whoosh-reloaded", specifier = ">=2.7.5" }, { name = "zxing-cpp", specifier = "~=3.0.0" }, ] provides-extras = ["mariadb", "postgres", "webserver"] @@ -3090,6 +3083,7 @@ dev = [ { name = "pytest-sugar" }, { name = "pytest-xdist", specifier = "~=3.8.0" }, { name = "ruff", specifier = "~=0.15.0" }, + { name = "time-machine", specifier = ">=2.13" }, { name = "zensical", specifier = ">=0.0.21" }, ] docs = [{ name = "zensical", specifier = ">=0.0.21" }] @@ -3111,6 +3105,7 @@ testing = [ { name = "pytest-rerunfailures", specifier = "~=16.1" }, { name = "pytest-sugar" }, { name = "pytest-xdist", specifier = "~=3.8.0" }, + { name = "time-machine", specifier = ">=2.13" }, ] typing = [ { name = "celery-types" }, @@ -4664,6 +4659,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, ] +[[package]] +name = "tantivy" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/f9/0cd3955d155d3e3ef74b864769514dd191e5dacba9f0beb7af2d914942ce/tantivy-0.25.1.tar.gz", hash = "sha256:68a3314699a7d18fcf338b52bae8ce46a97dde1128a3e47e33fa4db7f71f265e", size = 75120, upload-time = "2025-12-02T11:57:12.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/7a/8a277f377e8a151fc0e71d4ffc1114aefb6e5e1c7dd609fed0955cf34ed8/tantivy-0.25.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d363d7b4207d3a5aa7f0d212420df35bed18bdb6bae26a2a8bd57428388b7c29", size = 7637033, upload-time = "2025-12-02T11:56:18.104Z" }, + { url = "https://files.pythonhosted.org/packages/71/31/8b4acdedfc9f9a2d04b1340d07eef5213d6f151d1e18da0cb423e5f090d2/tantivy-0.25.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8f4389cf1d889a1df7c5a3195806b4b56c37cee10d8a26faaa0dea35a867b5ff", size = 3932180, upload-time = "2025-12-02T11:56:19.833Z" }, + { url = "https://files.pythonhosted.org/packages/2f/dc/3e8499c21b4b9795e8f2fc54c68ce5b92905aaeadadaa56ecfa9180b11b1/tantivy-0.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99864c09fc54652c3c2486cdf13f86cdc8200f4b481569cb291e095ca5d496e5", size = 4197620, upload-time = "2025-12-02T11:56:21.496Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8e/f2ce62fffc811eb62bead92c7b23c2e218f817cbd54c4f3b802e03ba1438/tantivy-0.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05abf37ddbc5063c575548be0d62931629c086bff7a5a1b67cf5a8f5ebf4cd8c", size = 4183794, upload-time = "2025-12-02T11:56:23.215Z" }, + { url = "https://files.pythonhosted.org/packages/41/e7/6849c713ed0996c7628324c60512c4882006f0a62145e56c624a93407f90/tantivy-0.25.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:90fd919e5f611809f746560ecf36eb9be824dec62e21ae17a27243759edb9aa1", size = 7621494, upload-time = "2025-12-02T11:56:27.069Z" }, + { url = "https://files.pythonhosted.org/packages/c5/22/c3d8294600dc6e7fa350daef9ff337d3c06e132b81df727de9f7a50c692a/tantivy-0.25.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4613c7cf6c23f3a97989819690a0f956d799354957de7a204abcc60083cebe02", size = 3925219, upload-time = "2025-12-02T11:56:29.403Z" }, + { url = "https://files.pythonhosted.org/packages/41/fc/cbb1df71dd44c9110eff4eaaeda9d44f2d06182fe0452193be20ddfba93f/tantivy-0.25.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c477bd20b4df804d57dfc5033431bef27cde605695ae141b03abbf6ebc069129", size = 4198699, upload-time = "2025-12-02T11:56:31.359Z" }, + { url = "https://files.pythonhosted.org/packages/47/4d/71abb78b774073c3ce12a4faa4351a9d910a71ffa3659526affba163873d/tantivy-0.25.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9b1a1ba1113c523c7ff7b10f282d6c4074006f7ef8d71e1d973d51bf7291ddb", size = 4183585, upload-time = "2025-12-02T11:56:33.317Z" }, + { url = "https://files.pythonhosted.org/packages/3d/25/73cfbcf1a8ea49be6c42817431cac46b70a119fe64da903fcc2d92b5b511/tantivy-0.25.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f51ff7196c6f31719202080ed8372d5e3d51e92c749c032fb8234f012e99744c", size = 7622530, upload-time = "2025-12-02T11:56:36.839Z" }, + { url = "https://files.pythonhosted.org/packages/12/c8/c0d7591cdf4f7e7a9fc4da786d1ca8cd1aacffaa2be16ea6d401a8e4a566/tantivy-0.25.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:550e63321bfcacc003859f2fa29c1e8e56450807b3c9a501c1add27cfb9236d9", size = 3925637, upload-time = "2025-12-02T11:56:38.425Z" }, + { url = "https://files.pythonhosted.org/packages/3a/09/bedfc223bffec7641b417dd7ab071134b2ef8f8550e9b1fb6014657ef52e/tantivy-0.25.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fde31cc8d6e122faf7902aeea32bc008a429a6e8904e34d3468126a3ec01b016", size = 4197322, upload-time = "2025-12-02T11:56:40.411Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f1/1fa5183500c8042200c9f2b840d34f5bbcfb434a1ee750e7132262d2a5c9/tantivy-0.25.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b11bd5a518b0be645320b47af8493f6a40c4f3234313e37adcf4534a564d27dd", size = 4183143, upload-time = "2025-12-02T11:56:42.048Z" }, + { url = "https://files.pythonhosted.org/packages/8b/2f/581519492226f97d23bd0adc95dad991ebeaa73ea6abc8bff389a3096d9a/tantivy-0.25.1-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:dae99e75b7eaa9bf5bd16ab106b416370f08c135aed0e117d62a3201cd1ffe36", size = 7610316, upload-time = "2025-12-02T11:56:45.927Z" }, + { url = "https://files.pythonhosted.org/packages/91/40/5d7bc315ab9e6a22c5572656e8ada1c836cfa96dccf533377504fbc3c9d9/tantivy-0.25.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:506e9533c5ef4d3df43bad64ffecc0aa97c76e361ea610815dc3a20a9d6b30b3", size = 3919882, upload-time = "2025-12-02T11:56:48.469Z" }, + { url = "https://files.pythonhosted.org/packages/02/b9/e0ef2f57a6a72444cb66c2ffbc310ab33ffaace275f1c4b0319d84ea3f18/tantivy-0.25.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbd4f8f264dacbcc9dee542832da2173fd53deaaea03f082d95214f8b5ed6bc", size = 4196031, upload-time = "2025-12-02T11:56:50.151Z" }, + { url = "https://files.pythonhosted.org/packages/1e/02/bf3f8cacfd08642e14a73f7956a3fb95d58119132c98c121b9065a1f8615/tantivy-0.25.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:824c643ccb640dd9e35e00c5d5054ddf3323f56fe4219d57d428a9eeea13d22c", size = 4183437, upload-time = "2025-12-02T11:56:51.818Z" }, + { url = "https://files.pythonhosted.org/packages/ff/44/9f1d67aa5030f7eebc966c863d1316a510a971dd8bb45651df4acdfae9ed/tantivy-0.25.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7f5d29ae85dd0f23df8d15b3e7b341d4f9eb5a446bbb9640df48ac1f6d9e0c6c", size = 7623723, upload-time = "2025-12-02T11:56:55.066Z" }, + { url = "https://files.pythonhosted.org/packages/db/30/6e085bd3ed9d12da3c91c185854abd70f9dfd35fb36a75ea98428d42c30b/tantivy-0.25.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:f2d2938fb69a74fc1bb36edfaf7f0d1596fa1264db0f377bda2195c58bcb6245", size = 3926243, upload-time = "2025-12-02T11:56:57.058Z" }, + { url = "https://files.pythonhosted.org/packages/32/f5/a00d65433430f51718e5cc6938df571765d7c4e03aedec5aef4ab567aa9b/tantivy-0.25.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f5ff124c4802558e627091e780b362ca944169736caba5a372eef39a79d0ae0", size = 4207186, upload-time = "2025-12-02T11:56:58.803Z" }, + { url = "https://files.pythonhosted.org/packages/19/63/61bdb12fc95f2a7f77bd419a5149bfa9f28caa76cb569bf2b6b06e1d033e/tantivy-0.25.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43b80ef62a340416139c93d19264e5f808da48e04f9305f1092b8ed22be0a5be", size = 4187312, upload-time = "2025-12-02T11:57:00.595Z" }, +] + [[package]] name = "tenacity" version = "9.1.2" @@ -4752,6 +4775,62 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/0d/c1ad6f4016a3968c048545f5d9b8ffebf577774b2ede3e2e352553b685fe/tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5edb8743b88d5be814b1a8a8854494719080c28faaa1ccbef02e87354fe71ef0", size = 1253706, upload-time = "2025-10-06T20:22:33.385Z" }, ] +[[package]] +name = "time-machine" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/fc/37b02f6094dbb1f851145330460532176ed2f1dc70511a35828166c41e52/time_machine-3.2.0.tar.gz", hash = "sha256:a4ddd1cea17b8950e462d1805a42b20c81eb9aafc8f66b392dd5ce997e037d79", size = 14804, upload-time = "2025-12-17T23:33:02.599Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/e1/03aae5fbaa53859f665094af696338fc7cae733d926a024af69982712350/time_machine-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c188a9dda9fcf975022f1b325b466651b96a4dfc223c523ed7ed8d979f9bf3e8", size = 19143, upload-time = "2025-12-17T23:31:44.258Z" }, + { url = "https://files.pythonhosted.org/packages/75/8f/98cb17bebb52b22ff4ec26984dd44280f9c71353c3bae0640a470e6683e5/time_machine-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17245f1cc2dd13f9d63a174be59bb2684a9e5e0a112ab707e37be92068cd655f", size = 15273, upload-time = "2025-12-17T23:31:45.246Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2f/ca11e4a7897234bb9331fcc5f4ed4714481ba4012370cc79a0ae8c42ea0a/time_machine-3.2.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d9bd1de1996e76efd36ae15970206c5089fb3728356794455bd5cd8d392b5537", size = 31049, upload-time = "2025-12-17T23:31:46.613Z" }, + { url = "https://files.pythonhosted.org/packages/cf/ad/d17d83a59943094e6b6c6a3743caaf6811b12203c3e07a30cc7bcc2ab7ee/time_machine-3.2.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:98493cd50e8b7f941eab69b9e18e697ad69db1a0ec1959f78f3d7b0387107e5c", size = 32632, upload-time = "2025-12-17T23:31:47.72Z" }, + { url = "https://files.pythonhosted.org/packages/71/50/d60576d047a0dfb5638cdfb335e9c3deb6e8528544fa0b3966a8480f72b7/time_machine-3.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:31f2a33d595d9f91eb9bc7f157f0dc5721f5789f4c4a9e8b852cdedb2a7d9b16", size = 34289, upload-time = "2025-12-17T23:31:48.913Z" }, + { url = "https://files.pythonhosted.org/packages/fa/fe/4afa602dbdebddde6d0ea4a7fe849e49b9bb85dc3fb415725a87ccb4b471/time_machine-3.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9f78ac4213c10fbc44283edd1a29cfb7d3382484f4361783ddc057292aaa1889", size = 33175, upload-time = "2025-12-17T23:31:50.611Z" }, + { url = "https://files.pythonhosted.org/packages/0d/87/c152e23977c1d7d7c94eb3ed3ea45cc55971796205125c6fdff40db2c60f/time_machine-3.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c1326b09e947b360926d529a96d1d9e126ce120359b63b506ecdc6ee20755c23", size = 31170, upload-time = "2025-12-17T23:31:51.645Z" }, + { url = "https://files.pythonhosted.org/packages/80/af/54acf51d0f3ade3b51eab73df6192937c9a938753ef5456dff65eb8630be/time_machine-3.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9f2949f03d15264cc15c38918a2cda8966001f0f4ebe190cbfd9c56d91aed8ac", size = 32292, upload-time = "2025-12-17T23:31:52.803Z" }, + { url = "https://files.pythonhosted.org/packages/71/8b/080c8eedcd67921a52ba5bd0e075362062509ab63c86fc1a0442fad241a6/time_machine-3.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cc4bee5b0214d7dc4ebc91f4a4c600f1a598e9b5606ac751f42cb6f6740b1dbb", size = 19255, upload-time = "2025-12-17T23:31:58.057Z" }, + { url = "https://files.pythonhosted.org/packages/66/17/0e5291e9eb705bf8a5a1305f826e979af307bbeb79def4ddbf4b3f9a81e0/time_machine-3.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ca036304b4460ae2fdc1b52dd8b1fa7cf1464daa427fc49567413c09aa839c1", size = 15360, upload-time = "2025-12-17T23:31:59.048Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e8/9ab87b71d2e2b62463b9b058b7ae7ac09fb57f8fcd88729dec169d304340/time_machine-3.2.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5442735b41d7a2abc2f04579b4ca6047ed4698a8338a4fec92c7c9423e7938cb", size = 33029, upload-time = "2025-12-17T23:32:00.413Z" }, + { url = "https://files.pythonhosted.org/packages/4b/26/b5ca19da6f25ea905b3e10a0ea95d697c1aeba0404803a43c68f1af253e6/time_machine-3.2.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:97da3e971e505cb637079fb07ab0bcd36e33279f8ecac888ff131f45ef1e4d8d", size = 34579, upload-time = "2025-12-17T23:32:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/79/ca/6ac7ad5f10ea18cc1d9de49716ba38c32132c7b64532430d92ef240c116b/time_machine-3.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3cdda6dee4966e38aeb487309bb414c6cb23a81fc500291c77a8fcd3098832e7", size = 35961, upload-time = "2025-12-17T23:32:02.521Z" }, + { url = "https://files.pythonhosted.org/packages/33/67/390dd958bed395ab32d79a9fe61fe111825c0dd4ded54dbba7e867f171e6/time_machine-3.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:33d9efd302a6998bcc8baa4d84f259f8a4081105bd3d7f7af7f1d0abd3b1c8aa", size = 34668, upload-time = "2025-12-17T23:32:03.585Z" }, + { url = "https://files.pythonhosted.org/packages/da/57/c88fff034a4e9538b3ae7c68c9cfb283670b14d17522c5a8bc17d29f9a4b/time_machine-3.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3a0b0a33971f14145853c9bd95a6ab0353cf7e0019fa2a7aa1ae9fddfe8eab50", size = 32891, upload-time = "2025-12-17T23:32:04.656Z" }, + { url = "https://files.pythonhosted.org/packages/2d/70/ebbb76022dba0fec8f9156540fc647e4beae1680c787c01b1b6200e56d70/time_machine-3.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2d0be9e5f22c38082d247a2cdcd8a936504e9db60b7b3606855fb39f299e9548", size = 34080, upload-time = "2025-12-17T23:32:06.146Z" }, + { url = "https://files.pythonhosted.org/packages/ee/cd/43ad5efc88298af3c59b66769cea7f055567a85071579ed40536188530c1/time_machine-3.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c421a8eb85a4418a7675a41bf8660224318c46cc62e4751c8f1ceca752059090", size = 19318, upload-time = "2025-12-17T23:32:10.518Z" }, + { url = "https://files.pythonhosted.org/packages/b0/f6/084010ef7f4a3f38b5a4900923d7c85b29e797655c4f6ee4ce54d903cca8/time_machine-3.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f4e758f7727d0058c4950c66b58200c187072122d6f7a98b610530a4233ea7b", size = 15390, upload-time = "2025-12-17T23:32:11.625Z" }, + { url = "https://files.pythonhosted.org/packages/25/aa/1cabb74134f492270dc6860cb7865859bf40ecf828be65972827646e91ad/time_machine-3.2.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:154bd3f75c81f70218b2585cc12b60762fb2665c507eec5ec5037d8756d9b4e0", size = 33115, upload-time = "2025-12-17T23:32:13.219Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/78c5d7dfa366924eb4dbfcc3fc917c39a4280ca234b12819cc1f16c03d88/time_machine-3.2.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d50cfe5ebea422c896ad8d278af9648412b7533b8ea6adeeee698a3fd9b1d3b7", size = 34705, upload-time = "2025-12-17T23:32:14.29Z" }, + { url = "https://files.pythonhosted.org/packages/86/93/d5e877c24541f674c6869ff6e9c56833369796010190252e92c9d7ae5f0f/time_machine-3.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:636576501724bd6a9124e69d86e5aef263479e89ef739c5db361469f0463a0a1", size = 36104, upload-time = "2025-12-17T23:32:15.354Z" }, + { url = "https://files.pythonhosted.org/packages/22/1c/d4bae72f388f67efc9609f89b012e434bb19d9549c7a7b47d6c7d9e5c55d/time_machine-3.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40e6f40c57197fcf7ec32d2c563f4df0a82c42cdcc3cab27f688e98f6060df10", size = 34765, upload-time = "2025-12-17T23:32:16.434Z" }, + { url = "https://files.pythonhosted.org/packages/1d/c3/ac378cf301d527d8dfad2f0db6bad0dfb1ab73212eaa56d6b96ee5d9d20b/time_machine-3.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a1bcf0b846bbfc19a79bc19e3fa04d8c7b1e8101c1b70340ffdb689cd801ea53", size = 33010, upload-time = "2025-12-17T23:32:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/06/35/7ce897319accda7a6970b288a9a8c52d25227342a7508505a2b3d235b649/time_machine-3.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ae55a56c179f4fe7a62575ad5148b6ed82f6c7e5cf2f9a9ec65f2f5b067db5f5", size = 34185, upload-time = "2025-12-17T23:32:18.566Z" }, + { url = "https://files.pythonhosted.org/packages/67/e7/487f0ba5fe6c58186a5e1af2a118dfa2c160fedb37ef53a7e972d410408e/time_machine-3.2.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:59d71545e62525a4b85b6de9ab5c02ee3c61110fd7f636139914a2335dcbfc9c", size = 20000, upload-time = "2025-12-17T23:32:23.058Z" }, + { url = "https://files.pythonhosted.org/packages/e1/17/eb2c0054c8d44dd42df84ccd434539249a9c7d0b8eb53f799be2102500ab/time_machine-3.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:999672c621c35362bc28e03ca0c7df21500195540773c25993421fd8d6cc5003", size = 15657, upload-time = "2025-12-17T23:32:24.125Z" }, + { url = "https://files.pythonhosted.org/packages/43/21/93443b5d1dd850f8bb9442e90d817a9033dcce6bfbdd3aabbb9786251c80/time_machine-3.2.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5faf7397f0580c7b9d67288522c8d7863e85f0cffadc0f1fccdb2c3dfce5783e", size = 39216, upload-time = "2025-12-17T23:32:25.542Z" }, + { url = "https://files.pythonhosted.org/packages/9f/9e/18544cf8acc72bb1dc03762231c82ecc259733f4bb6770a7bbe5cd138603/time_machine-3.2.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d3dd886ec49f1fa5a00e844f5947e5c0f98ce574750c24b7424c6f77fc1c3e87", size = 40764, upload-time = "2025-12-17T23:32:26.643Z" }, + { url = "https://files.pythonhosted.org/packages/27/f7/9fe9ce2795636a3a7467307af6bdf38bb613ddb701a8a5cd50ec713beb5e/time_machine-3.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da0ecd96bc7bbe450acaaabe569d84e81688f1be8ad58d1470e42371d145fb53", size = 43526, upload-time = "2025-12-17T23:32:27.693Z" }, + { url = "https://files.pythonhosted.org/packages/03/c1/a93e975ba9dec22e87ec92d18c28e67d36bd536f9119ffa439b2892b0c9c/time_machine-3.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:158220e946c1c4fb8265773a0282c88c35a7e3bb5d78e3561214e3b3231166f3", size = 41727, upload-time = "2025-12-17T23:32:28.985Z" }, + { url = "https://files.pythonhosted.org/packages/5f/fb/e3633e5a6bbed1c76bb2e9810dabc2f8467532ffcd29b9aed404b473061a/time_machine-3.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c1aee29bc54356f248d5d7dfdd131e12ca825e850a08c0ebdb022266d073013", size = 38952, upload-time = "2025-12-17T23:32:30.031Z" }, + { url = "https://files.pythonhosted.org/packages/82/3d/02e9fb2526b3d6b1b45bc8e4d912d95d1cd699d1a3f6df985817d37a0600/time_machine-3.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c8ed2224f09d25b1c2fc98683613aca12f90f682a427eabb68fc824d27014e4a", size = 39829, upload-time = "2025-12-17T23:32:31.075Z" }, + { url = "https://files.pythonhosted.org/packages/61/70/b4b980d126ed155c78d1879c50d60c8dcbd47bd11cb14ee7be50e0dfc07f/time_machine-3.2.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:1398980c017fe5744d66f419e0115ee48a53b00b146d738e1416c225eb610b82", size = 19303, upload-time = "2025-12-17T23:32:35.796Z" }, + { url = "https://files.pythonhosted.org/packages/73/73/eaa33603c69a68fe2b6f54f9dd75481693d62f1d29676531002be06e2d1c/time_machine-3.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:4f8f4e35f4191ef70c2ab8ff490761ee9051b891afce2bf86dde3918eb7b537b", size = 15431, upload-time = "2025-12-17T23:32:37.244Z" }, + { url = "https://files.pythonhosted.org/packages/76/10/b81e138e86cc7bab40cdb59d294b341e172201f4a6c84bb0ec080407977a/time_machine-3.2.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6db498686ecf6163c5aa8cf0bcd57bbe0f4081184f247edf3ee49a2612b584f9", size = 33206, upload-time = "2025-12-17T23:32:38.713Z" }, + { url = "https://files.pythonhosted.org/packages/d3/72/4deab446b579e8bd5dca91de98595c5d6bd6a17ce162abf5c5f2ce40d3d8/time_machine-3.2.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:027c1807efb74d0cd58ad16524dec94212fbe900115d70b0123399883657ac0f", size = 34792, upload-time = "2025-12-17T23:32:40.223Z" }, + { url = "https://files.pythonhosted.org/packages/2c/39/439c6b587ddee76d533fe972289d0646e0a5520e14dc83d0a30aeb5565f7/time_machine-3.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92432610c05676edd5e6946a073c6f0c926923123ce7caee1018dc10782c713d", size = 36187, upload-time = "2025-12-17T23:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/4b/db/2da4368db15180989bab83746a857bde05ad16e78f326801c142bb747a06/time_machine-3.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c25586b62480eb77ef3d953fba273209478e1ef49654592cd6a52a68dfe56a67", size = 34855, upload-time = "2025-12-17T23:32:42.817Z" }, + { url = "https://files.pythonhosted.org/packages/88/84/120a431fee50bc4c241425bee4d3a4910df4923b7ab5f7dff1bf0c772f08/time_machine-3.2.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6bf3a2fa738d15e0b95d14469a0b8ea42635467408d8b490e263d5d45c9a177f", size = 33222, upload-time = "2025-12-17T23:32:43.94Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ea/89cfda82bb8c57ff91bb9a26751aa234d6d90e9b4d5ab0ad9dce0f9f0329/time_machine-3.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ce76b82276d7ad2a66cdc85dad4df19d1422b69183170a34e8fbc4c3f35502f7", size = 34270, upload-time = "2025-12-17T23:32:45.037Z" }, + { url = "https://files.pythonhosted.org/packages/86/a1/142de946dc4393f910bf4564b5c3ba819906e1f49b06c9cb557519c849e4/time_machine-3.2.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4e374779021446fc2b5c29d80457ec9a3b1a5df043dc2aae07d7c1415d52323c", size = 19991, upload-time = "2025-12-17T23:32:49.933Z" }, + { url = "https://files.pythonhosted.org/packages/ee/62/7f17def6289901f94726921811a16b9adce46e666362c75d45730c60274f/time_machine-3.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:122310a6af9c36e9a636da32830e591e7923e8a07bdd0a43276c3a36c6821c90", size = 15707, upload-time = "2025-12-17T23:32:50.969Z" }, + { url = "https://files.pythonhosted.org/packages/5d/d3/3502fb9bd3acb159c18844b26c43220201a0d4a622c0c853785d07699a92/time_machine-3.2.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ba3eeb0f018cc362dd8128befa3426696a2e16dd223c3fb695fde184892d4d8c", size = 39207, upload-time = "2025-12-17T23:32:52.033Z" }, + { url = "https://files.pythonhosted.org/packages/5a/be/8b27f4aa296fda14a5a2ad7f588ddd450603c33415ab3f8e85b2f1a44678/time_machine-3.2.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:77d38ba664b381a7793f8786efc13b5004f0d5f672dae814430445b8202a67a6", size = 40764, upload-time = "2025-12-17T23:32:53.167Z" }, + { url = "https://files.pythonhosted.org/packages/42/cd/fe4c4e5c8ab6d48fab3624c32be9116fb120173a35fe67e482e5cf68b3d2/time_machine-3.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f09abeb8f03f044d72712207e0489a62098ad3ad16dac38927fcf80baca4d6a7", size = 43508, upload-time = "2025-12-17T23:32:54.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/28/5a3ba2fce85b97655a425d6bb20a441550acd2b304c96b2c19d3839f721a/time_machine-3.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6b28367ce4f73987a55e230e1d30a57a3af85da8eb1a140074eb6e8c7e6ef19f", size = 41712, upload-time = "2025-12-17T23:32:55.781Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/e38084be7fdabb4835db68a3a47e58c34182d79fc35df1ecbe0db2c5359f/time_machine-3.2.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:903c7751c904581da9f7861c3015bed7cdc40047321291d3694a3cdc783bbca3", size = 38939, upload-time = "2025-12-17T23:32:56.867Z" }, + { url = "https://files.pythonhosted.org/packages/40/d0/ad3feb0a392ef4e0c08bc32024950373ddc0669002cbdcbb9f3bf0c2d114/time_machine-3.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:528217cad85ede5f85c8bc78b0341868d3c3cfefc6ecb5b622e1cacb6c73247b", size = 39837, upload-time = "2025-12-17T23:32:58.283Z" }, +] + [[package]] name = "tinytag" version = "2.2.1" @@ -5474,18 +5553,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/db/eb/d5583a11486211f3ebd4b385545ae787f32363d453c19fffd81106c9c138/whitenoise-6.12.0-py3-none-any.whl", hash = "sha256:fc5e8c572e33ebf24795b47b6a7da8da3c00cff2349f5b04c02f28d0cc5a3cc2", size = 20302, upload-time = "2026-02-27T00:05:40.086Z" }, ] -[[package]] -name = "whoosh-reloaded" -version = "2.7.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cached-property", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/17/51/3fb4b9fdeaaf96512514ccf2871186333ce41a0de2ea48236a4056a5f6af/Whoosh-Reloaded-2.7.5.tar.gz", hash = "sha256:39ed7dfbd1fec97af33933107bdf78110728375ed0f2abb25dec6dbfdcb279d8", size = 1061606, upload-time = "2024-02-02T20:06:42.285Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/90/866dfe421f188217ecd7339585e961034a7f4fdc96b62cec3b40a50dbdef/Whoosh_Reloaded-2.7.5-py2.py3-none-any.whl", hash = "sha256:2ab6aeeafb359fbff4beb3c704b960fd88240354f3363f1c5bdb5c2325cae80e", size = 551793, upload-time = "2024-02-02T20:06:39.868Z" }, -] - [[package]] name = "wrapt" version = "2.0.1" From 05c9e21face093e6d3e4c4203b1b9b4d7512b2a8 Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 19:40:05 +0000 Subject: [PATCH 096/113] Auto translate strings --- src/locale/en_US/LC_MESSAGES/django.po | 348 ++++++++++++------------- 1 file changed, 174 insertions(+), 174 deletions(-) diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index f9bce3a1e..cd32e10bd 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-31 18:24+0000\n" +"POT-Creation-Date: 2026-04-02 19:39+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -61,27 +61,27 @@ msgstr "" msgid "owner" msgstr "" -#: documents/models.py:57 documents/models.py:1165 +#: documents/models.py:57 documents/models.py:1172 msgid "None" msgstr "" -#: documents/models.py:58 documents/models.py:1166 +#: documents/models.py:58 documents/models.py:1173 msgid "Any word" msgstr "" -#: documents/models.py:59 documents/models.py:1167 +#: documents/models.py:59 documents/models.py:1174 msgid "All words" msgstr "" -#: documents/models.py:60 documents/models.py:1168 +#: documents/models.py:60 documents/models.py:1175 msgid "Exact match" msgstr "" -#: documents/models.py:61 documents/models.py:1169 +#: documents/models.py:61 documents/models.py:1176 msgid "Regular expression" msgstr "" -#: documents/models.py:62 documents/models.py:1170 +#: documents/models.py:62 documents/models.py:1177 msgid "Fuzzy word" msgstr "" @@ -89,20 +89,20 @@ msgstr "" msgid "Automatic" msgstr "" -#: documents/models.py:66 documents/models.py:536 documents/models.py:1748 +#: documents/models.py:66 documents/models.py:536 documents/models.py:1755 #: paperless_mail/models.py:23 paperless_mail/models.py:143 msgid "name" msgstr "" -#: documents/models.py:68 documents/models.py:1234 +#: documents/models.py:68 documents/models.py:1241 msgid "match" msgstr "" -#: documents/models.py:71 documents/models.py:1237 +#: documents/models.py:71 documents/models.py:1244 msgid "matching algorithm" msgstr "" -#: documents/models.py:76 documents/models.py:1242 +#: documents/models.py:76 documents/models.py:1249 msgid "is insensitive" msgstr "" @@ -272,7 +272,7 @@ msgid "Optional short label for a document version." msgstr "" #: documents/models.py:340 documents/models.py:773 documents/models.py:827 -#: documents/models.py:1791 +#: documents/models.py:1798 msgid "document" msgstr "" @@ -296,11 +296,11 @@ msgstr "" msgid "Title" msgstr "" -#: documents/models.py:523 documents/models.py:1186 +#: documents/models.py:523 documents/models.py:1193 msgid "Created" msgstr "" -#: documents/models.py:524 documents/models.py:1185 +#: documents/models.py:524 documents/models.py:1192 msgid "Added" msgstr "" @@ -841,467 +841,467 @@ msgstr "" msgid "custom field instances" msgstr "" -#: documents/models.py:1173 +#: documents/models.py:1180 msgid "Consumption Started" msgstr "" -#: documents/models.py:1174 +#: documents/models.py:1181 msgid "Document Added" msgstr "" -#: documents/models.py:1175 +#: documents/models.py:1182 msgid "Document Updated" msgstr "" -#: documents/models.py:1176 +#: documents/models.py:1183 msgid "Scheduled" msgstr "" -#: documents/models.py:1179 +#: documents/models.py:1186 msgid "Consume Folder" msgstr "" -#: documents/models.py:1180 +#: documents/models.py:1187 msgid "Api Upload" msgstr "" -#: documents/models.py:1181 +#: documents/models.py:1188 msgid "Mail Fetch" msgstr "" -#: documents/models.py:1182 +#: documents/models.py:1189 msgid "Web UI" msgstr "" -#: documents/models.py:1187 +#: documents/models.py:1194 msgid "Modified" msgstr "" -#: documents/models.py:1188 +#: documents/models.py:1195 msgid "Custom Field" msgstr "" -#: documents/models.py:1191 +#: documents/models.py:1198 msgid "Workflow Trigger Type" msgstr "" -#: documents/models.py:1203 +#: documents/models.py:1210 msgid "filter path" msgstr "" -#: documents/models.py:1208 +#: documents/models.py:1215 msgid "" "Only consume documents with a path that matches this if specified. Wildcards " "specified as * are allowed. Case insensitive." msgstr "" -#: documents/models.py:1215 +#: documents/models.py:1222 msgid "filter filename" msgstr "" -#: documents/models.py:1220 paperless_mail/models.py:200 +#: documents/models.py:1227 paperless_mail/models.py:200 msgid "" "Only consume documents which entirely match this filename if specified. " "Wildcards such as *.pdf or *invoice* are allowed. Case insensitive." msgstr "" -#: documents/models.py:1231 +#: documents/models.py:1238 msgid "filter documents from this mail rule" msgstr "" -#: documents/models.py:1247 +#: documents/models.py:1254 msgid "has these tag(s)" msgstr "" -#: documents/models.py:1254 +#: documents/models.py:1261 msgid "has all of these tag(s)" msgstr "" -#: documents/models.py:1261 +#: documents/models.py:1268 msgid "does not have these tag(s)" msgstr "" -#: documents/models.py:1269 +#: documents/models.py:1276 msgid "has this document type" msgstr "" -#: documents/models.py:1276 +#: documents/models.py:1283 msgid "has one of these document types" msgstr "" -#: documents/models.py:1283 +#: documents/models.py:1290 msgid "does not have these document type(s)" msgstr "" -#: documents/models.py:1291 +#: documents/models.py:1298 msgid "has this correspondent" msgstr "" -#: documents/models.py:1298 +#: documents/models.py:1305 msgid "does not have these correspondent(s)" msgstr "" -#: documents/models.py:1305 +#: documents/models.py:1312 msgid "has one of these correspondents" msgstr "" -#: documents/models.py:1313 +#: documents/models.py:1320 msgid "has this storage path" msgstr "" -#: documents/models.py:1320 +#: documents/models.py:1327 msgid "has one of these storage paths" msgstr "" -#: documents/models.py:1327 +#: documents/models.py:1334 msgid "does not have these storage path(s)" msgstr "" -#: documents/models.py:1331 +#: documents/models.py:1338 msgid "filter custom field query" msgstr "" -#: documents/models.py:1334 +#: documents/models.py:1341 msgid "JSON-encoded custom field query expression." msgstr "" -#: documents/models.py:1338 +#: documents/models.py:1345 msgid "schedule offset days" msgstr "" -#: documents/models.py:1341 +#: documents/models.py:1348 msgid "The number of days to offset the schedule trigger by." msgstr "" -#: documents/models.py:1346 +#: documents/models.py:1353 msgid "schedule is recurring" msgstr "" -#: documents/models.py:1349 +#: documents/models.py:1356 msgid "If the schedule should be recurring." msgstr "" -#: documents/models.py:1354 +#: documents/models.py:1361 msgid "schedule recurring delay in days" msgstr "" -#: documents/models.py:1358 +#: documents/models.py:1365 msgid "The number of days between recurring schedule triggers." msgstr "" -#: documents/models.py:1363 +#: documents/models.py:1370 msgid "schedule date field" msgstr "" -#: documents/models.py:1368 +#: documents/models.py:1375 msgid "The field to check for a schedule trigger." msgstr "" -#: documents/models.py:1377 +#: documents/models.py:1384 msgid "schedule date custom field" msgstr "" -#: documents/models.py:1381 +#: documents/models.py:1388 msgid "workflow trigger" msgstr "" -#: documents/models.py:1382 +#: documents/models.py:1389 msgid "workflow triggers" msgstr "" -#: documents/models.py:1390 +#: documents/models.py:1397 msgid "email subject" msgstr "" -#: documents/models.py:1394 +#: documents/models.py:1401 msgid "" "The subject of the email, can include some placeholders, see documentation." msgstr "" -#: documents/models.py:1400 +#: documents/models.py:1407 msgid "email body" msgstr "" -#: documents/models.py:1403 +#: documents/models.py:1410 msgid "" "The body (message) of the email, can include some placeholders, see " "documentation." msgstr "" -#: documents/models.py:1409 +#: documents/models.py:1416 msgid "emails to" msgstr "" -#: documents/models.py:1412 +#: documents/models.py:1419 msgid "The destination email addresses, comma separated." msgstr "" -#: documents/models.py:1418 +#: documents/models.py:1425 msgid "include document in email" msgstr "" -#: documents/models.py:1429 +#: documents/models.py:1436 msgid "webhook url" msgstr "" -#: documents/models.py:1432 +#: documents/models.py:1439 msgid "The destination URL for the notification." msgstr "" -#: documents/models.py:1437 +#: documents/models.py:1444 msgid "use parameters" msgstr "" -#: documents/models.py:1442 +#: documents/models.py:1449 msgid "send as JSON" msgstr "" -#: documents/models.py:1446 +#: documents/models.py:1453 msgid "webhook parameters" msgstr "" -#: documents/models.py:1449 +#: documents/models.py:1456 msgid "The parameters to send with the webhook URL if body not used." msgstr "" -#: documents/models.py:1453 +#: documents/models.py:1460 msgid "webhook body" msgstr "" -#: documents/models.py:1456 +#: documents/models.py:1463 msgid "The body to send with the webhook URL if parameters not used." msgstr "" -#: documents/models.py:1460 +#: documents/models.py:1467 msgid "webhook headers" msgstr "" -#: documents/models.py:1463 +#: documents/models.py:1470 msgid "The headers to send with the webhook URL." msgstr "" -#: documents/models.py:1468 +#: documents/models.py:1475 msgid "include document in webhook" msgstr "" -#: documents/models.py:1479 +#: documents/models.py:1486 msgid "Assignment" msgstr "" -#: documents/models.py:1483 +#: documents/models.py:1490 msgid "Removal" msgstr "" -#: documents/models.py:1487 documents/templates/account/password_reset.html:15 +#: documents/models.py:1494 documents/templates/account/password_reset.html:15 msgid "Email" msgstr "" -#: documents/models.py:1491 +#: documents/models.py:1498 msgid "Webhook" msgstr "" -#: documents/models.py:1495 +#: documents/models.py:1502 msgid "Password removal" msgstr "" -#: documents/models.py:1499 +#: documents/models.py:1506 msgid "Move to trash" msgstr "" -#: documents/models.py:1503 +#: documents/models.py:1510 msgid "Workflow Action Type" msgstr "" -#: documents/models.py:1508 documents/models.py:1750 +#: documents/models.py:1515 documents/models.py:1757 #: paperless_mail/models.py:145 msgid "order" msgstr "" -#: documents/models.py:1511 +#: documents/models.py:1518 msgid "assign title" msgstr "" -#: documents/models.py:1515 +#: documents/models.py:1522 msgid "Assign a document title, must be a Jinja2 template, see documentation." msgstr "" -#: documents/models.py:1523 paperless_mail/models.py:274 +#: documents/models.py:1530 paperless_mail/models.py:274 msgid "assign this tag" msgstr "" -#: documents/models.py:1532 paperless_mail/models.py:282 +#: documents/models.py:1539 paperless_mail/models.py:282 msgid "assign this document type" msgstr "" -#: documents/models.py:1541 paperless_mail/models.py:296 +#: documents/models.py:1548 paperless_mail/models.py:296 msgid "assign this correspondent" msgstr "" -#: documents/models.py:1550 +#: documents/models.py:1557 msgid "assign this storage path" msgstr "" -#: documents/models.py:1559 +#: documents/models.py:1566 msgid "assign this owner" msgstr "" -#: documents/models.py:1566 +#: documents/models.py:1573 msgid "grant view permissions to these users" msgstr "" -#: documents/models.py:1573 +#: documents/models.py:1580 msgid "grant view permissions to these groups" msgstr "" -#: documents/models.py:1580 +#: documents/models.py:1587 msgid "grant change permissions to these users" msgstr "" -#: documents/models.py:1587 +#: documents/models.py:1594 msgid "grant change permissions to these groups" msgstr "" -#: documents/models.py:1594 +#: documents/models.py:1601 msgid "assign these custom fields" msgstr "" -#: documents/models.py:1598 +#: documents/models.py:1605 msgid "custom field values" msgstr "" -#: documents/models.py:1602 +#: documents/models.py:1609 msgid "Optional values to assign to the custom fields." msgstr "" -#: documents/models.py:1611 +#: documents/models.py:1618 msgid "remove these tag(s)" msgstr "" -#: documents/models.py:1616 +#: documents/models.py:1623 msgid "remove all tags" msgstr "" -#: documents/models.py:1623 +#: documents/models.py:1630 msgid "remove these document type(s)" msgstr "" -#: documents/models.py:1628 +#: documents/models.py:1635 msgid "remove all document types" msgstr "" -#: documents/models.py:1635 +#: documents/models.py:1642 msgid "remove these correspondent(s)" msgstr "" -#: documents/models.py:1640 +#: documents/models.py:1647 msgid "remove all correspondents" msgstr "" -#: documents/models.py:1647 +#: documents/models.py:1654 msgid "remove these storage path(s)" msgstr "" -#: documents/models.py:1652 +#: documents/models.py:1659 msgid "remove all storage paths" msgstr "" -#: documents/models.py:1659 +#: documents/models.py:1666 msgid "remove these owner(s)" msgstr "" -#: documents/models.py:1664 +#: documents/models.py:1671 msgid "remove all owners" msgstr "" -#: documents/models.py:1671 +#: documents/models.py:1678 msgid "remove view permissions for these users" msgstr "" -#: documents/models.py:1678 +#: documents/models.py:1685 msgid "remove view permissions for these groups" msgstr "" -#: documents/models.py:1685 +#: documents/models.py:1692 msgid "remove change permissions for these users" msgstr "" -#: documents/models.py:1692 +#: documents/models.py:1699 msgid "remove change permissions for these groups" msgstr "" -#: documents/models.py:1697 +#: documents/models.py:1704 msgid "remove all permissions" msgstr "" -#: documents/models.py:1704 +#: documents/models.py:1711 msgid "remove these custom fields" msgstr "" -#: documents/models.py:1709 +#: documents/models.py:1716 msgid "remove all custom fields" msgstr "" -#: documents/models.py:1718 +#: documents/models.py:1725 msgid "email" msgstr "" -#: documents/models.py:1727 +#: documents/models.py:1734 msgid "webhook" msgstr "" -#: documents/models.py:1731 +#: documents/models.py:1738 msgid "passwords" msgstr "" -#: documents/models.py:1735 +#: documents/models.py:1742 msgid "" "Passwords to try when removing PDF protection. Separate with commas or new " "lines." msgstr "" -#: documents/models.py:1740 +#: documents/models.py:1747 msgid "workflow action" msgstr "" -#: documents/models.py:1741 +#: documents/models.py:1748 msgid "workflow actions" msgstr "" -#: documents/models.py:1756 +#: documents/models.py:1763 msgid "triggers" msgstr "" -#: documents/models.py:1763 +#: documents/models.py:1770 msgid "actions" msgstr "" -#: documents/models.py:1766 paperless_mail/models.py:154 +#: documents/models.py:1773 paperless_mail/models.py:154 msgid "enabled" msgstr "" -#: documents/models.py:1777 +#: documents/models.py:1784 msgid "workflow" msgstr "" -#: documents/models.py:1781 +#: documents/models.py:1788 msgid "workflow trigger type" msgstr "" -#: documents/models.py:1795 +#: documents/models.py:1802 msgid "date run" msgstr "" -#: documents/models.py:1801 +#: documents/models.py:1808 msgid "workflow run" msgstr "" -#: documents/models.py:1802 +#: documents/models.py:1809 msgid "workflow runs" msgstr "" #: documents/serialisers.py:463 documents/serialisers.py:815 -#: documents/serialisers.py:2549 documents/views.py:2066 -#: documents/views.py:2124 paperless_mail/serialisers.py:143 +#: documents/serialisers.py:2545 documents/views.py:2079 +#: documents/views.py:2134 paperless_mail/serialisers.py:143 msgid "Insufficient permissions." msgstr "" @@ -1309,39 +1309,39 @@ msgstr "" msgid "Invalid color." msgstr "" -#: documents/serialisers.py:2172 +#: documents/serialisers.py:2168 #, python-format msgid "File type %(type)s not supported" msgstr "" -#: documents/serialisers.py:2216 +#: documents/serialisers.py:2212 #, python-format msgid "Custom field id must be an integer: %(id)s" msgstr "" -#: documents/serialisers.py:2223 +#: documents/serialisers.py:2219 #, python-format msgid "Custom field with id %(id)s does not exist" msgstr "" -#: documents/serialisers.py:2240 documents/serialisers.py:2250 +#: documents/serialisers.py:2236 documents/serialisers.py:2246 msgid "" "Custom fields must be a list of integers or an object mapping ids to values." msgstr "" -#: documents/serialisers.py:2245 +#: documents/serialisers.py:2241 msgid "Some custom fields don't exist or were specified twice." msgstr "" -#: documents/serialisers.py:2392 +#: documents/serialisers.py:2388 msgid "Invalid variable detected." msgstr "" -#: documents/serialisers.py:2605 +#: documents/serialisers.py:2601 msgid "Duplicate document identifiers are not allowed." msgstr "" -#: documents/serialisers.py:2635 documents/views.py:3738 +#: documents/serialisers.py:2631 documents/views.py:3738 #, python-format msgid "Documents not found: %(ids)s" msgstr "" @@ -1609,7 +1609,7 @@ msgstr "" msgid "Unable to parse URI {value}" msgstr "" -#: documents/views.py:2059 documents/views.py:2121 +#: documents/views.py:2072 documents/views.py:2131 msgid "Invalid more_like_id" msgstr "" @@ -1866,151 +1866,151 @@ msgstr "" msgid "paperless application settings" msgstr "" -#: paperless/settings/__init__.py:518 +#: paperless/settings/__init__.py:524 msgid "English (US)" msgstr "" -#: paperless/settings/__init__.py:519 +#: paperless/settings/__init__.py:525 msgid "Arabic" msgstr "" -#: paperless/settings/__init__.py:520 +#: paperless/settings/__init__.py:526 msgid "Afrikaans" msgstr "" -#: paperless/settings/__init__.py:521 +#: paperless/settings/__init__.py:527 msgid "Belarusian" msgstr "" -#: paperless/settings/__init__.py:522 +#: paperless/settings/__init__.py:528 msgid "Bulgarian" msgstr "" -#: paperless/settings/__init__.py:523 +#: paperless/settings/__init__.py:529 msgid "Catalan" msgstr "" -#: paperless/settings/__init__.py:524 +#: paperless/settings/__init__.py:530 msgid "Czech" msgstr "" -#: paperless/settings/__init__.py:525 +#: paperless/settings/__init__.py:531 msgid "Danish" msgstr "" -#: paperless/settings/__init__.py:526 +#: paperless/settings/__init__.py:532 msgid "German" msgstr "" -#: paperless/settings/__init__.py:527 +#: paperless/settings/__init__.py:533 msgid "Greek" msgstr "" -#: paperless/settings/__init__.py:528 +#: paperless/settings/__init__.py:534 msgid "English (GB)" msgstr "" -#: paperless/settings/__init__.py:529 +#: paperless/settings/__init__.py:535 msgid "Spanish" msgstr "" -#: paperless/settings/__init__.py:530 +#: paperless/settings/__init__.py:536 msgid "Persian" msgstr "" -#: paperless/settings/__init__.py:531 +#: paperless/settings/__init__.py:537 msgid "Finnish" msgstr "" -#: paperless/settings/__init__.py:532 +#: paperless/settings/__init__.py:538 msgid "French" msgstr "" -#: paperless/settings/__init__.py:533 +#: paperless/settings/__init__.py:539 msgid "Hungarian" msgstr "" -#: paperless/settings/__init__.py:534 +#: paperless/settings/__init__.py:540 msgid "Indonesian" msgstr "" -#: paperless/settings/__init__.py:535 +#: paperless/settings/__init__.py:541 msgid "Italian" msgstr "" -#: paperless/settings/__init__.py:536 +#: paperless/settings/__init__.py:542 msgid "Japanese" msgstr "" -#: paperless/settings/__init__.py:537 +#: paperless/settings/__init__.py:543 msgid "Korean" msgstr "" -#: paperless/settings/__init__.py:538 +#: paperless/settings/__init__.py:544 msgid "Luxembourgish" msgstr "" -#: paperless/settings/__init__.py:539 +#: paperless/settings/__init__.py:545 msgid "Norwegian" msgstr "" -#: paperless/settings/__init__.py:540 +#: paperless/settings/__init__.py:546 msgid "Dutch" msgstr "" -#: paperless/settings/__init__.py:541 +#: paperless/settings/__init__.py:547 msgid "Polish" msgstr "" -#: paperless/settings/__init__.py:542 +#: paperless/settings/__init__.py:548 msgid "Portuguese (Brazil)" msgstr "" -#: paperless/settings/__init__.py:543 +#: paperless/settings/__init__.py:549 msgid "Portuguese" msgstr "" -#: paperless/settings/__init__.py:544 +#: paperless/settings/__init__.py:550 msgid "Romanian" msgstr "" -#: paperless/settings/__init__.py:545 +#: paperless/settings/__init__.py:551 msgid "Russian" msgstr "" -#: paperless/settings/__init__.py:546 +#: paperless/settings/__init__.py:552 msgid "Slovak" msgstr "" -#: paperless/settings/__init__.py:547 +#: paperless/settings/__init__.py:553 msgid "Slovenian" msgstr "" -#: paperless/settings/__init__.py:548 +#: paperless/settings/__init__.py:554 msgid "Serbian" msgstr "" -#: paperless/settings/__init__.py:549 +#: paperless/settings/__init__.py:555 msgid "Swedish" msgstr "" -#: paperless/settings/__init__.py:550 +#: paperless/settings/__init__.py:556 msgid "Turkish" msgstr "" -#: paperless/settings/__init__.py:551 +#: paperless/settings/__init__.py:557 msgid "Ukrainian" msgstr "" -#: paperless/settings/__init__.py:552 +#: paperless/settings/__init__.py:558 msgid "Vietnamese" msgstr "" -#: paperless/settings/__init__.py:553 +#: paperless/settings/__init__.py:559 msgid "Chinese Simplified" msgstr "" -#: paperless/settings/__init__.py:554 +#: paperless/settings/__init__.py:560 msgid "Chinese Traditional" msgstr "" From 376af81b9c556b1ac75801a9b00278cebf9c7039 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 2 Apr 2026 14:58:28 -0700 Subject: [PATCH 097/113] Fix: Resolve another TC assuming an object has been created somewhere (#12503) --- src/documents/tests/test_views.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/documents/tests/test_views.py b/src/documents/tests/test_views.py index 14f0425b9..314636045 100644 --- a/src/documents/tests/test_views.py +++ b/src/documents/tests/test_views.py @@ -31,6 +31,11 @@ from paperless.models import ApplicationConfiguration class TestViews(DirectoriesMixin, TestCase): + @classmethod + def setUpTestData(cls) -> None: + super().setUpTestData() + ApplicationConfiguration.objects.get_or_create() + def setUp(self) -> None: self.user = User.objects.create_user("testuser") super().setUp() From dda05a7c00eb91e76e044aa4007a548b4acb4446 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 2 Apr 2026 15:30:26 -0700 Subject: [PATCH 098/113] Security: Improve overall security in a few ways (#12501) - Make sure we're always using regex with timeouts for user controlled data - Adds rate limiting to the token endpoint (configurable) - Signs the classifier pickle file with the SECRET_KEY and refuse to load one which doesn't verify. - Require the user to set a secret key, instead of falling back to our old hard coded one --- Dockerfile | 4 +- docker/compose/docker-compose.env | 6 +- docs/configuration.md | 30 +++- paperless.conf.example | 3 +- pyproject.toml | 3 + src/documents/barcodes.py | 20 ++- src/documents/classifier.py | 126 ++++++++++------- .../plugins/date_parsing/regex_parser.py | 12 +- src/documents/regex.py | 70 ++++++++++ src/documents/tests/data/v1.17.4.model.pickle | Bin 714 -> 0 bytes src/documents/tests/test_classifier.py | 130 +++++++++++++----- src/documents/tests/test_regex.py | 128 +++++++++++++++++ src/paperless/settings/__init__.py | 18 ++- src/paperless/views.py | 3 + 14 files changed, 443 insertions(+), 110 deletions(-) delete mode 100644 src/documents/tests/data/v1.17.4.model.pickle create mode 100644 src/documents/tests/test_regex.py diff --git a/Dockerfile b/Dockerfile index ac6143162..0b8886c61 100644 --- a/Dockerfile +++ b/Dockerfile @@ -237,8 +237,8 @@ RUN set -eux \ && echo "Adjusting all permissions" \ && chown --from root:root --changes --recursive paperless:paperless /usr/src/paperless \ && echo "Collecting static files" \ - && s6-setuidgid paperless python3 manage.py collectstatic --clear --no-input --link \ - && s6-setuidgid paperless python3 manage.py compilemessages \ + && PAPERLESS_SECRET_KEY=build-time-dummy s6-setuidgid paperless python3 manage.py collectstatic --clear --no-input --link \ + && PAPERLESS_SECRET_KEY=build-time-dummy s6-setuidgid paperless python3 manage.py compilemessages \ && /usr/local/bin/deduplicate.py --verbose /usr/src/paperless/static/ VOLUME ["/usr/src/paperless/data", \ diff --git a/docker/compose/docker-compose.env b/docker/compose/docker-compose.env index 75eeeed09..af6a6e8fe 100644 --- a/docker/compose/docker-compose.env +++ b/docker/compose/docker-compose.env @@ -17,9 +17,9 @@ # (if doing so please consider security measures such as reverse proxy) #PAPERLESS_URL=https://paperless.example.com -# Adjust this key if you plan to make paperless available publicly. It should -# be a very long sequence of random characters. You don't need to remember it. -#PAPERLESS_SECRET_KEY=change-me +# Required. A unique secret key for session tokens and signing. +# Generate with: python3 -c "import secrets; print(secrets.token_urlsafe(64))" +PAPERLESS_SECRET_KEY=change-me # Use this variable to set a timezone for the Paperless Docker containers. Defaults to UTC. #PAPERLESS_TIME_ZONE=America/Los_Angeles diff --git a/docs/configuration.md b/docs/configuration.md index a22171ce9..fa0d32c51 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -402,6 +402,12 @@ Defaults to `/usr/share/nltk_data` : This is where paperless will store the classification model. + !!! warning + + The classification model uses Python's pickle serialization format. + Ensure this file is only writable by the paperless user, as a + maliciously crafted model file could execute arbitrary code when loaded. + Defaults to `PAPERLESS_DATA_DIR/classification_model.pickle`. ## Logging @@ -422,14 +428,20 @@ Defaults to `/usr/share/nltk_data` #### [`PAPERLESS_SECRET_KEY=`](#PAPERLESS_SECRET_KEY) {#PAPERLESS_SECRET_KEY} -: Paperless uses this to make session tokens. If you expose paperless -on the internet, you need to change this, since the default secret -is well known. +: **Required.** Paperless uses this to make session tokens and sign +sensitive data. Paperless will refuse to start if this is not set. Use any sequence of characters. The more, the better. You don't - need to remember this. Just face-roll your keyboard. + need to remember this. You can generate a suitable key with: - Default is listed in the file `src/paperless/settings.py`. + python3 -c "import secrets; print(secrets.token_urlsafe(64))" + + !!! warning + + This setting has no default value. You **must** set it before + starting Paperless. Existing installations that relied on the + previous default value should set `PAPERLESS_SECRET_KEY` to + that value to avoid invalidating existing sessions and tokens. #### [`PAPERLESS_URL=`](#PAPERLESS_URL) {#PAPERLESS_URL} @@ -770,6 +782,14 @@ If both the [PAPERLESS_ACCOUNT_DEFAULT_GROUPS](#PAPERLESS_ACCOUNT_DEFAULT_GROUPS Defaults to 1209600 (2 weeks) +#### [`PAPERLESS_TOKEN_THROTTLE_RATE=`](#PAPERLESS_TOKEN_THROTTLE_RATE) {#PAPERLESS_TOKEN_THROTTLE_RATE} + +: Rate limit for the API token authentication endpoint (`/api/token/`), used to mitigate brute-force login attempts. +Uses Django REST Framework's [throttle rate format](https://www.django-rest-framework.org/api-guide/throttling/#setting-the-throttling-policy), +e.g. `5/min`, `100/hour`, `1000/day`. + + Defaults to `5/min` + ## OCR settings {#ocr} Paperless uses [OCRmyPDF](https://ocrmypdf.readthedocs.io/en/latest/) diff --git a/paperless.conf.example b/paperless.conf.example index 9974aeab6..a0c406f82 100644 --- a/paperless.conf.example +++ b/paperless.conf.example @@ -23,7 +23,8 @@ # Security and hosting -#PAPERLESS_SECRET_KEY=change-me +# Required. Generate with: python3 -c "import secrets; print(secrets.token_urlsafe(64))" +PAPERLESS_SECRET_KEY=change-me #PAPERLESS_URL=https://example.com #PAPERLESS_CSRF_TRUSTED_ORIGINS=https://example.com # can be set using PAPERLESS_URL #PAPERLESS_ALLOWED_HOSTS=example.com,www.example.com # can be set using PAPERLESS_URL diff --git a/pyproject.toml b/pyproject.toml index 5af886f0c..7bb160956 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -315,9 +315,12 @@ markers = [ ] [tool.pytest_env] +PAPERLESS_SECRET_KEY = "test-secret-key-do-not-use-in-production" PAPERLESS_DISABLE_DBHANDLER = "true" PAPERLESS_CACHE_BACKEND = "django.core.cache.backends.locmem.LocMemCache" PAPERLESS_CHANNELS_BACKEND = "channels.layers.InMemoryChannelLayer" +# I don't think anything hits this, but just in case, basically infinite +PAPERLESS_TOKEN_THROTTLE_RATE = "1000/min" [tool.coverage.report] exclude_also = [ diff --git a/src/documents/barcodes.py b/src/documents/barcodes.py index 31ef052c4..38a28081a 100644 --- a/src/documents/barcodes.py +++ b/src/documents/barcodes.py @@ -7,6 +7,7 @@ from dataclasses import dataclass from pathlib import Path from typing import TYPE_CHECKING +import regex as regex_mod from django.conf import settings from pdf2image import convert_from_path from pikepdf import Page @@ -22,6 +23,8 @@ from documents.plugins.base import ConsumeTaskPlugin from documents.plugins.base import StopConsumeTaskError from documents.plugins.helpers import ProgressManager from documents.plugins.helpers import ProgressStatusOptions +from documents.regex import safe_regex_match +from documents.regex import safe_regex_sub from documents.utils import copy_basic_file_stats from documents.utils import copy_file_with_basic_stats from documents.utils import maybe_override_pixel_limit @@ -68,8 +71,8 @@ class Barcode: Note: This does NOT exclude ASN or separator barcodes - they can also be used as tags if they match a tag mapping pattern (e.g., {"ASN12.*": "JOHN"}). """ - for regex in self.settings.barcode_tag_mapping: - if re.match(regex, self.value, flags=re.IGNORECASE): + for pattern in self.settings.barcode_tag_mapping: + if safe_regex_match(pattern, self.value, flags=regex_mod.IGNORECASE): return True return False @@ -392,11 +395,16 @@ class BarcodePlugin(ConsumeTaskPlugin): for raw in tag_texts.split(","): try: tag_str: str | None = None - for regex in self.settings.barcode_tag_mapping: - if re.match(regex, raw, flags=re.IGNORECASE): - sub = self.settings.barcode_tag_mapping[regex] + for pattern in self.settings.barcode_tag_mapping: + if safe_regex_match(pattern, raw, flags=regex_mod.IGNORECASE): + sub = self.settings.barcode_tag_mapping[pattern] tag_str = ( - re.sub(regex, sub, raw, flags=re.IGNORECASE) + safe_regex_sub( + pattern, + sub, + raw, + flags=regex_mod.IGNORECASE, + ) if sub else raw ) diff --git a/src/documents/classifier.py b/src/documents/classifier.py index 87934ab52..519e1eac5 100644 --- a/src/documents/classifier.py +++ b/src/documents/classifier.py @@ -1,5 +1,6 @@ from __future__ import annotations +import hmac import logging import pickle import re @@ -75,7 +76,7 @@ def load_classifier(*, raise_exception: bool = False) -> DocumentClassifier | No "Unrecoverable error while loading document " "classification model, deleting model file.", ) - Path(settings.MODEL_FILE).unlink + Path(settings.MODEL_FILE).unlink() classifier = None if raise_exception: raise e @@ -97,7 +98,10 @@ class DocumentClassifier: # v7 - Updated scikit-learn package version # v8 - Added storage path classifier # v9 - Changed from hashing to time/ids for re-train check - FORMAT_VERSION = 9 + # v10 - HMAC-signed model file + FORMAT_VERSION = 10 + + HMAC_SIZE = 32 # SHA-256 digest length def __init__(self) -> None: # last time a document changed and therefore training might be required @@ -128,67 +132,89 @@ class DocumentClassifier: pickle.dumps(self.data_vectorizer), ).hexdigest() + @staticmethod + def _compute_hmac(data: bytes) -> bytes: + return hmac.new( + settings.SECRET_KEY.encode(), + data, + sha256, + ).digest() + def load(self) -> None: from sklearn.exceptions import InconsistentVersionWarning + raw = Path(settings.MODEL_FILE).read_bytes() + + if len(raw) <= self.HMAC_SIZE: + raise ClassifierModelCorruptError + + signature = raw[: self.HMAC_SIZE] + data = raw[self.HMAC_SIZE :] + + if not hmac.compare_digest(signature, self._compute_hmac(data)): + raise ClassifierModelCorruptError + # Catch warnings for processing with warnings.catch_warnings(record=True) as w: - with Path(settings.MODEL_FILE).open("rb") as f: - schema_version = pickle.load(f) + try: + ( + schema_version, + self.last_doc_change_time, + self.last_auto_type_hash, + self.data_vectorizer, + self.tags_binarizer, + self.tags_classifier, + self.correspondent_classifier, + self.document_type_classifier, + self.storage_path_classifier, + ) = pickle.loads(data) + except Exception as err: + raise ClassifierModelCorruptError from err - if schema_version != self.FORMAT_VERSION: - raise IncompatibleClassifierVersionError( - "Cannot load classifier, incompatible versions.", - ) - else: - try: - self.last_doc_change_time = pickle.load(f) - self.last_auto_type_hash = pickle.load(f) - - self.data_vectorizer = pickle.load(f) - self._update_data_vectorizer_hash() - self.tags_binarizer = pickle.load(f) - - self.tags_classifier = pickle.load(f) - self.correspondent_classifier = pickle.load(f) - self.document_type_classifier = pickle.load(f) - self.storage_path_classifier = pickle.load(f) - except Exception as err: - raise ClassifierModelCorruptError from err - - # Check for the warning about unpickling from differing versions - # and consider it incompatible - sk_learn_warning_url = ( - "https://scikit-learn.org/stable/" - "model_persistence.html" - "#security-maintainability-limitations" + if schema_version != self.FORMAT_VERSION: + raise IncompatibleClassifierVersionError( + "Cannot load classifier, incompatible versions.", ) - for warning in w: - # The warning is inconsistent, the MLPClassifier is a specific warning, others have not updated yet - if issubclass(warning.category, InconsistentVersionWarning) or ( - issubclass(warning.category, UserWarning) - and sk_learn_warning_url in str(warning.message) - ): - raise IncompatibleClassifierVersionError("sklearn version update") + + self._update_data_vectorizer_hash() + + # Check for the warning about unpickling from differing versions + # and consider it incompatible + sk_learn_warning_url = ( + "https://scikit-learn.org/stable/" + "model_persistence.html" + "#security-maintainability-limitations" + ) + for warning in w: + # The warning is inconsistent, the MLPClassifier is a specific warning, others have not updated yet + if issubclass(warning.category, InconsistentVersionWarning) or ( + issubclass(warning.category, UserWarning) + and sk_learn_warning_url in str(warning.message) + ): + raise IncompatibleClassifierVersionError("sklearn version update") def save(self) -> None: target_file: Path = settings.MODEL_FILE target_file_temp: Path = target_file.with_suffix(".pickle.part") + data = pickle.dumps( + ( + self.FORMAT_VERSION, + self.last_doc_change_time, + self.last_auto_type_hash, + self.data_vectorizer, + self.tags_binarizer, + self.tags_classifier, + self.correspondent_classifier, + self.document_type_classifier, + self.storage_path_classifier, + ), + ) + + signature = self._compute_hmac(data) + with target_file_temp.open("wb") as f: - pickle.dump(self.FORMAT_VERSION, f) - - pickle.dump(self.last_doc_change_time, f) - pickle.dump(self.last_auto_type_hash, f) - - pickle.dump(self.data_vectorizer, f) - - pickle.dump(self.tags_binarizer, f) - pickle.dump(self.tags_classifier, f) - - pickle.dump(self.correspondent_classifier, f) - pickle.dump(self.document_type_classifier, f) - pickle.dump(self.storage_path_classifier, f) + f.write(signature + data) target_file_temp.rename(target_file) diff --git a/src/documents/plugins/date_parsing/regex_parser.py b/src/documents/plugins/date_parsing/regex_parser.py index 2df8f9295..07a9e24f0 100644 --- a/src/documents/plugins/date_parsing/regex_parser.py +++ b/src/documents/plugins/date_parsing/regex_parser.py @@ -1,9 +1,11 @@ import datetime -import re from collections.abc import Iterator -from re import Match + +import regex +from regex import Match from documents.plugins.date_parsing.base import DateParserPluginBase +from documents.regex import safe_regex_finditer class RegexDateParserPlugin(DateParserPluginBase): @@ -14,7 +16,7 @@ class RegexDateParserPlugin(DateParserPluginBase): passed to its constructor. """ - DATE_REGEX = re.compile( + DATE_REGEX = regex.compile( r"(\b|(?!=([_-])))(\d{1,2})[\.\/-](\d{1,2})[\.\/-](\d{4}|\d{2})(\b|(?=([_-])))|" r"(\b|(?!=([_-])))(\d{4}|\d{2})[\.\/-](\d{1,2})[\.\/-](\d{1,2})(\b|(?=([_-])))|" r"(\b|(?!=([_-])))(\d{1,2}[\. ]+[a-zéûäëčžúřěáíóńźçŞğü]{3,9} \d{4}|[a-zéûäëčžúřěáíóńźçŞğü]{3,9} \d{1,2}, \d{4})(\b|(?=([_-])))|" @@ -22,7 +24,7 @@ class RegexDateParserPlugin(DateParserPluginBase): r"(\b|(?!=([_-])))([^\W\d_]{3,9} \d{4})(\b|(?=([_-])))|" r"(\b|(?!=([_-])))(\d{1,2}[^ 0-9]{2}[\. ]+[^ ]{3,9}[ \.\/-]\d{4})(\b|(?=([_-])))|" r"(\b|(?!=([_-])))(\b\d{1,2}[ \.\/-][a-zéûäëčžúřěáíóńźçŞğü]{3}[ \.\/-]\d{4})(\b|(?=([_-])))", - re.IGNORECASE, + regex.IGNORECASE, ) def _process_match( @@ -45,7 +47,7 @@ class RegexDateParserPlugin(DateParserPluginBase): """ Finds all regex matches in content and yields valid dates. """ - for m in re.finditer(self.DATE_REGEX, content): + for m in safe_regex_finditer(self.DATE_REGEX, content): date = self._process_match(m, date_order) if date is not None: yield date diff --git a/src/documents/regex.py b/src/documents/regex.py index 35acc5af0..849d417d8 100644 --- a/src/documents/regex.py +++ b/src/documents/regex.py @@ -48,3 +48,73 @@ def safe_regex_search(pattern: str, text: str, *, flags: int = 0): textwrap.shorten(pattern, width=80, placeholder="…"), ) return None + + +def safe_regex_match(pattern: str, text: str, *, flags: int = 0): + """ + Run a regex match with a timeout. Returns a match object or None. + Validation errors and timeouts are logged and treated as no match. + """ + + try: + validate_regex_pattern(pattern) + compiled = regex.compile(pattern, flags=flags) + except (regex.error, ValueError) as exc: + logger.error( + "Error while processing regular expression %s: %s", + textwrap.shorten(pattern, width=80, placeholder="…"), + exc, + ) + return None + + try: + return compiled.match(text, timeout=REGEX_TIMEOUT_SECONDS) + except TimeoutError: + logger.warning( + "Regular expression matching timed out for pattern %s", + textwrap.shorten(pattern, width=80, placeholder="…"), + ) + return None + + +def safe_regex_sub(pattern: str, repl: str, text: str, *, flags: int = 0) -> str | None: + """ + Run a regex substitution with a timeout. Returns the substituted string, + or None on error/timeout. + """ + + try: + validate_regex_pattern(pattern) + compiled = regex.compile(pattern, flags=flags) + except (regex.error, ValueError) as exc: + logger.error( + "Error while processing regular expression %s: %s", + textwrap.shorten(pattern, width=80, placeholder="…"), + exc, + ) + return None + + try: + return compiled.sub(repl, text, timeout=REGEX_TIMEOUT_SECONDS) + except TimeoutError: + logger.warning( + "Regular expression substitution timed out for pattern %s", + textwrap.shorten(pattern, width=80, placeholder="…"), + ) + return None + + +def safe_regex_finditer(compiled_pattern: regex.Pattern, text: str): + """ + Run regex finditer with a timeout. Yields match objects. + Stops iteration on timeout. + """ + + try: + yield from compiled_pattern.finditer(text, timeout=REGEX_TIMEOUT_SECONDS) + except TimeoutError: + logger.warning( + "Regular expression finditer timed out for pattern %s", + textwrap.shorten(compiled_pattern.pattern, width=80, placeholder="…"), + ) + return diff --git a/src/documents/tests/data/v1.17.4.model.pickle b/src/documents/tests/data/v1.17.4.model.pickle deleted file mode 100644 index 4b2734607f8453ad7ecf7d972eea7eafb4deea4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 zcmZWn&ubGw6i(A5O`5b;(X$aeG!$dS(t7J5NRU7dJt#}>Nxq!lz) zc_%vxLiOa?lL!9<4<5vOp2s&32&ycX`bB-hA)9Z{EyqrctQwW}e+j9eQ=6UnIyJv=rcyXsGMg#PTgpfZF#FamSl0z#bMhN0`#&-p<{{ab%yzh# zbf}fbd!KH6`&fVb`|`VkquYO8y??s#_ru}ymtVgBymPqo>q1OFmrewo54U{aN>n?* zb)I%&bPj|clxa=g45q+MWsAHaMp5)4}4_;i~!Qw>RN|;QG z=f4TQFG&q%>1e)d8q+wvw!BJD1dH)rIf None: + def test_load_corrupt_file(self) -> None: """ GIVEN: - Corrupted classifier pickle file @@ -378,36 +377,116 @@ class TestClassifier(DirectoriesMixin, TestCase): """ self.generate_train_and_save() - # First load is the schema version,allow it - patched_pickle_load.side_effect = [DocumentClassifier.FORMAT_VERSION, OSError()] + # Write garbage data (valid HMAC length but invalid content) + Path(settings.MODEL_FILE).write_bytes(b"\x00" * 64) with self.assertRaises(ClassifierModelCorruptError): self.classifier.load() - patched_pickle_load.assert_called() - - patched_pickle_load.reset_mock() - patched_pickle_load.side_effect = [ - DocumentClassifier.FORMAT_VERSION, - ClassifierModelCorruptError(), - ] self.assertIsNone(load_classifier()) - patched_pickle_load.assert_called() + + def test_load_corrupt_pickle_valid_hmac(self) -> None: + """ + GIVEN: + - A classifier file with valid HMAC but unparsable pickle data + WHEN: + - An attempt is made to load the classifier + THEN: + - The ClassifierModelCorruptError is raised + """ + garbage_data = b"this is not valid pickle data" + signature = DocumentClassifier._compute_hmac(garbage_data) + Path(settings.MODEL_FILE).write_bytes(signature + garbage_data) + + with self.assertRaises(ClassifierModelCorruptError): + self.classifier.load() + + def test_load_tampered_file(self) -> None: + """ + GIVEN: + - A classifier model file whose data has been modified + WHEN: + - An attempt is made to load the classifier + THEN: + - The ClassifierModelCorruptError is raised due to HMAC mismatch + """ + self.generate_train_and_save() + + raw = Path(settings.MODEL_FILE).read_bytes() + # Flip a byte in the data portion (after the 32-byte HMAC) + tampered = raw[:32] + bytes([raw[32] ^ 0xFF]) + raw[33:] + Path(settings.MODEL_FILE).write_bytes(tampered) + + with self.assertRaises(ClassifierModelCorruptError): + self.classifier.load() + + def test_load_wrong_secret_key(self) -> None: + """ + GIVEN: + - A classifier model file signed with a different SECRET_KEY + WHEN: + - An attempt is made to load the classifier + THEN: + - The ClassifierModelCorruptError is raised due to HMAC mismatch + """ + self.generate_train_and_save() + + with override_settings(SECRET_KEY="different-secret-key"): + with self.assertRaises(ClassifierModelCorruptError): + self.classifier.load() + + def test_load_truncated_file(self) -> None: + """ + GIVEN: + - A classifier model file that is too short to contain an HMAC + WHEN: + - An attempt is made to load the classifier + THEN: + - The ClassifierModelCorruptError is raised + """ + Path(settings.MODEL_FILE).write_bytes(b"\x00" * 16) + + with self.assertRaises(ClassifierModelCorruptError): + self.classifier.load() def test_load_new_scikit_learn_version(self) -> None: """ GIVEN: - - classifier pickle file created with a different scikit-learn version + - classifier pickle file triggers an InconsistentVersionWarning WHEN: - An attempt is made to load the classifier THEN: - - The classifier reports the warning was captured and processed + - IncompatibleClassifierVersionError is raised """ - # TODO: This wasn't testing the warning anymore, as the schema changed - # but as it was implemented, it would require installing an old version - # rebuilding the file and committing that. Not developer friendly - # Need to rethink how to pass the load through to a file with a single - # old model? + from sklearn.exceptions import InconsistentVersionWarning + + self.generate_train_and_save() + + fake_warning = warnings.WarningMessage( + message=InconsistentVersionWarning( + estimator_name="MLPClassifier", + current_sklearn_version="1.0", + original_sklearn_version="0.9", + ), + category=InconsistentVersionWarning, + filename="", + lineno=0, + ) + + real_catch_warnings = warnings.catch_warnings + + class PatchedCatchWarnings(real_catch_warnings): + def __enter__(self): + w = super().__enter__() + w.append(fake_warning) + return w + + with mock.patch( + "documents.classifier.warnings.catch_warnings", + PatchedCatchWarnings, + ): + with self.assertRaises(IncompatibleClassifierVersionError): + self.classifier.load() def test_one_correspondent_predict(self) -> None: c1 = Correspondent.objects.create( @@ -685,17 +764,6 @@ class TestClassifier(DirectoriesMixin, TestCase): self.assertIsNone(load_classifier()) self.assertTrue(Path(settings.MODEL_FILE).exists()) - def test_load_old_classifier_version(self) -> None: - shutil.copy( - Path(__file__).parent / "data" / "v1.17.4.model.pickle", - self.dirs.scratch_dir, - ) - with override_settings( - MODEL_FILE=self.dirs.scratch_dir / "v1.17.4.model.pickle", - ): - classifier = load_classifier() - self.assertIsNone(classifier) - @mock.patch("documents.classifier.DocumentClassifier.load") def test_load_classifier_raise_exception(self, mock_load) -> None: Path(settings.MODEL_FILE).touch() diff --git a/src/documents/tests/test_regex.py b/src/documents/tests/test_regex.py new file mode 100644 index 000000000..a55f29c3c --- /dev/null +++ b/src/documents/tests/test_regex.py @@ -0,0 +1,128 @@ +import pytest +import regex +from pytest_mock import MockerFixture + +from documents.regex import safe_regex_finditer +from documents.regex import safe_regex_match +from documents.regex import safe_regex_search +from documents.regex import safe_regex_sub +from documents.regex import validate_regex_pattern + + +class TestValidateRegexPattern: + def test_valid_pattern(self): + validate_regex_pattern(r"\d+") + + def test_invalid_pattern_raises(self): + with pytest.raises(ValueError): + validate_regex_pattern(r"[invalid") + + +class TestSafeRegexSearchAndMatch: + """Tests for safe_regex_search and safe_regex_match (same contract).""" + + @pytest.mark.parametrize( + ("func", "pattern", "text", "expected_group"), + [ + pytest.param( + safe_regex_search, + r"\d+", + "abc123def", + "123", + id="search-match-found", + ), + pytest.param( + safe_regex_match, + r"\d+", + "123abc", + "123", + id="match-match-found", + ), + ], + ) + def test_match_found(self, func, pattern, text, expected_group): + result = func(pattern, text) + assert result is not None + assert result.group() == expected_group + + @pytest.mark.parametrize( + ("func", "pattern", "text"), + [ + pytest.param(safe_regex_search, r"\d+", "abcdef", id="search-no-match"), + pytest.param(safe_regex_match, r"\d+", "abc123", id="match-no-match"), + ], + ) + def test_no_match(self, func, pattern, text): + assert func(pattern, text) is None + + @pytest.mark.parametrize( + "func", + [ + pytest.param(safe_regex_search, id="search"), + pytest.param(safe_regex_match, id="match"), + ], + ) + def test_invalid_pattern_returns_none(self, func): + assert func(r"[invalid", "test") is None + + @pytest.mark.parametrize( + "func", + [ + pytest.param(safe_regex_search, id="search"), + pytest.param(safe_regex_match, id="match"), + ], + ) + def test_flags_respected(self, func): + assert func(r"abc", "ABC", flags=regex.IGNORECASE) is not None + + @pytest.mark.parametrize( + ("func", "method_name"), + [ + pytest.param(safe_regex_search, "search", id="search"), + pytest.param(safe_regex_match, "match", id="match"), + ], + ) + def test_timeout_returns_none(self, func, method_name, mocker: MockerFixture): + mock_compile = mocker.patch("documents.regex.regex.compile") + getattr(mock_compile.return_value, method_name).side_effect = TimeoutError + assert func(r"\d+", "test") is None + + +class TestSafeRegexSub: + @pytest.mark.parametrize( + ("pattern", "repl", "text", "expected"), + [ + pytest.param(r"\d+", "NUM", "abc123def456", "abcNUMdefNUM", id="basic-sub"), + pytest.param(r"\d+", "NUM", "abcdef", "abcdef", id="no-match"), + pytest.param(r"abc", "X", "ABC", "X", id="flags"), + ], + ) + def test_substitution(self, pattern, repl, text, expected): + flags = regex.IGNORECASE if pattern == r"abc" else 0 + result = safe_regex_sub(pattern, repl, text, flags=flags) + assert result == expected + + def test_invalid_pattern_returns_none(self): + assert safe_regex_sub(r"[invalid", "x", "test") is None + + def test_timeout_returns_none(self, mocker: MockerFixture): + mock_compile = mocker.patch("documents.regex.regex.compile") + mock_compile.return_value.sub.side_effect = TimeoutError + assert safe_regex_sub(r"\d+", "X", "test") is None + + +class TestSafeRegexFinditer: + def test_yields_matches(self): + pattern = regex.compile(r"\d+") + matches = list(safe_regex_finditer(pattern, "a1b22c333")) + assert [m.group() for m in matches] == ["1", "22", "333"] + + def test_no_matches(self): + pattern = regex.compile(r"\d+") + assert list(safe_regex_finditer(pattern, "abcdef")) == [] + + def test_timeout_stops_iteration(self, mocker: MockerFixture): + mock_pattern = mocker.MagicMock() + mock_pattern.finditer.side_effect = TimeoutError + mock_pattern.pattern = r"\d+" + assert list(safe_regex_finditer(mock_pattern, "test")) == [] diff --git a/src/paperless/settings/__init__.py b/src/paperless/settings/__init__.py index 3522b3187..a76c6ce75 100644 --- a/src/paperless/settings/__init__.py +++ b/src/paperless/settings/__init__.py @@ -11,6 +11,7 @@ from typing import Final from urllib.parse import urlparse from compression_middleware.middleware import CompressionMiddleware +from django.core.exceptions import ImproperlyConfigured from django.utils.translation import gettext_lazy as _ from dotenv import load_dotenv @@ -161,6 +162,9 @@ REST_FRAMEWORK = { "ALLOWED_VERSIONS": ["9", "10"], # DRF Spectacular default schema "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema", + "DEFAULT_THROTTLE_RATES": { + "login": os.getenv("PAPERLESS_TOKEN_THROTTLE_RATE", "5/min"), + }, } if DEBUG: @@ -460,13 +464,13 @@ SECURE_PROXY_SSL_HEADER = ( else None ) -# The secret key has a default that should be fine so long as you're hosting -# Paperless on a closed network. However, if you're putting this anywhere -# public, you should change the key to something unique and verbose. -SECRET_KEY = os.getenv( - "PAPERLESS_SECRET_KEY", - "e11fl1oa-*ytql8p)(06fbj4ukrlo+n7k&q5+$1md7i+mge=ee", -) +SECRET_KEY = os.getenv("PAPERLESS_SECRET_KEY", "") +if not SECRET_KEY: # pragma: no cover + raise ImproperlyConfigured( + "PAPERLESS_SECRET_KEY is not set. " + "A unique, secret key is required for secure operation. " + 'Generate one with: python3 -c "import secrets; print(secrets.token_urlsafe(64))"', + ) AUTH_PASSWORD_VALIDATORS = [ { diff --git a/src/paperless/views.py b/src/paperless/views.py index a3b965f3f..e4db40bb4 100644 --- a/src/paperless/views.py +++ b/src/paperless/views.py @@ -34,6 +34,7 @@ from rest_framework.pagination import PageNumberPagination from rest_framework.permissions import DjangoModelPermissions from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response +from rest_framework.throttling import ScopedRateThrottle from rest_framework.viewsets import ModelViewSet from documents.permissions import PaperlessObjectPermissions @@ -51,6 +52,8 @@ from paperless_ai.indexing import vector_store_file_exists class PaperlessObtainAuthTokenView(ObtainAuthToken): serializer_class = PaperlessAuthTokenSerializer + throttle_classes = [ScopedRateThrottle] + throttle_scope = "login" class StandardPagination(PageNumberPagination): From 83501757dfe21112b45716fd5691807da6f74285 Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 22:36:32 +0000 Subject: [PATCH 099/113] Auto translate strings --- src/locale/en_US/LC_MESSAGES/django.po | 76 +++++++++++++------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index cd32e10bd..eba121b5b 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-02 19:39+0000\n" +"POT-Creation-Date: 2026-04-02 22:35+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -1866,151 +1866,151 @@ msgstr "" msgid "paperless application settings" msgstr "" -#: paperless/settings/__init__.py:524 +#: paperless/settings/__init__.py:528 msgid "English (US)" msgstr "" -#: paperless/settings/__init__.py:525 +#: paperless/settings/__init__.py:529 msgid "Arabic" msgstr "" -#: paperless/settings/__init__.py:526 +#: paperless/settings/__init__.py:530 msgid "Afrikaans" msgstr "" -#: paperless/settings/__init__.py:527 +#: paperless/settings/__init__.py:531 msgid "Belarusian" msgstr "" -#: paperless/settings/__init__.py:528 +#: paperless/settings/__init__.py:532 msgid "Bulgarian" msgstr "" -#: paperless/settings/__init__.py:529 +#: paperless/settings/__init__.py:533 msgid "Catalan" msgstr "" -#: paperless/settings/__init__.py:530 +#: paperless/settings/__init__.py:534 msgid "Czech" msgstr "" -#: paperless/settings/__init__.py:531 +#: paperless/settings/__init__.py:535 msgid "Danish" msgstr "" -#: paperless/settings/__init__.py:532 +#: paperless/settings/__init__.py:536 msgid "German" msgstr "" -#: paperless/settings/__init__.py:533 +#: paperless/settings/__init__.py:537 msgid "Greek" msgstr "" -#: paperless/settings/__init__.py:534 +#: paperless/settings/__init__.py:538 msgid "English (GB)" msgstr "" -#: paperless/settings/__init__.py:535 +#: paperless/settings/__init__.py:539 msgid "Spanish" msgstr "" -#: paperless/settings/__init__.py:536 +#: paperless/settings/__init__.py:540 msgid "Persian" msgstr "" -#: paperless/settings/__init__.py:537 +#: paperless/settings/__init__.py:541 msgid "Finnish" msgstr "" -#: paperless/settings/__init__.py:538 +#: paperless/settings/__init__.py:542 msgid "French" msgstr "" -#: paperless/settings/__init__.py:539 +#: paperless/settings/__init__.py:543 msgid "Hungarian" msgstr "" -#: paperless/settings/__init__.py:540 +#: paperless/settings/__init__.py:544 msgid "Indonesian" msgstr "" -#: paperless/settings/__init__.py:541 +#: paperless/settings/__init__.py:545 msgid "Italian" msgstr "" -#: paperless/settings/__init__.py:542 +#: paperless/settings/__init__.py:546 msgid "Japanese" msgstr "" -#: paperless/settings/__init__.py:543 +#: paperless/settings/__init__.py:547 msgid "Korean" msgstr "" -#: paperless/settings/__init__.py:544 +#: paperless/settings/__init__.py:548 msgid "Luxembourgish" msgstr "" -#: paperless/settings/__init__.py:545 +#: paperless/settings/__init__.py:549 msgid "Norwegian" msgstr "" -#: paperless/settings/__init__.py:546 +#: paperless/settings/__init__.py:550 msgid "Dutch" msgstr "" -#: paperless/settings/__init__.py:547 +#: paperless/settings/__init__.py:551 msgid "Polish" msgstr "" -#: paperless/settings/__init__.py:548 +#: paperless/settings/__init__.py:552 msgid "Portuguese (Brazil)" msgstr "" -#: paperless/settings/__init__.py:549 +#: paperless/settings/__init__.py:553 msgid "Portuguese" msgstr "" -#: paperless/settings/__init__.py:550 +#: paperless/settings/__init__.py:554 msgid "Romanian" msgstr "" -#: paperless/settings/__init__.py:551 +#: paperless/settings/__init__.py:555 msgid "Russian" msgstr "" -#: paperless/settings/__init__.py:552 +#: paperless/settings/__init__.py:556 msgid "Slovak" msgstr "" -#: paperless/settings/__init__.py:553 +#: paperless/settings/__init__.py:557 msgid "Slovenian" msgstr "" -#: paperless/settings/__init__.py:554 +#: paperless/settings/__init__.py:558 msgid "Serbian" msgstr "" -#: paperless/settings/__init__.py:555 +#: paperless/settings/__init__.py:559 msgid "Swedish" msgstr "" -#: paperless/settings/__init__.py:556 +#: paperless/settings/__init__.py:560 msgid "Turkish" msgstr "" -#: paperless/settings/__init__.py:557 +#: paperless/settings/__init__.py:561 msgid "Ukrainian" msgstr "" -#: paperless/settings/__init__.py:558 +#: paperless/settings/__init__.py:562 msgid "Vietnamese" msgstr "" -#: paperless/settings/__init__.py:559 +#: paperless/settings/__init__.py:563 msgid "Chinese Simplified" msgstr "" -#: paperless/settings/__init__.py:560 +#: paperless/settings/__init__.py:564 msgid "Chinese Traditional" msgstr "" From e7c7978d6738e469673adc753056568ceaa70056 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 2 Apr 2026 20:24:28 -0700 Subject: [PATCH 100/113] Enhancement: allow opt-in blocking internal mail hosts (#12502) --- docs/configuration.md | 8 ++++++++ src/paperless/settings/__init__.py | 4 ++++ src/paperless_mail/mail.py | 9 +++++++++ src/paperless_mail/tests/test_mail.py | 20 ++++++++++++++++++++ src/paperless_mail/views.py | 22 +++++++++++----------- 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index fa0d32c51..7156b3553 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1440,6 +1440,14 @@ ports. ## Incoming Mail {#incoming_mail} +#### [`PAPERLESS_EMAIL_ALLOW_INTERNAL_HOSTS=`](#PAPERLESS_EMAIL_ALLOW_INTERNAL_HOSTS) {#PAPERLESS_EMAIL_ALLOW_INTERNAL_HOSTS} + +: If set to false, incoming mail account connections are blocked when the +configured IMAP hostname resolves to a non-public address (for example, +localhost, link-local, or RFC1918 private ranges). + + Defaults to true, which allows internal hosts. + ### Email OAuth {#email_oauth} #### [`PAPERLESS_OAUTH_CALLBACK_BASE_URL=`](#PAPERLESS_OAUTH_CALLBACK_BASE_URL) {#PAPERLESS_OAUTH_CALLBACK_BASE_URL} diff --git a/src/paperless/settings/__init__.py b/src/paperless/settings/__init__.py index a76c6ce75..b8a99e9fb 100644 --- a/src/paperless/settings/__init__.py +++ b/src/paperless/settings/__init__.py @@ -501,6 +501,10 @@ SESSION_COOKIE_NAME = f"{COOKIE_PREFIX}sessionid" LANGUAGE_COOKIE_NAME = f"{COOKIE_PREFIX}django_language" EMAIL_CERTIFICATE_FILE = get_path_from_env("PAPERLESS_EMAIL_CERTIFICATE_LOCATION") +EMAIL_ALLOW_INTERNAL_HOSTS = get_bool_from_env( + "PAPERLESS_EMAIL_ALLOW_INTERNAL_HOSTS", + "true", +) ############################################################################### diff --git a/src/paperless_mail/mail.py b/src/paperless_mail/mail.py index 56eaefaad..ecc785b1a 100644 --- a/src/paperless_mail/mail.py +++ b/src/paperless_mail/mail.py @@ -39,6 +39,8 @@ from documents.loggers import LoggingMixin from documents.models import Correspondent from documents.parsers import is_mime_type_supported from documents.tasks import consume_file +from paperless.network import is_public_ip +from paperless.network import resolve_hostname_ips from paperless_mail.models import MailAccount from paperless_mail.models import MailRule from paperless_mail.models import ProcessedMail @@ -412,6 +414,13 @@ def get_mailbox(server, port, security) -> MailBox: """ Returns the correct MailBox instance for the given configuration. """ + if not settings.EMAIL_ALLOW_INTERNAL_HOSTS: + for ip_str in resolve_hostname_ips(server): + if not is_public_ip(ip_str): + raise MailError( + f"Connection blocked: {server} resolves to a non-public address", + ) + ssl_context = ssl.create_default_context() if settings.EMAIL_CERTIFICATE_FILE is not None: # pragma: no cover ssl_context.load_verify_locations(cafile=settings.EMAIL_CERTIFICATE_FILE) diff --git a/src/paperless_mail/tests/test_mail.py b/src/paperless_mail/tests/test_mail.py index 72ee5331a..80a718a46 100644 --- a/src/paperless_mail/tests/test_mail.py +++ b/src/paperless_mail/tests/test_mail.py @@ -13,6 +13,7 @@ from django.contrib.auth.models import User from django.core.management import call_command from django.db import DatabaseError from django.test import TestCase +from django.test import override_settings from django.utils import timezone from imap_tools import NOT from imap_tools import EmailAddress @@ -1846,6 +1847,25 @@ class TestMailAccountTestView(APITestCase): self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.content.decode(), "Unable to connect to server") + @override_settings(EMAIL_ALLOW_INTERNAL_HOSTS=False) + @mock.patch("paperless_mail.mail.resolve_hostname_ips", return_value=["127.0.0.1"]) + def test_mail_account_test_view_blocks_internal_host_when_disabled( + self, + _mock_resolve_hostname_ips, + ) -> None: + data = { + "imap_server": "internal.example", + "imap_port": 993, + "imap_security": MailAccount.ImapSecurity.SSL, + "username": "admin", + "password": "secret", + "account_type": MailAccount.MailAccountType.IMAP, + "is_token": False, + } + response = self.client.post(self.url, data, format="json") + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertEqual(response.content.decode(), "Unable to connect to server") + @mock.patch( "paperless_mail.oauth.PaperlessMailOAuth2Manager.refresh_account_oauth_token", ) diff --git a/src/paperless_mail/views.py b/src/paperless_mail/views.py index 2593797f3..9e3850cfc 100644 --- a/src/paperless_mail/views.py +++ b/src/paperless_mail/views.py @@ -120,12 +120,12 @@ class MailAccountViewSet(ModelViewSet, PassUserMixin): serializer.validated_data["expiration"] = existing_account.expiration account = MailAccount(**serializer.validated_data) - with get_mailbox( - account.imap_server, - account.imap_port, - account.imap_security, - ) as M: - try: + try: + with get_mailbox( + account.imap_server, + account.imap_port, + account.imap_security, + ) as M: if ( existing_account is not None and account.is_token @@ -145,11 +145,11 @@ class MailAccountViewSet(ModelViewSet, PassUserMixin): mailbox_login(M, account) return Response({"success": True}) - except MailError: - logger.error( - "Mail account connectivity test failed", - ) - return HttpResponseBadRequest("Unable to connect to server") + except MailError: + logger.error( + "Mail account connectivity test failed", + ) + return HttpResponseBadRequest("Unable to connect to server") @action(methods=["post"], detail=True) def process(self, request, pk=None): From 2703c12f1add4f50da196ca2478ed857b6b61dce Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 03:25:57 +0000 Subject: [PATCH 101/113] Auto translate strings --- src/locale/en_US/LC_MESSAGES/django.po | 76 +++++++++++++------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index eba121b5b..57ade319a 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-02 22:35+0000\n" +"POT-Creation-Date: 2026-04-03 03:25+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -1866,151 +1866,151 @@ msgstr "" msgid "paperless application settings" msgstr "" -#: paperless/settings/__init__.py:528 +#: paperless/settings/__init__.py:532 msgid "English (US)" msgstr "" -#: paperless/settings/__init__.py:529 +#: paperless/settings/__init__.py:533 msgid "Arabic" msgstr "" -#: paperless/settings/__init__.py:530 +#: paperless/settings/__init__.py:534 msgid "Afrikaans" msgstr "" -#: paperless/settings/__init__.py:531 +#: paperless/settings/__init__.py:535 msgid "Belarusian" msgstr "" -#: paperless/settings/__init__.py:532 +#: paperless/settings/__init__.py:536 msgid "Bulgarian" msgstr "" -#: paperless/settings/__init__.py:533 +#: paperless/settings/__init__.py:537 msgid "Catalan" msgstr "" -#: paperless/settings/__init__.py:534 +#: paperless/settings/__init__.py:538 msgid "Czech" msgstr "" -#: paperless/settings/__init__.py:535 +#: paperless/settings/__init__.py:539 msgid "Danish" msgstr "" -#: paperless/settings/__init__.py:536 +#: paperless/settings/__init__.py:540 msgid "German" msgstr "" -#: paperless/settings/__init__.py:537 +#: paperless/settings/__init__.py:541 msgid "Greek" msgstr "" -#: paperless/settings/__init__.py:538 +#: paperless/settings/__init__.py:542 msgid "English (GB)" msgstr "" -#: paperless/settings/__init__.py:539 +#: paperless/settings/__init__.py:543 msgid "Spanish" msgstr "" -#: paperless/settings/__init__.py:540 +#: paperless/settings/__init__.py:544 msgid "Persian" msgstr "" -#: paperless/settings/__init__.py:541 +#: paperless/settings/__init__.py:545 msgid "Finnish" msgstr "" -#: paperless/settings/__init__.py:542 +#: paperless/settings/__init__.py:546 msgid "French" msgstr "" -#: paperless/settings/__init__.py:543 +#: paperless/settings/__init__.py:547 msgid "Hungarian" msgstr "" -#: paperless/settings/__init__.py:544 +#: paperless/settings/__init__.py:548 msgid "Indonesian" msgstr "" -#: paperless/settings/__init__.py:545 +#: paperless/settings/__init__.py:549 msgid "Italian" msgstr "" -#: paperless/settings/__init__.py:546 +#: paperless/settings/__init__.py:550 msgid "Japanese" msgstr "" -#: paperless/settings/__init__.py:547 +#: paperless/settings/__init__.py:551 msgid "Korean" msgstr "" -#: paperless/settings/__init__.py:548 +#: paperless/settings/__init__.py:552 msgid "Luxembourgish" msgstr "" -#: paperless/settings/__init__.py:549 +#: paperless/settings/__init__.py:553 msgid "Norwegian" msgstr "" -#: paperless/settings/__init__.py:550 +#: paperless/settings/__init__.py:554 msgid "Dutch" msgstr "" -#: paperless/settings/__init__.py:551 +#: paperless/settings/__init__.py:555 msgid "Polish" msgstr "" -#: paperless/settings/__init__.py:552 +#: paperless/settings/__init__.py:556 msgid "Portuguese (Brazil)" msgstr "" -#: paperless/settings/__init__.py:553 +#: paperless/settings/__init__.py:557 msgid "Portuguese" msgstr "" -#: paperless/settings/__init__.py:554 +#: paperless/settings/__init__.py:558 msgid "Romanian" msgstr "" -#: paperless/settings/__init__.py:555 +#: paperless/settings/__init__.py:559 msgid "Russian" msgstr "" -#: paperless/settings/__init__.py:556 +#: paperless/settings/__init__.py:560 msgid "Slovak" msgstr "" -#: paperless/settings/__init__.py:557 +#: paperless/settings/__init__.py:561 msgid "Slovenian" msgstr "" -#: paperless/settings/__init__.py:558 +#: paperless/settings/__init__.py:562 msgid "Serbian" msgstr "" -#: paperless/settings/__init__.py:559 +#: paperless/settings/__init__.py:563 msgid "Swedish" msgstr "" -#: paperless/settings/__init__.py:560 +#: paperless/settings/__init__.py:564 msgid "Turkish" msgstr "" -#: paperless/settings/__init__.py:561 +#: paperless/settings/__init__.py:565 msgid "Ukrainian" msgstr "" -#: paperless/settings/__init__.py:562 +#: paperless/settings/__init__.py:566 msgid "Vietnamese" msgstr "" -#: paperless/settings/__init__.py:563 +#: paperless/settings/__init__.py:567 msgid "Chinese Simplified" msgstr "" -#: paperless/settings/__init__.py:564 +#: paperless/settings/__init__.py:568 msgid "Chinese Traditional" msgstr "" From d365f199627108a3d227e1585298121e8f6a8915 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Thu, 2 Apr 2026 20:49:54 -0700 Subject: [PATCH 102/113] Security: Registers a custom serializer which signs the task payload (#12504) --- src/paperless/celery.py | 48 +++++++++++++++++++++ src/paperless/settings/__init__.py | 6 ++- src/paperless/tests/test_celery.py | 69 ++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 src/paperless/tests/test_celery.py diff --git a/src/paperless/celery.py b/src/paperless/celery.py index d937b3ada..3797c840c 100644 --- a/src/paperless/celery.py +++ b/src/paperless/celery.py @@ -1,11 +1,59 @@ +import hmac import os +import pickle +from hashlib import sha256 from celery import Celery from celery.signals import worker_process_init +from kombu.serialization import register # Set the default Django settings module for the 'celery' program. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "paperless.settings") +# --------------------------------------------------------------------------- +# Signed-pickle serializer: pickle with HMAC-SHA256 integrity verification. +# +# Protects against malicious pickle injection via an exposed Redis broker. +# Messages are signed on the producer side and verified before deserialization +# on the worker side using Django's SECRET_KEY. +# --------------------------------------------------------------------------- + +HMAC_SIZE = 32 # SHA-256 digest length + + +def _get_signing_key() -> bytes: + from django.conf import settings + + return settings.SECRET_KEY.encode() + + +def signed_pickle_dumps(obj: object) -> bytes: + data = pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL) + signature = hmac.new(_get_signing_key(), data, sha256).digest() + return signature + data + + +def signed_pickle_loads(payload: bytes) -> object: + if len(payload) < HMAC_SIZE: + msg = "Signed-pickle payload too short" + raise ValueError(msg) + signature = payload[:HMAC_SIZE] + data = payload[HMAC_SIZE:] + expected = hmac.new(_get_signing_key(), data, sha256).digest() + if not hmac.compare_digest(signature, expected): + msg = "Signed-pickle HMAC verification failed — message may have been tampered with" + raise ValueError(msg) + return pickle.loads(data) + + +register( + "signed-pickle", + signed_pickle_dumps, + signed_pickle_loads, + content_type="application/x-signed-pickle", + content_encoding="binary", +) + app = Celery("paperless") # Using a string here means the worker doesn't have to serialize diff --git a/src/paperless/settings/__init__.py b/src/paperless/settings/__init__.py index b8a99e9fb..964295020 100644 --- a/src/paperless/settings/__init__.py +++ b/src/paperless/settings/__init__.py @@ -675,9 +675,11 @@ CELERY_RESULT_BACKEND = "django-db" CELERY_CACHE_BACKEND = "default" # https://docs.celeryq.dev/en/stable/userguide/configuration.html#task-serializer -CELERY_TASK_SERIALIZER = "pickle" +# Uses HMAC-signed pickle to prevent RCE via malicious messages on an exposed Redis broker. +# The signed-pickle serializer is registered in paperless/celery.py. +CELERY_TASK_SERIALIZER = "signed-pickle" # https://docs.celeryq.dev/en/stable/userguide/configuration.html#std-setting-accept_content -CELERY_ACCEPT_CONTENT = ["application/json", "application/x-python-serialize"] +CELERY_ACCEPT_CONTENT = ["application/json", "application/x-signed-pickle"] # https://docs.celeryq.dev/en/stable/userguide/configuration.html#beat-schedule CELERY_BEAT_SCHEDULE = parse_beat_schedule() diff --git a/src/paperless/tests/test_celery.py b/src/paperless/tests/test_celery.py new file mode 100644 index 000000000..0c0e51272 --- /dev/null +++ b/src/paperless/tests/test_celery.py @@ -0,0 +1,69 @@ +import hmac +import pickle +from hashlib import sha256 + +import pytest +from django.test import override_settings + +from paperless.celery import HMAC_SIZE +from paperless.celery import signed_pickle_dumps +from paperless.celery import signed_pickle_loads + + +class TestSignedPickleSerializer: + def test_roundtrip_simple_types(self): + """Signed pickle can round-trip basic JSON-like types.""" + for obj in [42, "hello", [1, 2, 3], {"key": "value"}, None, True]: + assert signed_pickle_loads(signed_pickle_dumps(obj)) == obj + + def test_roundtrip_complex_types(self): + """Signed pickle can round-trip types that JSON cannot.""" + from pathlib import Path + + obj = {"path": Path("/tmp/test"), "data": {1, 2, 3}} + result = signed_pickle_loads(signed_pickle_dumps(obj)) + assert result["path"] == Path("/tmp/test") + assert result["data"] == {1, 2, 3} + + def test_tampered_data_rejected(self): + """Flipping a byte in the data portion causes HMAC failure.""" + payload = signed_pickle_dumps({"task": "test"}) + tampered = bytearray(payload) + tampered[-1] ^= 0xFF + with pytest.raises(ValueError, match="HMAC verification failed"): + signed_pickle_loads(bytes(tampered)) + + def test_tampered_signature_rejected(self): + """Flipping a byte in the signature portion causes HMAC failure.""" + payload = signed_pickle_dumps({"task": "test"}) + tampered = bytearray(payload) + tampered[0] ^= 0xFF + with pytest.raises(ValueError, match="HMAC verification failed"): + signed_pickle_loads(bytes(tampered)) + + def test_truncated_payload_rejected(self): + """A payload shorter than HMAC_SIZE is rejected.""" + with pytest.raises(ValueError, match="too short"): + signed_pickle_loads(b"\x00" * (HMAC_SIZE - 1)) + + def test_empty_payload_rejected(self): + with pytest.raises(ValueError, match="too short"): + signed_pickle_loads(b"") + + @override_settings(SECRET_KEY="different-secret-key") + def test_wrong_secret_key_rejected(self): + """A message signed with one key cannot be loaded with another.""" + original_key = b"test-secret-key-do-not-use-in-production" + obj = {"task": "test"} + data = pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL) + signature = hmac.new(original_key, data, sha256).digest() + payload = signature + data + with pytest.raises(ValueError, match="HMAC verification failed"): + signed_pickle_loads(payload) + + def test_forged_pickle_rejected(self): + """A raw pickle payload (no signature) is rejected.""" + raw_pickle = pickle.dumps({"task": "test"}) + # Raw pickle won't have a valid HMAC prefix + with pytest.raises(ValueError, match="HMAC verification failed"): + signed_pickle_loads(b"\x00" * HMAC_SIZE + raw_pickle) From 8c539bd862da3a13089c36e0bb91f9d950532e5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 13:25:17 +0000 Subject: [PATCH 103/113] Chore(deps): Bump the utilities-patch group across 1 directory with 5 updates (#12499) Bumps the utilities-patch group with 5 updates in the / directory: | Package | From | To | | --- | --- | --- | | [llama-index-core](https://github.com/run-llama/llama_index) | `0.14.16` | `0.14.19` | | [nltk](https://github.com/nltk/nltk) | `3.9.3` | `3.9.4` | | [zensical](https://github.com/zensical/zensical) | `0.0.26` | `0.0.29` | | [prek](https://github.com/j178/prek) | `0.3.5` | `0.3.8` | | [ruff](https://github.com/astral-sh/ruff) | `0.15.5` | `0.15.7` | Updates `llama-index-core` from 0.14.16 to 0.14.19 - [Release notes](https://github.com/run-llama/llama_index/releases) - [Changelog](https://github.com/run-llama/llama_index/blob/main/CHANGELOG.md) - [Commits](https://github.com/run-llama/llama_index/compare/v0.14.16...v0.14.19) Updates `nltk` from 3.9.3 to 3.9.4 - [Changelog](https://github.com/nltk/nltk/blob/develop/ChangeLog) - [Commits](https://github.com/nltk/nltk/compare/3.9.3...3.9.4) Updates `zensical` from 0.0.26 to 0.0.29 - [Release notes](https://github.com/zensical/zensical/releases) - [Commits](https://github.com/zensical/zensical/compare/v0.0.26...v0.0.29) Updates `prek` from 0.3.5 to 0.3.8 - [Release notes](https://github.com/j178/prek/releases) - [Changelog](https://github.com/j178/prek/blob/master/CHANGELOG.md) - [Commits](https://github.com/j178/prek/compare/v0.3.5...v0.3.8) Updates `ruff` from 0.15.5 to 0.15.7 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.15.5...0.15.7) --- updated-dependencies: - dependency-name: llama-index-core dependency-version: 0.14.19 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: utilities-patch - dependency-name: nltk dependency-version: 3.9.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: utilities-patch - dependency-name: zensical dependency-version: 0.0.29 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: utilities-patch - dependency-name: prek dependency-version: 0.3.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: utilities-patch - dependency-name: ruff dependency-version: 0.15.7 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: utilities-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 98 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/uv.lock b/uv.lock index feffefce5..4cfd329f4 100644 --- a/uv.lock +++ b/uv.lock @@ -2139,7 +2139,7 @@ wheels = [ [[package]] name = "llama-index-core" -version = "0.14.16" +version = "0.14.19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2171,9 +2171,9 @@ dependencies = [ { name = "typing-inspect", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "wrapt", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/13/cb/1d7383f9f4520bb1d921c34f18c147b4b270007135212cedfa240edcd4c3/llama_index_core-0.14.16.tar.gz", hash = "sha256:cf2b7e4b798cb5ebad19c935174c200595c7ecff84a83793540cc27b03636a52", size = 11599715, upload-time = "2026-03-10T19:19:52.476Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/eb/a661cc2f70177f59cfe7bfcdb7a4e9352fb073ab46927068151bf2905fbb/llama_index_core-0.14.19.tar.gz", hash = "sha256:7b17f321f0d965495402890991b2bfde49d4197bc46ca5970300cc7b9c2df6a2", size = 11599592, upload-time = "2026-03-25T20:58:25.751Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/f5/a33839bae0bd07e4030969bdba1ac90665e359ae88c56c296991ae16b8a8/llama_index_core-0.14.16-py3-none-any.whl", hash = "sha256:0cc273ebc44d51ad636217661a25f9cd02fb2d0440641430f105da3ae9f43a6b", size = 11944927, upload-time = "2026-03-10T19:19:48.043Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b6/6c2678b8597903503b804fe831a203d299bcbcc07bdf35789a484e67f7c0/llama_index_core-0.14.19-py3-none-any.whl", hash = "sha256:807352f16a300f9980d0110cfdaa81d07e201384965e9f7d940c8ead80d463ed", size = 11945679, upload-time = "2026-03-25T20:58:28.265Z" }, ] [[package]] @@ -2691,7 +2691,7 @@ wheels = [ [[package]] name = "nltk" -version = "3.9.3" +version = "3.9.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2699,9 +2699,9 @@ dependencies = [ { name = "regex", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/8f/915e1c12df07c70ed779d18ab83d065718a926e70d3ea33eb0cd66ffb7c0/nltk-3.9.3.tar.gz", hash = "sha256:cb5945d6424a98d694c2b9a0264519fab4363711065a46aa0ae7a2195b92e71f", size = 2923673, upload-time = "2026-02-24T12:05:53.833Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/a1/b3b4adf15585a5bc4c357adde150c01ebeeb642173ded4d871e89468767c/nltk-3.9.4.tar.gz", hash = "sha256:ed03bc098a40481310320808b2db712d95d13ca65b27372f8a403949c8b523d0", size = 2946864, upload-time = "2026-03-24T06:13:40.641Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/7e/9af5a710a1236e4772de8dfcc6af942a561327bb9f42b5b4a24d0cf100fd/nltk-3.9.3-py3-none-any.whl", hash = "sha256:60b3db6e9995b3dd976b1f0fa7dec22069b2677e759c28eb69b62ddd44870522", size = 1525385, upload-time = "2026-02-24T12:05:46.54Z" }, + { url = "https://files.pythonhosted.org/packages/9d/91/04e965f8e717ba0ab4bdca5c112deeab11c9e750d94c4d4602f050295d39/nltk-3.9.4-py3-none-any.whl", hash = "sha256:f2fa301c3a12718ce4a0e9305c5675299da5ad9e26068218b69d692fda84828f", size = 1552087, upload-time = "2026-03-24T06:13:38.47Z" }, ] [[package]] @@ -3346,23 +3346,23 @@ wheels = [ [[package]] name = "prek" -version = "0.3.5" +version = "0.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/d6/277e002e56eeab3a9d48f1ca4cc067d249d6326fc1783b770d70ad5ae2be/prek-0.3.5.tar.gz", hash = "sha256:ca40b6685a4192256bc807f32237af94bf9b8799c0d708b98735738250685642", size = 374806, upload-time = "2026-03-09T10:35:18.842Z" } +sdist = { url = "https://files.pythonhosted.org/packages/62/ee/03e8180e3fda9de25b6480bd15cc2bde40d573868d50648b0e527b35562f/prek-0.3.8.tar.gz", hash = "sha256:434a214256516f187a3ab15f869d950243be66b94ad47987ee4281b69643a2d9", size = 400224, upload-time = "2026-03-23T08:23:35.981Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/a9/16dd8d3a50362ebccffe58518af1f1f571c96f0695d7fcd8bbd386585f58/prek-0.3.5-py3-none-linux_armv6l.whl", hash = "sha256:44b3e12791805804f286d103682b42a84e0f98a2687faa37045e9d3375d3d73d", size = 5105604, upload-time = "2026-03-09T10:35:00.332Z" }, - { url = "https://files.pythonhosted.org/packages/e4/74/bc6036f5bf03860cda66ab040b32737e54802b71a81ec381839deb25df9e/prek-0.3.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3cb451cc51ac068974557491beb4c7d2d41dfde29ed559c1694c8ce23bf53e8", size = 5506155, upload-time = "2026-03-09T10:35:17.64Z" }, - { url = "https://files.pythonhosted.org/packages/02/d9/a3745c2a10509c63b6a118ada766614dd705efefd08f275804d5c807aa4a/prek-0.3.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ad8f5f0d8da53dc94d00b76979af312b3dacccc9dcbc6417756c5dca3633c052", size = 5100383, upload-time = "2026-03-09T10:35:13.302Z" }, - { url = "https://files.pythonhosted.org/packages/43/8e/de965fc515d39309a332789cd3778161f7bc80cde15070bedf17f9f8cb93/prek-0.3.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:4511e15d34072851ac88e4b2006868fbe13655059ad941d7a0ff9ee17138fd9f", size = 5334913, upload-time = "2026-03-09T10:35:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8c/44f07e8940256059cfd82520e3cbe0764ab06ddb4aa43148465db00b39ad/prek-0.3.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcc0b63b8337e2046f51267facaac63ba755bc14aad53991840a5eccba3e5c28", size = 5033825, upload-time = "2026-03-09T10:35:06.976Z" }, - { url = "https://files.pythonhosted.org/packages/94/85/3ff0f96881ff2360c212d310ff23c3cf5a15b223d34fcfa8cdcef203be69/prek-0.3.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5fc0d78c3896a674aeb8247a83bbda7efec85274dbdfbc978ceff8d37e4ed20", size = 5438586, upload-time = "2026-03-09T10:34:58.779Z" }, - { url = "https://files.pythonhosted.org/packages/79/a5/c6d08d31293400fcb5d427f8e7e6bacfc959988e868ad3a9d97b4d87c4b7/prek-0.3.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64cad21cb9072d985179495b77b312f6b81e7b45357d0c68dc1de66e0408eabc", size = 6359714, upload-time = "2026-03-09T10:34:57.454Z" }, - { url = "https://files.pythonhosted.org/packages/ba/18/321dcff9ece8065d42c8c1c7a53a23b45d2b4330aa70993be75dc5f2822f/prek-0.3.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45ee84199bb48e013bdfde0c84352c17a44cc42d5792681b86d94e9474aab6f8", size = 5717632, upload-time = "2026-03-09T10:35:08.634Z" }, - { url = "https://files.pythonhosted.org/packages/a3/7f/1288226aa381d0cea403157f4e6b64b356e1a745f2441c31dd9d8a1d63da/prek-0.3.5-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:f43275e5d564e18e52133129ebeb5cb071af7ce4a547766c7f025aa0955dfbb6", size = 5339040, upload-time = "2026-03-09T10:35:03.665Z" }, - { url = "https://files.pythonhosted.org/packages/22/94/cfec83df9c2b8e7ed1608087bcf9538a6a77b4c2e7365123e9e0a3162cd1/prek-0.3.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:abcee520d31522bcbad9311f21326b447694cd5edba33618c25fd023fc9865ec", size = 5162586, upload-time = "2026-03-09T10:35:11.564Z" }, - { url = "https://files.pythonhosted.org/packages/13/b7/741d62132f37a5f7cc0fad1168bd31f20dea9628f482f077f569547e0436/prek-0.3.5-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:499c56a94a155790c75a973d351a33f8065579d9094c93f6d451ada5d1e469be", size = 5002933, upload-time = "2026-03-09T10:35:16.347Z" }, - { url = "https://files.pythonhosted.org/packages/6f/83/630a5671df6550fcfa67c54955e8a8174eb9b4d97ac38fb05a362029245b/prek-0.3.5-py3-none-musllinux_1_1_i686.whl", hash = "sha256:de1065b59f194624adc9dea269d4ff6b50e98a1b5bb662374a9adaa496b3c1eb", size = 5304934, upload-time = "2026-03-09T10:35:09.975Z" }, - { url = "https://files.pythonhosted.org/packages/de/79/67a7afd0c0b6c436630b7dba6e586a42d21d5d6e5778fbd9eba7bbd3dd26/prek-0.3.5-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:a1c4869e45ee341735d07179da3a79fa2afb5959cef8b3c8a71906eb52dc6933", size = 5829914, upload-time = "2026-03-09T10:35:05.39Z" }, + { url = "https://files.pythonhosted.org/packages/00/84/40d2ddf362d12c4cd4a25a8c89a862edf87cdfbf1422aa41aac8e315d409/prek-0.3.8-py3-none-linux_armv6l.whl", hash = "sha256:6fb646ada60658fa6dd7771b2e0fb097f005151be222f869dada3eb26d79ed33", size = 5226646, upload-time = "2026-03-23T08:23:18.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/52/7308a033fa43b7e8e188797bd2b3b017c0f0adda70fa7af575b1f43ea888/prek-0.3.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f3d7fdadb15efc19c09953c7a33cf2061a70f367d1e1957358d3ad5cc49d0616", size = 5620104, upload-time = "2026-03-23T08:23:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b1/f106ac000a91511a9cd80169868daf2f5b693480ef5232cec5517a38a512/prek-0.3.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:72728c3295e79ca443f8c1ec037d2a5b914ec73a358f69cf1bc1964511876bf8", size = 5199867, upload-time = "2026-03-23T08:23:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e9/970713f4b019f69de9844e1bab37b8ddb67558e410916f4eb5869a696165/prek-0.3.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:48efc28f2f53b5b8087efca9daaed91572d62df97d5f24a1c7a087fecb5017de", size = 5441801, upload-time = "2026-03-23T08:23:32.617Z" }, + { url = "https://files.pythonhosted.org/packages/12/a4/7ef44032b181753e19452ec3b09abb3a32607cf6b0a0508f0604becaaf2b/prek-0.3.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6ca9d63bacbc448a5c18e955c78d3ac5176c3a17c3baacdd949b1a623e08a36", size = 5155107, upload-time = "2026-03-23T08:23:31.021Z" }, + { url = "https://files.pythonhosted.org/packages/bd/77/4d9c8985dbba84149760785dfe07093ea1e29d710257dfb7c89615e2234c/prek-0.3.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1000f7029696b4fe712fb1fefd4c55b9c4de72b65509c8e50296370a06f9dc3f", size = 5566541, upload-time = "2026-03-23T08:23:45.694Z" }, + { url = "https://files.pythonhosted.org/packages/1a/1a/81e6769ac1f7f8346d09ce2ab0b47cf06466acd9ff72e87e5d1f0d98cd32/prek-0.3.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ff0bed0e2c1286522987d982168a86cbbd0d069d840506a46c9fda983515517", size = 6552991, upload-time = "2026-03-23T08:23:21.958Z" }, + { url = "https://files.pythonhosted.org/packages/6f/fa/ce2df0dd2dc75a9437a52463239d0782998943d7b04e191fb89b83016c34/prek-0.3.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fb087ac0ffda3ac65bbbae9a38326a7fd27ee007bb4a94323ce1eb539d8bbec", size = 5832972, upload-time = "2026-03-23T08:23:20.258Z" }, + { url = "https://files.pythonhosted.org/packages/18/6b/9d4269df9073216d296244595a21c253b6475dfc9076c0bd2906be7a436c/prek-0.3.8-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:2e1e5e206ff7b31bd079cce525daddc96cd6bc544d20dc128921ad92f7a4c85d", size = 5448371, upload-time = "2026-03-23T08:23:41.835Z" }, + { url = "https://files.pythonhosted.org/packages/60/1d/1e4d8a78abefa5b9d086e5a9f1638a74b5e540eec8a648d9946707701f29/prek-0.3.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:dcea3fe23832a4481bccb7c45f55650cb233be7c805602e788bb7dba60f2d861", size = 5270546, upload-time = "2026-03-23T08:23:24.231Z" }, + { url = "https://files.pythonhosted.org/packages/77/07/34f36551a6319ae36e272bea63a42f59d41d2d47ab0d5fb00eb7b4e88e87/prek-0.3.8-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:4d25e647e9682f6818ab5c31e7a4b842993c14782a6ffcd128d22b784e0d677f", size = 5124032, upload-time = "2026-03-23T08:23:26.368Z" }, + { url = "https://files.pythonhosted.org/packages/e3/01/6d544009bb655e709993411796af77339f439526db4f3b3509c583ad8eb9/prek-0.3.8-py3-none-musllinux_1_1_i686.whl", hash = "sha256:de528b82935e33074815acff3c7c86026754d1212136295bc88fe9c43b4231d5", size = 5432245, upload-time = "2026-03-23T08:23:47.877Z" }, + { url = "https://files.pythonhosted.org/packages/54/96/1237ee269e9bfa283ffadbcba1f401f48a47aed2b2563eb1002740d6079d/prek-0.3.8-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:6d660f1c25a126e6d9f682fe61449441226514f412a4469f5d71f8f8cad56db2", size = 5950550, upload-time = "2026-03-23T08:23:43.8Z" }, ] [[package]] @@ -4326,24 +4326,24 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.5" +version = "0.15.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/77/9b/840e0039e65fcf12758adf684d2289024d6140cde9268cc59887dc55189c/ruff-0.15.5.tar.gz", hash = "sha256:7c3601d3b6d76dce18c5c824fc8d06f4eef33d6df0c21ec7799510cde0f159a2", size = 4574214, upload-time = "2026-03-05T20:06:34.946Z" } +sdist = { url = "https://files.pythonhosted.org/packages/14/b0/73cf7550861e2b4824950b8b52eebdcc5adc792a00c514406556c5b80817/ruff-0.15.8.tar.gz", hash = "sha256:995f11f63597ee362130d1d5a327a87cb6f3f5eae3094c620bcc632329a4d26e", size = 4610921, upload-time = "2026-03-26T18:39:38.675Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/20/5369c3ce21588c708bcbe517a8fbe1a8dfdb5dfd5137e14790b1da71612c/ruff-0.15.5-py3-none-linux_armv6l.whl", hash = "sha256:4ae44c42281f42e3b06b988e442d344a5b9b72450ff3c892e30d11b29a96a57c", size = 10478185, upload-time = "2026-03-05T20:06:29.093Z" }, - { url = "https://files.pythonhosted.org/packages/44/ed/e81dd668547da281e5dce710cf0bc60193f8d3d43833e8241d006720e42b/ruff-0.15.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6edd3792d408ebcf61adabc01822da687579a1a023f297618ac27a5b51ef0080", size = 10859201, upload-time = "2026-03-05T20:06:32.632Z" }, - { url = "https://files.pythonhosted.org/packages/c4/8f/533075f00aaf19b07c5cd6aa6e5d89424b06b3b3f4583bfa9c640a079059/ruff-0.15.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:89f463f7c8205a9f8dea9d658d59eff49db05f88f89cc3047fb1a02d9f344010", size = 10184752, upload-time = "2026-03-05T20:06:40.312Z" }, - { url = "https://files.pythonhosted.org/packages/66/0e/ba49e2c3fa0395b3152bad634c7432f7edfc509c133b8f4529053ff024fb/ruff-0.15.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba786a8295c6574c1116704cf0b9e6563de3432ac888d8f83685654fe528fd65", size = 10534857, upload-time = "2026-03-05T20:06:19.581Z" }, - { url = "https://files.pythonhosted.org/packages/59/71/39234440f27a226475a0659561adb0d784b4d247dfe7f43ffc12dd02e288/ruff-0.15.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd4b801e57955fe9f02b31d20375ab3a5c4415f2e5105b79fb94cf2642c91440", size = 10309120, upload-time = "2026-03-05T20:06:00.435Z" }, - { url = "https://files.pythonhosted.org/packages/f5/87/4140aa86a93df032156982b726f4952aaec4a883bb98cb6ef73c347da253/ruff-0.15.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391f7c73388f3d8c11b794dbbc2959a5b5afe66642c142a6effa90b45f6f5204", size = 11047428, upload-time = "2026-03-05T20:05:51.867Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f7/4953e7e3287676f78fbe85e3a0ca414c5ca81237b7575bdadc00229ac240/ruff-0.15.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc18f30302e379fe1e998548b0f5e9f4dff907f52f73ad6da419ea9c19d66c8", size = 11914251, upload-time = "2026-03-05T20:06:22.887Z" }, - { url = "https://files.pythonhosted.org/packages/77/46/0f7c865c10cf896ccf5a939c3e84e1cfaeed608ff5249584799a74d33835/ruff-0.15.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc6e7f90087e2d27f98dc34ed1b3ab7c8f0d273cc5431415454e22c0bd2a681", size = 11333801, upload-time = "2026-03-05T20:05:57.168Z" }, - { url = "https://files.pythonhosted.org/packages/d3/01/a10fe54b653061585e655f5286c2662ebddb68831ed3eaebfb0eb08c0a16/ruff-0.15.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cb7169f53c1ddb06e71a9aebd7e98fc0fea936b39afb36d8e86d36ecc2636a", size = 11206821, upload-time = "2026-03-05T20:06:03.441Z" }, - { url = "https://files.pythonhosted.org/packages/7a/0d/2132ceaf20c5e8699aa83da2706ecb5c5dcdf78b453f77edca7fb70f8a93/ruff-0.15.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9b037924500a31ee17389b5c8c4d88874cc6ea8e42f12e9c61a3d754ff72f1ca", size = 11133326, upload-time = "2026-03-05T20:06:25.655Z" }, - { url = "https://files.pythonhosted.org/packages/72/cb/2e5259a7eb2a0f87c08c0fe5bf5825a1e4b90883a52685524596bfc93072/ruff-0.15.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65bb414e5b4eadd95a8c1e4804f6772bbe8995889f203a01f77ddf2d790929dd", size = 10510820, upload-time = "2026-03-05T20:06:37.79Z" }, - { url = "https://files.pythonhosted.org/packages/ff/20/b67ce78f9e6c59ffbdb5b4503d0090e749b5f2d31b599b554698a80d861c/ruff-0.15.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d20aa469ae3b57033519c559e9bc9cd9e782842e39be05b50e852c7c981fa01d", size = 10302395, upload-time = "2026-03-05T20:05:54.504Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e5/719f1acccd31b720d477751558ed74e9c88134adcc377e5e886af89d3072/ruff-0.15.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:15388dd28c9161cdb8eda68993533acc870aa4e646a0a277aa166de9ad5a8752", size = 10754069, upload-time = "2026-03-05T20:06:06.422Z" }, - { url = "https://files.pythonhosted.org/packages/c3/9c/d1db14469e32d98f3ca27079dbd30b7b44dbb5317d06ab36718dee3baf03/ruff-0.15.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b30da330cbd03bed0c21420b6b953158f60c74c54c5f4c1dabbdf3a57bf355d2", size = 11304315, upload-time = "2026-03-05T20:06:10.867Z" }, + { url = "https://files.pythonhosted.org/packages/4a/92/c445b0cd6da6e7ae51e954939cb69f97e008dbe750cfca89b8cedc081be7/ruff-0.15.8-py3-none-linux_armv6l.whl", hash = "sha256:cbe05adeba76d58162762d6b239c9056f1a15a55bd4b346cfd21e26cd6ad7bc7", size = 10527394, upload-time = "2026-03-26T18:39:41.566Z" }, + { url = "https://files.pythonhosted.org/packages/eb/92/f1c662784d149ad1414cae450b082cf736430c12ca78367f20f5ed569d65/ruff-0.15.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d3e3d0b6ba8dca1b7ef9ab80a28e840a20070c4b62e56d675c24f366ef330570", size = 10905693, upload-time = "2026-03-26T18:39:30.364Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f2/7a631a8af6d88bcef997eb1bf87cc3da158294c57044aafd3e17030613de/ruff-0.15.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ee3ae5c65a42f273f126686353f2e08ff29927b7b7e203b711514370d500de3", size = 10323044, upload-time = "2026-03-26T18:39:33.37Z" }, + { url = "https://files.pythonhosted.org/packages/67/18/1bf38e20914a05e72ef3b9569b1d5c70a7ef26cd188d69e9ca8ef588d5bf/ruff-0.15.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdce027ada77baa448077ccc6ebb2fa9c3c62fd110d8659d601cf2f475858d94", size = 10629135, upload-time = "2026-03-26T18:39:44.142Z" }, + { url = "https://files.pythonhosted.org/packages/d2/e9/138c150ff9af60556121623d41aba18b7b57d95ac032e177b6a53789d279/ruff-0.15.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12e617fc01a95e5821648a6df341d80456bd627bfab8a829f7cfc26a14a4b4a3", size = 10348041, upload-time = "2026-03-26T18:39:52.178Z" }, + { url = "https://files.pythonhosted.org/packages/02/f1/5bfb9298d9c323f842c5ddeb85f1f10ef51516ac7a34ba446c9347d898df/ruff-0.15.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:432701303b26416d22ba696c39f2c6f12499b89093b61360abc34bcc9bf07762", size = 11121987, upload-time = "2026-03-26T18:39:55.195Z" }, + { url = "https://files.pythonhosted.org/packages/10/11/6da2e538704e753c04e8d86b1fc55712fdbdcc266af1a1ece7a51fff0d10/ruff-0.15.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d910ae974b7a06a33a057cb87d2a10792a3b2b3b35e33d2699fdf63ec8f6b17a", size = 11951057, upload-time = "2026-03-26T18:39:19.18Z" }, + { url = "https://files.pythonhosted.org/packages/83/f0/c9208c5fd5101bf87002fed774ff25a96eea313d305f1e5d5744698dc314/ruff-0.15.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2033f963c43949d51e6fdccd3946633c6b37c484f5f98c3035f49c27395a8ab8", size = 11464613, upload-time = "2026-03-26T18:40:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/22/d7f2fabdba4fae9f3b570e5605d5eb4500dcb7b770d3217dca4428484b17/ruff-0.15.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f29b989a55572fb885b77464cf24af05500806ab4edf9a0fd8977f9759d85b1", size = 11257557, upload-time = "2026-03-26T18:39:57.972Z" }, + { url = "https://files.pythonhosted.org/packages/71/8c/382a9620038cf6906446b23ce8632ab8c0811b8f9d3e764f58bedd0c9a6f/ruff-0.15.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:ac51d486bf457cdc985a412fb1801b2dfd1bd8838372fc55de64b1510eff4bec", size = 11169440, upload-time = "2026-03-26T18:39:22.205Z" }, + { url = "https://files.pythonhosted.org/packages/4d/0d/0994c802a7eaaf99380085e4e40c845f8e32a562e20a38ec06174b52ef24/ruff-0.15.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c9861eb959edab053c10ad62c278835ee69ca527b6dcd72b47d5c1e5648964f6", size = 10605963, upload-time = "2026-03-26T18:39:46.682Z" }, + { url = "https://files.pythonhosted.org/packages/19/aa/d624b86f5b0aad7cef6bbf9cd47a6a02dfdc4f72c92a337d724e39c9d14b/ruff-0.15.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8d9a5b8ea13f26ae90838afc33f91b547e61b794865374f114f349e9036835fb", size = 10357484, upload-time = "2026-03-26T18:39:49.176Z" }, + { url = "https://files.pythonhosted.org/packages/35/c3/e0b7835d23001f7d999f3895c6b569927c4d39912286897f625736e1fd04/ruff-0.15.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c2a33a529fb3cbc23a7124b5c6ff121e4d6228029cba374777bd7649cc8598b8", size = 10830426, upload-time = "2026-03-26T18:40:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/f0/51/ab20b322f637b369383adc341d761eaaa0f0203d6b9a7421cd6e783d81b9/ruff-0.15.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:75e5cd06b1cf3f47a3996cfc999226b19aa92e7cce682dcd62f80d7035f98f49", size = 11345125, upload-time = "2026-03-26T18:39:27.799Z" }, ] [[package]] @@ -5710,7 +5710,7 @@ wheels = [ [[package]] name = "zensical" -version = "0.0.26" +version = "0.0.29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -5720,18 +5720,18 @@ dependencies = [ { name = "pymdown-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/1f/0a0b1ce8e0553a9dabaedc736d0f34b11fc33d71ff46bce44d674996d41f/zensical-0.0.26.tar.gz", hash = "sha256:f4d9c8403df25fbb3d6dd9577122dc2f23c73a2d16ab778bb7d40370dd71e987", size = 3841473, upload-time = "2026-03-11T09:51:38.838Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/bd/5786ab618a60bd7469ab243a7fd2c9eecb0790c85c784abb8b97edb77a54/zensical-0.0.29.tar.gz", hash = "sha256:0d6282be7cb551e12d5806badf5e94c54a5e2f2cf07057a3e36d1eaf97c33ada", size = 3842641, upload-time = "2026-03-24T13:37:27.587Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/58/fa3d9538ff1ea8cf4a193edbf47254f374fa7983fcfa876bb4336d72c53a/zensical-0.0.26-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7823b25afe7d36099253aa59d643abaac940f80fd015d4a37954210c87d3da56", size = 12263607, upload-time = "2026-03-11T09:50:49.202Z" }, - { url = "https://files.pythonhosted.org/packages/5f/6e/44a3b21bd3569b9cad203364d73a956768d28a879e4c2be91bd889f74d2c/zensical-0.0.26-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c0254814382cdd3769bc7689180d09bf41de8879871dd736dc52d5f141e8ada7", size = 12144562, upload-time = "2026-03-11T09:50:53.685Z" }, - { url = "https://files.pythonhosted.org/packages/07/ae/31b9885745b3e7ef23a3ae7f175b879807288d11b3fb7e2d3c119c916258/zensical-0.0.26-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8e601b2bbd239e564b04cf235eefb9777e7dfc7e1857b8871d6cdcfb577aa0", size = 12506728, upload-time = "2026-03-11T09:50:57.775Z" }, - { url = "https://files.pythonhosted.org/packages/bd/93/f5291e2c47076474f181f6eef35ef0428117d3f192da4358c0511e2ce09e/zensical-0.0.26-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2dc43c7e6c25d9724fc0450f0273ca4e5e2506eeb7f89f52f1405a592896ca3b", size = 12454975, upload-time = "2026-03-11T09:51:01.514Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2e/61cac4f2ebad31dab768eb02753ffde9e56d4d34b8f876b949bf516fbd50/zensical-0.0.26-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24ed236d1254cc474c19227eaa3670a1ccf921af53134ec5542b05853bdcd59c", size = 12791930, upload-time = "2026-03-11T09:51:05.162Z" }, - { url = "https://files.pythonhosted.org/packages/02/86/51995d1ed2dd6ad8a1a70bcdf3c5eb16b50e62ea70e638d454a6b9061c4d/zensical-0.0.26-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1110147710d1dd025d932c4a7eada836bdf079c91b70fb0ae5b202e14b094617", size = 12548166, upload-time = "2026-03-11T09:51:09.218Z" }, - { url = "https://files.pythonhosted.org/packages/3d/93/decbafdbfc77170cbc3851464632390846e9aaf45e743c8dd5a24d5673e9/zensical-0.0.26-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7d21596a785428cdebc20859bd94a05334abe14ad24f1bb9cd80d19219e3c220", size = 12682103, upload-time = "2026-03-11T09:51:12.68Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e2/391d2d08dde621177da069a796a886b549fefb15734aeeb6e696af99b662/zensical-0.0.26-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:680a3c7bb71499b4da784d6072e44b3d7b8c0df3ce9bbd9974e24bd8058c2736", size = 12724219, upload-time = "2026-03-11T09:51:17.32Z" }, - { url = "https://files.pythonhosted.org/packages/80/2a/21b40c5c40a67da8a841f278d61dbd8d5e035e489de6fe1cef5f4e211b4f/zensical-0.0.26-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:e3294a79f98218b6fc2219232e166aa0932ae4dad58f6c8dbc0dbe0ecbff9c25", size = 12862117, upload-time = "2026-03-11T09:51:22.161Z" }, - { url = "https://files.pythonhosted.org/packages/51/76/e1910d6d75d207654c867b8efbda6822dedda9fed3601bf4a864a1f4fe26/zensical-0.0.26-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:630229587df1fb47be184a4a69d0772ce59a44cd2c481ae9f7e8852fffaff11e", size = 12815714, upload-time = "2026-03-11T09:51:26.24Z" }, + { url = "https://files.pythonhosted.org/packages/4b/9c/8b681daa024abca9763017bec09ecee8008e110cae1254217c8dd22cc339/zensical-0.0.29-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:20ae0709ea14fce25ab33d0a82acdaf454a7a2e232a9ee20c019942205174476", size = 12311399, upload-time = "2026-03-24T13:36:53.809Z" }, + { url = "https://files.pythonhosted.org/packages/81/ae/4ebb4d8bb2ef0164d473698b92f11caf431fc436e1625524acd5641102ca/zensical-0.0.29-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:599af3ba66fcd0146d7019f3493ed3c316051fae6c4d5599bc59f3a8f4b8a6f0", size = 12191845, upload-time = "2026-03-24T13:36:56.909Z" }, + { url = "https://files.pythonhosted.org/packages/d5/35/67f89db06571a52283b3ecbe3bcf32fd3115ca50436b3ae177a948b83ea7/zensical-0.0.29-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eea7e48a00a71c0586e875079b5f83a070c33a147e52ad4383e4b63ab524332b", size = 12554105, upload-time = "2026-03-24T13:36:59.945Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f6/ac79e5d9c18b28557c9ff1c7c23d695fbdd82645d69bfe02292f46d935e7/zensical-0.0.29-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:59a57db35542e98d2896b833de07d199320f8ada3b4e7ddccb7fe892292d8b74", size = 12498643, upload-time = "2026-03-24T13:37:02.376Z" }, + { url = "https://files.pythonhosted.org/packages/b1/70/5c22a96a69e0e91e569c26236918bb9bab1170f59b29ad04105ead64f199/zensical-0.0.29-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d42c2b2a96a80cf64c98ba7242f59ef95109914bd4c9499d7ebc12544663852c", size = 12854531, upload-time = "2026-03-24T13:37:04.962Z" }, + { url = "https://files.pythonhosted.org/packages/79/25/e32237a8fcb0ceae1ef8e192e7f8db53b38f1e48f1c7cdbacd0a7b713892/zensical-0.0.29-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2fca39c5f6b1782c77cf6591cf346357cabee85ebdb956c5ddc0fd5169f3d9", size = 12596828, upload-time = "2026-03-24T13:37:07.817Z" }, + { url = "https://files.pythonhosted.org/packages/ff/74/89ac909cbb258903ea53802c184e4986c17ce0ba79b1c7f77b7e78a2dce3/zensical-0.0.29-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dfc23a74ef672aa51088c080286319da1dc0b989cd5051e9e5e6d7d4abbc2fc1", size = 12732059, upload-time = "2026-03-24T13:37:11.651Z" }, + { url = "https://files.pythonhosted.org/packages/8c/31/2429de6a9328eed4acc7e9a3789f160294a15115be15f9870a0d02649302/zensical-0.0.29-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c9336d4e4b232e3c9a70e30258e916dd7e60c0a2a08c8690065e60350c302028", size = 12768542, upload-time = "2026-03-24T13:37:14.39Z" }, + { url = "https://files.pythonhosted.org/packages/10/8a/55588b2a1dcbe86dad0404506c9ba367a06c663b1ff47147c84d26f7510e/zensical-0.0.29-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:30661148f0681199f3b598cbeb1d54f5cba773e54ae840bac639250d85907b84", size = 12917991, upload-time = "2026-03-24T13:37:16.795Z" }, + { url = "https://files.pythonhosted.org/packages/ec/5d/653901f0d3a3ca72daebc62746a148797f4e422cc3a2b66a4e6718e4398f/zensical-0.0.29-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6a566ac1fd4bfac5d711a7bd1ae06666712127c2718daa5083c7bf3f107e8578", size = 12868392, upload-time = "2026-03-24T13:37:19.42Z" }, ] [[package]] From eb758862c94ea6344da4b940e23ee30d21aff829 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 07:22:04 -0700 Subject: [PATCH 104/113] Chore(deps): Bump the document-processing group with 3 updates (#12489) Bumps the document-processing group with 3 updates: [gotenberg-client](https://github.com/stumpylog/gotenberg-client), [ocrmypdf](https://github.com/ocrmypdf/OCRmyPDF) and [tika-client](https://github.com/stumpylog/tika-client). Updates `gotenberg-client` from 0.13.1 to 0.14.0 - [Release notes](https://github.com/stumpylog/gotenberg-client/releases) - [Changelog](https://github.com/stumpylog/gotenberg-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/stumpylog/gotenberg-client/compare/0.13.1...0.14.0) Updates `ocrmypdf` from 17.3.0 to 17.4.0 - [Release notes](https://github.com/ocrmypdf/OCRmyPDF/releases) - [Commits](https://github.com/ocrmypdf/OCRmyPDF/compare/v17.3.0...v17.4.0) Updates `tika-client` from 0.10.0 to 0.11.0 - [Release notes](https://github.com/stumpylog/tika-client/releases) - [Changelog](https://github.com/stumpylog/tika-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/stumpylog/tika-client/compare/0.10.0...0.11.0) --- updated-dependencies: - dependency-name: gotenberg-client dependency-version: 0.14.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: document-processing - dependency-name: ocrmypdf dependency-version: 17.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: document-processing - dependency-name: tika-client dependency-version: 0.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: document-processing ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 6 +++--- uv.lock | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7bb160956..30be1ae11 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ dependencies = [ "faiss-cpu>=1.10", "filelock~=3.25.2", "flower~=2.0.1", - "gotenberg-client~=0.13.1", + "gotenberg-client~=0.14.0", "httpx-oauth~=0.16", "ijson>=3.2", "imap-tools~=1.11.0", @@ -59,7 +59,7 @@ dependencies = [ "llama-index-llms-openai>=0.6.13", "llama-index-vector-stores-faiss>=0.5.2", "nltk~=3.9.1", - "ocrmypdf~=17.3.0", + "ocrmypdf~=17.4.0", "openai>=1.76", "pathvalidate~=3.3.1", "pdf2image~=1.17.0", @@ -75,7 +75,7 @@ dependencies = [ "sentence-transformers>=4.1", "setproctitle~=1.3.4", "tantivy>=0.25.1", - "tika-client~=0.10.0", + "tika-client~=0.11.0", "torch~=2.10.0", "watchfiles>=1.1.1", "whitenoise~=6.11", diff --git a/uv.lock b/uv.lock index 4cfd329f4..8b72cbcc3 100644 --- a/uv.lock +++ b/uv.lock @@ -1434,14 +1434,14 @@ wheels = [ [[package]] name = "gotenberg-client" -version = "0.13.1" +version = "0.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", extra = ["http2"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/6c/aaadd6657ca42fbd148b1c00604b98c1ead5a22552f4e5365ce5f0632430/gotenberg_client-0.13.1.tar.gz", hash = "sha256:cdd6bbb535cd739b87446cd1b4f6347ed7f9af6a0d4b19baf7c064b75528ee54", size = 1211143, upload-time = "2025-12-04T20:45:24.151Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/34/8e3be3a6a1b654d2a3bfa3e5d201183aeff6d50c42199ac0b8ed912c01c5/gotenberg_client-0.14.0.tar.gz", hash = "sha256:a853700c6b01c3372871264c4eb9ae3375addafbcbbfd3341e411f4217a8088c", size = 1214438, upload-time = "2026-03-11T17:23:11.122Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/f6/7a6e6785295332d2538f729ae19516cef712273a5ab8b90d015f08e37a45/gotenberg_client-0.13.1-py3-none-any.whl", hash = "sha256:613f7083a5e8a81699dd8d715c97e5806a424ac48920aad25d7c11b600cdfaf3", size = 51058, upload-time = "2025-12-04T20:45:22.603Z" }, + { url = "https://files.pythonhosted.org/packages/55/1a/67ff4cca162ae4195bd6f1a107779898b6f2977cc33ae7e05a5178a395fa/gotenberg_client-0.14.0-py3-none-any.whl", hash = "sha256:868f1be46d1ed0f327ca3efeb1888b4fe35641c35bfa39684d23a59365703156", size = 50977, upload-time = "2026-03-11T17:23:09.397Z" }, ] [[package]] @@ -2775,7 +2775,7 @@ wheels = [ [[package]] name = "ocrmypdf" -version = "17.3.0" +version = "17.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecation", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2792,9 +2792,9 @@ dependencies = [ { name = "rich", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "uharfbuzz", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fa/fe/60bdc79529be1ad8b151d426ed2020d5ac90328c54e9ba92bd808e1535c1/ocrmypdf-17.3.0.tar.gz", hash = "sha256:4022f13aad3f405e330056a07aa8bd63714b48b414693831b56e2cf2c325f52d", size = 7378015, upload-time = "2026-02-21T09:30:07.207Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/b9/01f5cbd062f680af8a3f8f883f8e71de8be7979c3256f509661c1e2e2065/ocrmypdf-17.4.0.tar.gz", hash = "sha256:4bbc53249f3981599565f670c5de774d6440832eede87c515e6608880fa02a34", size = 7378592, upload-time = "2026-03-21T19:06:50.966Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/b1/b7ae057a1bcb1495067ee3c4d48c1ce5fc66addd9492307c5a0ff799a7f2/ocrmypdf-17.3.0-py3-none-any.whl", hash = "sha256:c8882e7864954d3db6bcee49cc9f261b65bff66b7e5925eb68a1c281f41cad23", size = 488130, upload-time = "2026-02-21T09:30:05.236Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b7/71ae51a11669e63f1fea76153db4475079ea8d7b60802faf080f25b4a262/ocrmypdf-17.4.0-py3-none-any.whl", hash = "sha256:b93fd4d736a71a241e44d1b48e1305b9bf4581cd2ae9a96fcd89f4db1051dd87", size = 488312, upload-time = "2026-03-21T19:06:48.456Z" }, ] [[package]] @@ -3022,7 +3022,7 @@ requires-dist = [ { name = "faiss-cpu", specifier = ">=1.10" }, { name = "filelock", specifier = "~=3.25.2" }, { name = "flower", specifier = "~=2.0.1" }, - { name = "gotenberg-client", specifier = "~=0.13.1" }, + { name = "gotenberg-client", specifier = "~=0.14.0" }, { name = "granian", extras = ["uvloop"], marker = "extra == 'webserver'", specifier = "~=2.7.0" }, { name = "httpx-oauth", specifier = "~=0.16" }, { name = "ijson", specifier = ">=3.2" }, @@ -3037,7 +3037,7 @@ requires-dist = [ { name = "llama-index-vector-stores-faiss", specifier = ">=0.5.2" }, { name = "mysqlclient", marker = "extra == 'mariadb'", specifier = "~=2.2.7" }, { name = "nltk", specifier = "~=3.9.1" }, - { name = "ocrmypdf", specifier = "~=17.3.0" }, + { name = "ocrmypdf", specifier = "~=17.4.0" }, { name = "openai", specifier = ">=1.76" }, { name = "pathvalidate", specifier = "~=3.3.1" }, { name = "pdf2image", specifier = "~=1.17.0" }, @@ -3058,7 +3058,7 @@ requires-dist = [ { name = "sentence-transformers", specifier = ">=4.1" }, { name = "setproctitle", specifier = "~=1.3.4" }, { name = "tantivy", specifier = ">=0.25.1" }, - { name = "tika-client", specifier = "~=0.10.0" }, + { name = "tika-client", specifier = "~=0.11.0" }, { name = "torch", specifier = "~=2.10.0", index = "https://download.pytorch.org/whl/cpu" }, { name = "watchfiles", specifier = ">=1.1.1" }, { name = "whitenoise", specifier = "~=6.11" }, @@ -4716,15 +4716,15 @@ wheels = [ [[package]] name = "tika-client" -version = "0.10.0" +version = "0.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/be/65bfc47e4689ecd5ead20cf47dc0084fd767b7e71e8cfabf5fddc42aae3c/tika_client-0.10.0.tar.gz", hash = "sha256:3101e8b2482ae4cb7f87be13ada970ff691bdc3404d94cd52f5e57a09c99370c", size = 2178257, upload-time = "2025-08-04T17:47:30.414Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/d9/01f2049240dacf67c9be61d9c59e72b6827a862e8fd87e77e458e0a3b797/tika_client-0.11.0.tar.gz", hash = "sha256:c741caaca08bbd715a8db3fe6f0430a54d075fef3d59a441e8b8d810f58de4f0", size = 2178828, upload-time = "2026-03-11T16:50:25.865Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/31/002e0fa5bca67d6a19da8c294273486f6c46cbcc83d6879719a38a181461/tika_client-0.10.0-py3-none-any.whl", hash = "sha256:f5486cc884e4522575662aa295bda761bf9f101ac8d92840155b58ab8b96f6e2", size = 18237, upload-time = "2025-08-04T17:47:28.966Z" }, + { url = "https://files.pythonhosted.org/packages/53/04/5a433d621ec559d1d216d200eea43b0ac63435beb5dd52bbc75f4aaef465/tika_client-0.11.0-py3-none-any.whl", hash = "sha256:461903ccbe705d84dd3e4a1ca83e04174776d4b06dc57b902f9281633a3836e6", size = 18470, upload-time = "2026-03-11T16:50:24.672Z" }, ] [[package]] From 64debc87a594ae339a5ac725550de3d4c9bcfaeb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 08:16:36 -0700 Subject: [PATCH 105/113] Chore(deps): Bump djangorestframework in the django-ecosystem group (#12488) Bumps the django-ecosystem group with 1 update: [djangorestframework](https://github.com/encode/django-rest-framework). Updates `djangorestframework` from 3.16.1 to 3.17.1 - [Release notes](https://github.com/encode/django-rest-framework/releases) - [Commits](https://github.com/encode/django-rest-framework/compare/3.16.1...3.17.1) --- updated-dependencies: - dependency-name: djangorestframework dependency-version: 3.17.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: django-ecosystem ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 8b72cbcc3..180448efe 100644 --- a/uv.lock +++ b/uv.lock @@ -1108,14 +1108,14 @@ wheels = [ [[package]] name = "djangorestframework" -version = "3.16.1" +version = "3.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8a/95/5376fe618646fde6899b3cdc85fd959716bb67542e273a76a80d9f326f27/djangorestframework-3.16.1.tar.gz", hash = "sha256:166809528b1aced0a17dc66c24492af18049f2c9420dbd0be29422029cfc3ff7", size = 1089735, upload-time = "2025-08-06T17:50:53.251Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/d7/c016e69fac19ff8afdc89db9d31d9ae43ae031e4d1993b20aca179b8301a/djangorestframework-3.17.1.tar.gz", hash = "sha256:a6def5f447fe78ff853bff1d47a3c59bf38f5434b031780b351b0c73a62db1a5", size = 905742, upload-time = "2026-03-24T16:58:33.705Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/ce/bf8b9d3f415be4ac5588545b5fcdbbb841977db1c1d923f7568eeabe1689/djangorestframework-3.16.1-py3-none-any.whl", hash = "sha256:33a59f47fb9c85ede792cbf88bde71893bcda0667bc573f784649521f1102cec", size = 1080442, upload-time = "2025-08-06T17:50:50.667Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e1/2c516bdc83652b1a60c6119366ac2c0607b479ed05cd6093f916ca8928f8/djangorestframework-3.17.1-py3-none-any.whl", hash = "sha256:c3c74dd3e83a5a3efc37b3c18d92bd6f86a6791c7b7d4dff62bb068500e76457", size = 898844, upload-time = "2026-03-24T16:58:31.845Z" }, ] [[package]] From f32ad98d8e4bba2e92d5eecc5bfb32ef4b7dff54 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Fri, 3 Apr 2026 13:31:40 -0700 Subject: [PATCH 106/113] Feature: Update consumer logging to include task ID for log correlation (#12510) --- src/documents/tasks.py | 126 +++++++++++++++------------- src/paperless/logging.py | 33 ++++++++ src/paperless/settings/__init__.py | 3 +- src/paperless/tests/test_logging.py | 34 ++++++++ 4 files changed, 136 insertions(+), 60 deletions(-) create mode 100644 src/paperless/logging.py create mode 100644 src/paperless/tests/test_logging.py diff --git a/src/documents/tasks.py b/src/documents/tasks.py index ae65a5fbe..c40b1ff3f 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -61,6 +61,7 @@ from documents.utils import compute_checksum from documents.utils import identity from documents.workflows.utils import get_workflows_for_trigger from paperless.config import AIConfig +from paperless.logging import consume_task_id from paperless.parsers import ParserContext from paperless.parsers.registry import get_parser_registry from paperless_ai.indexing import llm_index_add_or_update_document @@ -147,76 +148,85 @@ def consume_file( input_doc: ConsumableDocument, overrides: DocumentMetadataOverrides | None = None, ): - # Default no overrides - if overrides is None: - overrides = DocumentMetadataOverrides() + token = consume_task_id.set((self.request.id or "")[:8]) + try: + # Default no overrides + if overrides is None: + overrides = DocumentMetadataOverrides() - plugins: list[type[ConsumeTaskPlugin]] = ( - [ - ConsumerPreflightPlugin, - ConsumerPlugin, - ] - if input_doc.root_document_id is not None - else [ - ConsumerPreflightPlugin, - AsnCheckPlugin, - CollatePlugin, - BarcodePlugin, - AsnCheckPlugin, # Re-run ASN check after barcode reading - WorkflowTriggerPlugin, - ConsumerPlugin, - ] - ) + plugins: list[type[ConsumeTaskPlugin]] = ( + [ + ConsumerPreflightPlugin, + ConsumerPlugin, + ] + if input_doc.root_document_id is not None + else [ + ConsumerPreflightPlugin, + AsnCheckPlugin, + CollatePlugin, + BarcodePlugin, + AsnCheckPlugin, # Re-run ASN check after barcode reading + WorkflowTriggerPlugin, + ConsumerPlugin, + ] + ) - with ( - ProgressManager( - overrides.filename or input_doc.original_file.name, - self.request.id, - ) as status_mgr, - TemporaryDirectory(dir=settings.SCRATCH_DIR) as tmp_dir, - ): - tmp_dir = Path(tmp_dir) - for plugin_class in plugins: - plugin_name = plugin_class.NAME - - plugin = plugin_class( - input_doc, - overrides, - status_mgr, - tmp_dir, + with ( + ProgressManager( + overrides.filename or input_doc.original_file.name, self.request.id, - ) + ) as status_mgr, + TemporaryDirectory(dir=settings.SCRATCH_DIR) as tmp_dir, + ): + tmp_dir = Path(tmp_dir) + for plugin_class in plugins: + plugin_name = plugin_class.NAME - if not plugin.able_to_run: - logger.debug(f"Skipping plugin {plugin_name}") - continue + plugin = plugin_class( + input_doc, + overrides, + status_mgr, + tmp_dir, + self.request.id, + ) - try: - logger.debug(f"Executing plugin {plugin_name}") - plugin.setup() + if not plugin.able_to_run: + logger.debug(f"Skipping plugin {plugin_name}") + continue - msg = plugin.run() + try: + logger.debug(f"Executing plugin {plugin_name}") + plugin.setup() - if msg is not None: - logger.info(f"{plugin_name} completed with: {msg}") - else: - logger.info(f"{plugin_name} completed with no message") + msg = plugin.run() - overrides = plugin.metadata + if msg is not None: + logger.info(f"{plugin_name} completed with: {msg}") + else: + logger.info(f"{plugin_name} completed with no message") - except StopConsumeTaskError as e: - logger.info(f"{plugin_name} requested task exit: {e.message}") - return e.message + overrides = plugin.metadata - except Exception as e: - logger.exception(f"{plugin_name} failed: {e}") - status_mgr.send_progress(ProgressStatusOptions.FAILED, f"{e}", 100, 100) - raise + except StopConsumeTaskError as e: + logger.info(f"{plugin_name} requested task exit: {e.message}") + return e.message - finally: - plugin.cleanup() + except Exception as e: + logger.exception(f"{plugin_name} failed: {e}") + status_mgr.send_progress( + ProgressStatusOptions.FAILED, + f"{e}", + 100, + 100, + ) + raise - return msg + finally: + plugin.cleanup() + + return msg + finally: + consume_task_id.reset(token) @shared_task diff --git a/src/paperless/logging.py b/src/paperless/logging.py new file mode 100644 index 000000000..ce2eff4fc --- /dev/null +++ b/src/paperless/logging.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +import logging +from contextvars import ContextVar + +consume_task_id: ContextVar[str] = ContextVar("consume_task_id", default="") + + +class ConsumeTaskFormatter(logging.Formatter): + """ + Logging formatter that prepends a short task correlation ID to messages + emitted during document consumption. + + The ID is the first 8 characters of the Celery task UUID, set via the + ``consume_task_id`` ContextVar at the entry of ``consume_file``. When + the ContextVar is empty (any log outside a consume task) no prefix is + added and the output is identical to the standard verbose format. + """ + + def __init__(self) -> None: + super().__init__( + fmt="[{asctime}] [{levelname}] [{name}] {task_prefix}{message}", + style="{", + validate=False, # {task_prefix} is not a standard LogRecord attribute, so Python's + # init-time format-string validation would raise ValueError without + # this. Runtime safety comes from format() always setting + # record.task_prefix before calling super().format(). + ) + + def format(self, record: logging.LogRecord) -> str: + task_id = consume_task_id.get() + record.task_prefix = f"[{task_id}] " if task_id else "" + return super().format(record) diff --git a/src/paperless/settings/__init__.py b/src/paperless/settings/__init__.py index 964295020..fac1391b3 100644 --- a/src/paperless/settings/__init__.py +++ b/src/paperless/settings/__init__.py @@ -592,8 +592,7 @@ LOGGING = { "disable_existing_loggers": False, "formatters": { "verbose": { - "format": "[{asctime}] [{levelname}] [{name}] {message}", - "style": "{", + "()": "paperless.logging.ConsumeTaskFormatter", }, "simple": { "format": "{levelname} {message}", diff --git a/src/paperless/tests/test_logging.py b/src/paperless/tests/test_logging.py new file mode 100644 index 000000000..dbd36c7d0 --- /dev/null +++ b/src/paperless/tests/test_logging.py @@ -0,0 +1,34 @@ +import logging + +from paperless.logging import ConsumeTaskFormatter +from paperless.logging import consume_task_id + + +def _make_record(msg: str = "Test message") -> logging.LogRecord: + return logging.LogRecord( + name="paperless.consumer", + level=logging.INFO, + pathname="", + lineno=0, + msg=msg, + args=(), + exc_info=None, + ) + + +def test_formatter_includes_task_id_when_set(): + token = consume_task_id.set("a8098c1a") + try: + formatter = ConsumeTaskFormatter() + output = formatter.format(_make_record()) + assert "[a8098c1a] Test message" in output + finally: + consume_task_id.reset(token) + + +def test_formatter_omits_prefix_when_no_task_id(): + # ContextVar default is "" — no task active + formatter = ConsumeTaskFormatter() + output = formatter.format(_make_record()) + assert "[] " not in output + assert "Test message" in output From 566afdffcaaf90eb5a63ca9ae3d6f49128fb623c Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 3 Apr 2026 13:53:45 -0700 Subject: [PATCH 107/113] Enhancement: unify text search to use tantivy (#12485) --- docs/api.md | 10 +- .../e2e/document-list/document-list.spec.ts | 4 +- .../requests/api-document-list2.har | 8 +- .../global-search.component.spec.ts | 4 +- .../global-search/global-search.component.ts | 4 +- ...storage-path-edit-dialog.component.spec.ts | 4 +- .../storage-path-edit-dialog.component.ts | 4 +- .../document-link.component.spec.ts | 4 +- .../document-link/document-link.component.ts | 4 +- .../bulk-editor/bulk-editor.component.spec.ts | 2 +- .../filter-editor.component.spec.ts | 140 ++++++++-- .../filter-editor/filter-editor.component.ts | 41 ++- src-ui/src/app/data/filter-rule-type.ts | 24 +- .../services/rest/document.service.spec.ts | 6 +- src-ui/src/app/utils/query-params.spec.ts | 48 ++++ src-ui/src/app/utils/query-params.ts | 21 +- src/documents/filters.py | 12 + .../0018_saved_view_simple_search_rules.py | 92 +++++++ src/documents/models.py | 2 + src/documents/search/__init__.py | 2 + src/documents/search/_backend.py | 40 ++- src/documents/search/_normalize.py | 8 + src/documents/search/_query.py | 82 ++++++ src/documents/search/_schema.py | 12 + src/documents/search/_tokenizer.py | 14 + src/documents/tests/search/test_backend.py | 253 ++++++++++++++++++ src/documents/tests/search/test_tokenizer.py | 33 +++ src/documents/tests/test_api_search.py | 154 +++++++++++ src/documents/views.py | 84 ++++-- 29 files changed, 1019 insertions(+), 97 deletions(-) create mode 100644 src/documents/migrations/0018_saved_view_simple_search_rules.py create mode 100644 src/documents/search/_normalize.py diff --git a/docs/api.md b/docs/api.md index 2284d9d29..af1190f3d 100644 --- a/docs/api.md +++ b/docs/api.md @@ -62,10 +62,14 @@ The REST api provides five different forms of authentication. ## Searching for documents -Full text searching is available on the `/api/documents/` endpoint. Two -specific query parameters cause the API to return full text search +Full text searching is available on the `/api/documents/` endpoint. The +following query parameters cause the API to return Tantivy-backed search results: +- `/api/documents/?text=your%20search%20query`: Search title and content + using simple substring-style search. +- `/api/documents/?title_search=your%20search%20query`: Search title only + using simple substring-style search. - `/api/documents/?query=your%20search%20query`: Search for a document using a full text query. For details on the syntax, see [Basic Usage - Searching](usage.md#basic-usage_searching). - `/api/documents/?more_like_id=1234`: Search for documents similar to @@ -439,3 +443,5 @@ Initial API version. - The `all` parameter of list endpoints is now deprecated and will be removed in a future version. - The bulk edit objects endpoint now supports `all` and `filters` parameters to avoid having to send large lists of object IDs for operations affecting many objects. +- The legacy `title_content` document search parameter is deprecated and will be removed in a future version. + Clients should use `text` for simple title-and-content search and `title_search` for title-only search. diff --git a/src-ui/e2e/document-list/document-list.spec.ts b/src-ui/e2e/document-list/document-list.spec.ts index 700304186..0cea8effa 100644 --- a/src-ui/e2e/document-list/document-list.spec.ts +++ b/src-ui/e2e/document-list/document-list.spec.ts @@ -49,11 +49,11 @@ test('text filtering', async ({ page }) => { await page.getByRole('main').getByRole('combobox').click() await page.getByRole('main').getByRole('combobox').fill('test') await expect(page.locator('pngx-document-list')).toHaveText(/32 documents/) - await expect(page).toHaveURL(/title_content=test/) + await expect(page).toHaveURL(/text=test/) await page.getByRole('button', { name: 'Title & content' }).click() await page.getByRole('button', { name: 'Title', exact: true }).click() await expect(page.locator('pngx-document-list')).toHaveText(/9 documents/) - await expect(page).toHaveURL(/title__icontains=test/) + await expect(page).toHaveURL(/title_search=test/) await page.getByRole('button', { name: 'Title', exact: true }).click() await page.getByRole('button', { name: 'Advanced search' }).click() await expect(page).toHaveURL(/query=test/) diff --git a/src-ui/e2e/document-list/requests/api-document-list2.har b/src-ui/e2e/document-list/requests/api-document-list2.har index 3cbc9e8a6..f6a488b26 100644 --- a/src-ui/e2e/document-list/requests/api-document-list2.har +++ b/src-ui/e2e/document-list/requests/api-document-list2.har @@ -3545,7 +3545,7 @@ "time": 1.091, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&title_content=test", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&text=test", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -3579,7 +3579,7 @@ "value": "true" }, { - "name": "title_content", + "name": "text", "value": "test" } ], @@ -4303,7 +4303,7 @@ "time": 0.603, "request": { "method": "GET", - "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&title__icontains=test", + "url": "http://localhost:8000/api/documents/?page=1&page_size=50&ordering=-created&truncate_content=true&include_selection_data=true&title_search=test", "httpVersion": "HTTP/1.1", "cookies": [], "headers": [ @@ -4337,7 +4337,7 @@ "value": "true" }, { - "name": "title__icontains", + "name": "title_search", "value": "test" } ], diff --git a/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts b/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts index eaae4a814..1be801478 100644 --- a/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts +++ b/src-ui/src/app/components/app-frame/global-search/global-search.component.spec.ts @@ -24,7 +24,7 @@ import { FILTER_HAS_DOCUMENT_TYPE_ANY, FILTER_HAS_STORAGE_PATH_ANY, FILTER_HAS_TAGS_ALL, - FILTER_TITLE_CONTENT, + FILTER_SIMPLE_TEXT, } from 'src/app/data/filter-rule-type' import { GlobalSearchType, SETTINGS_KEYS } from 'src/app/data/ui-settings' import { DocumentListViewService } from 'src/app/services/document-list-view.service' @@ -545,7 +545,7 @@ describe('GlobalSearchComponent', () => { component.query = 'test' component.runFullSearch() expect(qfSpy).toHaveBeenCalledWith([ - { rule_type: FILTER_TITLE_CONTENT, value: 'test' }, + { rule_type: FILTER_SIMPLE_TEXT, value: 'test' }, ]) settingsService.set( diff --git a/src-ui/src/app/components/app-frame/global-search/global-search.component.ts b/src-ui/src/app/components/app-frame/global-search/global-search.component.ts index 4f9a2467c..e95b52cfc 100644 --- a/src-ui/src/app/components/app-frame/global-search/global-search.component.ts +++ b/src-ui/src/app/components/app-frame/global-search/global-search.component.ts @@ -25,7 +25,7 @@ import { FILTER_HAS_DOCUMENT_TYPE_ANY, FILTER_HAS_STORAGE_PATH_ANY, FILTER_HAS_TAGS_ALL, - FILTER_TITLE_CONTENT, + FILTER_SIMPLE_TEXT, } from 'src/app/data/filter-rule-type' import { ObjectWithId } from 'src/app/data/object-with-id' import { GlobalSearchType, SETTINGS_KEYS } from 'src/app/data/ui-settings' @@ -410,7 +410,7 @@ export class GlobalSearchComponent implements OnInit { public runFullSearch() { const ruleType = this.useAdvancedForFullSearch ? FILTER_FULLTEXT_QUERY - : FILTER_TITLE_CONTENT + : FILTER_SIMPLE_TEXT this.documentService.searchQuery = this.useAdvancedForFullSearch ? this.query : '' diff --git a/src-ui/src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.spec.ts b/src-ui/src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.spec.ts index 89e7b1fee..2466ced73 100644 --- a/src-ui/src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.spec.ts +++ b/src-ui/src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.spec.ts @@ -4,7 +4,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing' import { By } from '@angular/platform-browser' import { NgbAccordionButton, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { of, throwError } from 'rxjs' -import { FILTER_TITLE } from 'src/app/data/filter-rule-type' +import { FILTER_SIMPLE_TITLE } from 'src/app/data/filter-rule-type' import { DocumentService } from 'src/app/services/rest/document.service' import { StoragePathService } from 'src/app/services/rest/storage-path.service' import { SettingsService } from 'src/app/services/settings.service' @@ -105,7 +105,7 @@ describe('StoragePathEditDialogComponent', () => { null, 'created', true, - [{ rule_type: FILTER_TITLE, value: 'bar' }], + [{ rule_type: FILTER_SIMPLE_TITLE, value: 'bar' }], { truncate_content: true } ) listSpy.mockReturnValueOnce( diff --git a/src-ui/src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts b/src-ui/src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts index f06831588..68ce40f5e 100644 --- a/src-ui/src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts +++ b/src-ui/src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts @@ -23,7 +23,7 @@ import { } from 'rxjs' import { EditDialogComponent } from 'src/app/components/common/edit-dialog/edit-dialog.component' import { Document } from 'src/app/data/document' -import { FILTER_TITLE } from 'src/app/data/filter-rule-type' +import { FILTER_SIMPLE_TITLE } from 'src/app/data/filter-rule-type' import { DEFAULT_MATCHING_ALGORITHM } from 'src/app/data/matching-model' import { StoragePath } from 'src/app/data/storage-path' import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' @@ -146,7 +146,7 @@ export class StoragePathEditDialogComponent null, 'created', true, - [{ rule_type: FILTER_TITLE, value: title }], + [{ rule_type: FILTER_SIMPLE_TITLE, value: title }], { truncate_content: true } ) .pipe( diff --git a/src-ui/src/app/components/common/input/document-link/document-link.component.spec.ts b/src-ui/src/app/components/common/input/document-link/document-link.component.spec.ts index 7021012ab..f8a8f3817 100644 --- a/src-ui/src/app/components/common/input/document-link/document-link.component.spec.ts +++ b/src-ui/src/app/components/common/input/document-link/document-link.component.spec.ts @@ -3,7 +3,7 @@ import { provideHttpClientTesting } from '@angular/common/http/testing' import { ComponentFixture, TestBed } from '@angular/core/testing' import { NG_VALUE_ACCESSOR } from '@angular/forms' import { of, throwError } from 'rxjs' -import { FILTER_TITLE } from 'src/app/data/filter-rule-type' +import { FILTER_SIMPLE_TITLE } from 'src/app/data/filter-rule-type' import { DocumentService } from 'src/app/services/rest/document.service' import { DocumentLinkComponent } from './document-link.component' @@ -99,7 +99,7 @@ describe('DocumentLinkComponent', () => { null, 'created', true, - [{ rule_type: FILTER_TITLE, value: 'bar' }], + [{ rule_type: FILTER_SIMPLE_TITLE, value: 'bar' }], { truncate_content: true } ) listSpy.mockReturnValueOnce(throwError(() => new Error())) diff --git a/src-ui/src/app/components/common/input/document-link/document-link.component.ts b/src-ui/src/app/components/common/input/document-link/document-link.component.ts index b50f5701d..9bfb60063 100644 --- a/src-ui/src/app/components/common/input/document-link/document-link.component.ts +++ b/src-ui/src/app/components/common/input/document-link/document-link.component.ts @@ -28,7 +28,7 @@ import { tap, } from 'rxjs' import { Document } from 'src/app/data/document' -import { FILTER_TITLE } from 'src/app/data/filter-rule-type' +import { FILTER_SIMPLE_TITLE } from 'src/app/data/filter-rule-type' import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' import { DocumentService } from 'src/app/services/rest/document.service' import { AbstractInputComponent } from '../abstract-input' @@ -121,7 +121,7 @@ export class DocumentLinkComponent null, 'created', true, - [{ rule_type: FILTER_TITLE, value: title }], + [{ rule_type: FILTER_SIMPLE_TITLE, value: title }], { truncate_content: true } ) .pipe( diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts index f283a75f3..8f82be1ab 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts @@ -428,7 +428,7 @@ describe('BulkEditorComponent', () => { req.flush(true) expect(req.request.body).toEqual({ all: true, - filters: { title__icontains: 'apple' }, + filters: { title_search: 'apple' }, method: 'modify_tags', parameters: { add_tags: [101], remove_tags: [] }, }) diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.spec.ts b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.spec.ts index bf5240f1b..d75e38630 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.spec.ts +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.spec.ts @@ -67,6 +67,8 @@ import { FILTER_OWNER_DOES_NOT_INCLUDE, FILTER_OWNER_ISNULL, FILTER_SHARED_BY_USER, + FILTER_SIMPLE_TEXT, + FILTER_SIMPLE_TITLE, FILTER_STORAGE_PATH, FILTER_TITLE, FILTER_TITLE_CONTENT, @@ -312,7 +314,7 @@ describe('FilterEditorComponent', () => { expect(component.textFilter).toEqual(null) component.filterRules = [ { - rule_type: FILTER_TITLE_CONTENT, + rule_type: FILTER_SIMPLE_TEXT, value: 'foo', }, ] @@ -320,6 +322,18 @@ describe('FilterEditorComponent', () => { expect(component.textFilterTarget).toEqual('title-content') // TEXT_FILTER_TARGET_TITLE_CONTENT })) + it('should ingest legacy text filter rules for doc title + content', fakeAsync(() => { + expect(component.textFilter).toEqual(null) + component.filterRules = [ + { + rule_type: FILTER_TITLE_CONTENT, + value: 'legacy foo', + }, + ] + expect(component.textFilter).toEqual('legacy foo') + expect(component.textFilterTarget).toEqual('title-content') // TEXT_FILTER_TARGET_TITLE_CONTENT + })) + it('should ingest text filter rules for doc asn', fakeAsync(() => { expect(component.textFilter).toEqual(null) component.filterRules = [ @@ -1117,7 +1131,7 @@ describe('FilterEditorComponent', () => { expect(component.textFilter).toEqual('foo') expect(component.filterRules).toEqual([ { - rule_type: FILTER_TITLE_CONTENT, + rule_type: FILTER_SIMPLE_TEXT, value: 'foo', }, ]) @@ -1136,7 +1150,7 @@ describe('FilterEditorComponent', () => { expect(component.textFilterTarget).toEqual('title') expect(component.filterRules).toEqual([ { - rule_type: FILTER_TITLE, + rule_type: FILTER_SIMPLE_TITLE, value: 'foo', }, ]) @@ -1250,30 +1264,12 @@ describe('FilterEditorComponent', () => { ]) })) - it('should convert user input to correct filter rules on custom fields query', fakeAsync(() => { - component.textFilterInput.nativeElement.value = 'foo' - component.textFilterInput.nativeElement.dispatchEvent(new Event('input')) - const textFieldTargetDropdown = fixture.debugElement.queryAll( - By.directive(NgbDropdownItem) - )[3] - textFieldTargetDropdown.triggerEventHandler('click') // TEXT_FILTER_TARGET_CUSTOM_FIELDS - fixture.detectChanges() - tick(400) - expect(component.textFilterTarget).toEqual('custom-fields') - expect(component.filterRules).toEqual([ - { - rule_type: FILTER_CUSTOM_FIELDS_TEXT, - value: 'foo', - }, - ]) - })) - it('should convert user input to correct filter rules on mime type', fakeAsync(() => { component.textFilterInput.nativeElement.value = 'pdf' component.textFilterInput.nativeElement.dispatchEvent(new Event('input')) const textFieldTargetDropdown = fixture.debugElement.queryAll( By.directive(NgbDropdownItem) - )[4] + )[3] textFieldTargetDropdown.triggerEventHandler('click') // TEXT_FILTER_TARGET_MIME_TYPE fixture.detectChanges() tick(400) @@ -1291,8 +1287,8 @@ describe('FilterEditorComponent', () => { component.textFilterInput.nativeElement.dispatchEvent(new Event('input')) const textFieldTargetDropdown = fixture.debugElement.queryAll( By.directive(NgbDropdownItem) - )[5] - textFieldTargetDropdown.triggerEventHandler('click') // TEXT_FILTER_TARGET_ASN + )[4] + textFieldTargetDropdown.triggerEventHandler('click') // TEXT_FILTER_TARGET_FULLTEXT_QUERY fixture.detectChanges() tick(400) expect(component.textFilterTarget).toEqual('fulltext-query') @@ -1696,12 +1692,56 @@ describe('FilterEditorComponent', () => { ]) })) + it('should convert legacy title filters into full text query when adding a created relative date', fakeAsync(() => { + component.filterRules = [ + { + rule_type: FILTER_TITLE, + value: 'foo', + }, + ] + const dateCreatedDropdown = fixture.debugElement.queryAll( + By.directive(DatesDropdownComponent) + )[0] + component.dateCreatedRelativeDate = RelativeDate.WITHIN_1_WEEK + dateCreatedDropdown.triggerEventHandler('datesSet') + fixture.detectChanges() + tick(400) + expect(component.filterRules).toEqual([ + { + rule_type: FILTER_FULLTEXT_QUERY, + value: 'foo,created:[-1 week to now]', + }, + ]) + })) + + it('should convert simple title filters into full text query when adding a created relative date', fakeAsync(() => { + component.filterRules = [ + { + rule_type: FILTER_SIMPLE_TITLE, + value: 'foo', + }, + ] + const dateCreatedDropdown = fixture.debugElement.queryAll( + By.directive(DatesDropdownComponent) + )[0] + component.dateCreatedRelativeDate = RelativeDate.WITHIN_1_WEEK + dateCreatedDropdown.triggerEventHandler('datesSet') + fixture.detectChanges() + tick(400) + expect(component.filterRules).toEqual([ + { + rule_type: FILTER_FULLTEXT_QUERY, + value: 'foo,created:[-1 week to now]', + }, + ]) + })) + it('should leave relative dates not in quick list intact', fakeAsync(() => { component.textFilterInput.nativeElement.value = 'created:[-2 week to now]' component.textFilterInput.nativeElement.dispatchEvent(new Event('input')) const textFieldTargetDropdown = fixture.debugElement.queryAll( By.directive(NgbDropdownItem) - )[5] + )[4] textFieldTargetDropdown.triggerEventHandler('click') fixture.detectChanges() tick(400) @@ -2031,12 +2071,30 @@ describe('FilterEditorComponent', () => { component.filterRules = [ { - rule_type: FILTER_TITLE, + rule_type: FILTER_SIMPLE_TITLE, value: 'foo', }, ] expect(component.generateFilterName()).toEqual('Title: foo') + component.filterRules = [ + { + rule_type: FILTER_TITLE_CONTENT, + value: 'legacy foo', + }, + ] + expect(component.generateFilterName()).toEqual( + 'Title & content: legacy foo' + ) + + component.filterRules = [ + { + rule_type: FILTER_SIMPLE_TEXT, + value: 'foo', + }, + ] + expect(component.generateFilterName()).toEqual('Title & content: foo') + component.filterRules = [ { rule_type: FILTER_ASN, @@ -2156,6 +2214,36 @@ describe('FilterEditorComponent', () => { }) }) + it('should hide deprecated custom fields target from default text filter targets', () => { + expect(component.textFilterTargets).not.toContainEqual({ + id: 'custom-fields', + name: $localize`Custom fields (Deprecated)`, + }) + }) + + it('should keep deprecated custom fields target available for legacy filters', fakeAsync(() => { + component.filterRules = [ + { + rule_type: FILTER_CUSTOM_FIELDS_TEXT, + value: 'foo', + }, + ] + fixture.detectChanges() + tick() + + expect(component.textFilterTarget).toEqual('custom-fields') + expect(component.textFilterTargets).toContainEqual({ + id: 'custom-fields', + name: $localize`Custom fields (Deprecated)`, + }) + expect(component.filterRules).toEqual([ + { + rule_type: FILTER_CUSTOM_FIELDS_TEXT, + value: 'foo', + }, + ]) + })) + it('should call autocomplete endpoint on input', fakeAsync(() => { component.textFilterTarget = 'fulltext-query' // TEXT_FILTER_TARGET_FULLTEXT_QUERY const autocompleteSpy = jest.spyOn(searchService, 'autocomplete') diff --git a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts index f7b50181b..b4e63317a 100644 --- a/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts +++ b/src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts @@ -71,6 +71,8 @@ import { FILTER_OWNER_DOES_NOT_INCLUDE, FILTER_OWNER_ISNULL, FILTER_SHARED_BY_USER, + FILTER_SIMPLE_TEXT, + FILTER_SIMPLE_TITLE, FILTER_STORAGE_PATH, FILTER_TITLE, FILTER_TITLE_CONTENT, @@ -195,10 +197,6 @@ const DEFAULT_TEXT_FILTER_TARGET_OPTIONS = [ name: $localize`Title & content`, }, { id: TEXT_FILTER_TARGET_ASN, name: $localize`ASN` }, - { - id: TEXT_FILTER_TARGET_CUSTOM_FIELDS, - name: $localize`Custom fields`, - }, { id: TEXT_FILTER_TARGET_MIME_TYPE, name: $localize`File type` }, { id: TEXT_FILTER_TARGET_FULLTEXT_QUERY, @@ -206,6 +204,12 @@ const DEFAULT_TEXT_FILTER_TARGET_OPTIONS = [ }, ] +const DEPRECATED_CUSTOM_FIELDS_TEXT_FILTER_TARGET_OPTION = { + // Kept only so legacy saved views can render and be edited away from, remove me eventually + id: TEXT_FILTER_TARGET_CUSTOM_FIELDS, + name: $localize`Custom fields (Deprecated)`, +} + const TEXT_FILTER_TARGET_MORELIKE_OPTION = { id: TEXT_FILTER_TARGET_FULLTEXT_MORELIKE, name: $localize`More like`, @@ -318,8 +322,13 @@ export class FilterEditorComponent return $localize`Custom fields query` case FILTER_TITLE: + case FILTER_SIMPLE_TITLE: return $localize`Title: ${rule.value}` + case FILTER_TITLE_CONTENT: + case FILTER_SIMPLE_TEXT: + return $localize`Title & content: ${rule.value}` + case FILTER_ASN: return $localize`ASN: ${rule.value}` @@ -353,12 +362,16 @@ export class FilterEditorComponent _moreLikeDoc: Document get textFilterTargets() { + let targets = DEFAULT_TEXT_FILTER_TARGET_OPTIONS if (this.textFilterTarget == TEXT_FILTER_TARGET_FULLTEXT_MORELIKE) { - return DEFAULT_TEXT_FILTER_TARGET_OPTIONS.concat([ - TEXT_FILTER_TARGET_MORELIKE_OPTION, + targets = targets.concat([TEXT_FILTER_TARGET_MORELIKE_OPTION]) + } + if (this.textFilterTarget == TEXT_FILTER_TARGET_CUSTOM_FIELDS) { + targets = targets.concat([ + DEPRECATED_CUSTOM_FIELDS_TEXT_FILTER_TARGET_OPTION, ]) } - return DEFAULT_TEXT_FILTER_TARGET_OPTIONS + return targets } textFilterTarget = TEXT_FILTER_TARGET_TITLE_CONTENT @@ -437,10 +450,12 @@ export class FilterEditorComponent value.forEach((rule) => { switch (rule.rule_type) { case FILTER_TITLE: + case FILTER_SIMPLE_TITLE: this._textFilter = rule.value this.textFilterTarget = TEXT_FILTER_TARGET_TITLE break case FILTER_TITLE_CONTENT: + case FILTER_SIMPLE_TEXT: this._textFilter = rule.value this.textFilterTarget = TEXT_FILTER_TARGET_TITLE_CONTENT break @@ -762,12 +777,15 @@ export class FilterEditorComponent this.textFilterTarget == TEXT_FILTER_TARGET_TITLE_CONTENT ) { filterRules.push({ - rule_type: FILTER_TITLE_CONTENT, + rule_type: FILTER_SIMPLE_TEXT, value: this._textFilter.trim(), }) } if (this._textFilter && this.textFilterTarget == TEXT_FILTER_TARGET_TITLE) { - filterRules.push({ rule_type: FILTER_TITLE, value: this._textFilter }) + filterRules.push({ + rule_type: FILTER_SIMPLE_TITLE, + value: this._textFilter, + }) } if (this.textFilterTarget == TEXT_FILTER_TARGET_ASN) { if ( @@ -1009,7 +1027,10 @@ export class FilterEditorComponent ) { existingRule = filterRules.find( (fr) => - fr.rule_type == FILTER_TITLE_CONTENT || fr.rule_type == FILTER_TITLE + fr.rule_type == FILTER_TITLE_CONTENT || + fr.rule_type == FILTER_SIMPLE_TEXT || + fr.rule_type == FILTER_TITLE || + fr.rule_type == FILTER_SIMPLE_TITLE ) existingRule.rule_type = FILTER_FULLTEXT_QUERY } diff --git a/src-ui/src/app/data/filter-rule-type.ts b/src-ui/src/app/data/filter-rule-type.ts index 7f0f0d56d..6330eb44c 100644 --- a/src-ui/src/app/data/filter-rule-type.ts +++ b/src-ui/src/app/data/filter-rule-type.ts @@ -3,7 +3,7 @@ import { DataType } from './datatype' export const NEGATIVE_NULL_FILTER_VALUE = -1 // These correspond to src/documents/models.py and changes here require a DB migration (and vice versa) -export const FILTER_TITLE = 0 +export const FILTER_TITLE = 0 // Deprecated in favor of Tantivy-backed `title_search`. Keep for now for existing saved views export const FILTER_CONTENT = 1 export const FILTER_ASN = 2 @@ -46,7 +46,9 @@ export const FILTER_ADDED_FROM = 46 export const FILTER_MODIFIED_BEFORE = 15 export const FILTER_MODIFIED_AFTER = 16 -export const FILTER_TITLE_CONTENT = 19 +export const FILTER_TITLE_CONTENT = 19 // Deprecated in favor of Tantivy-backed `text` filtervar. Keep for now for existing saved views +export const FILTER_SIMPLE_TITLE = 48 +export const FILTER_SIMPLE_TEXT = 49 export const FILTER_FULLTEXT_QUERY = 20 export const FILTER_FULLTEXT_MORELIKE = 21 @@ -56,7 +58,7 @@ export const FILTER_OWNER_ISNULL = 34 export const FILTER_OWNER_DOES_NOT_INCLUDE = 35 export const FILTER_SHARED_BY_USER = 37 -export const FILTER_CUSTOM_FIELDS_TEXT = 36 +export const FILTER_CUSTOM_FIELDS_TEXT = 36 // Deprecated. UI no longer includes CF text-search mode. Keep for now for existing saved views export const FILTER_HAS_CUSTOM_FIELDS_ALL = 38 export const FILTER_HAS_CUSTOM_FIELDS_ANY = 39 export const FILTER_DOES_NOT_HAVE_CUSTOM_FIELDS = 40 @@ -66,6 +68,9 @@ export const FILTER_CUSTOM_FIELDS_QUERY = 42 export const FILTER_MIME_TYPE = 47 +export const SIMPLE_TEXT_PARAMETER = 'text' +export const SIMPLE_TITLE_PARAMETER = 'title_search' + export const FILTER_RULE_TYPES: FilterRuleType[] = [ { id: FILTER_TITLE, @@ -74,6 +79,13 @@ export const FILTER_RULE_TYPES: FilterRuleType[] = [ multi: false, default: '', }, + { + id: FILTER_SIMPLE_TITLE, + filtervar: SIMPLE_TITLE_PARAMETER, + datatype: 'string', + multi: false, + default: '', + }, { id: FILTER_CONTENT, filtervar: 'content__icontains', @@ -279,6 +291,12 @@ export const FILTER_RULE_TYPES: FilterRuleType[] = [ datatype: 'string', multi: false, }, + { + id: FILTER_SIMPLE_TEXT, + filtervar: SIMPLE_TEXT_PARAMETER, + datatype: 'string', + multi: false, + }, { id: FILTER_FULLTEXT_QUERY, filtervar: 'query', diff --git a/src-ui/src/app/services/rest/document.service.spec.ts b/src-ui/src/app/services/rest/document.service.spec.ts index 711aab743..03375e367 100644 --- a/src-ui/src/app/services/rest/document.service.spec.ts +++ b/src-ui/src/app/services/rest/document.service.spec.ts @@ -10,7 +10,7 @@ import { DOCUMENT_SORT_FIELDS, DOCUMENT_SORT_FIELDS_FULLTEXT, } from 'src/app/data/document' -import { FILTER_TITLE } from 'src/app/data/filter-rule-type' +import { FILTER_SIMPLE_TITLE } from 'src/app/data/filter-rule-type' import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { environment } from 'src/environments/environment' import { PermissionsService } from '../permissions.service' @@ -138,13 +138,13 @@ describe(`DocumentService`, () => { subscription = service .listAllFilteredIds([ { - rule_type: FILTER_TITLE, + rule_type: FILTER_SIMPLE_TITLE, value: 'apple', }, ]) .subscribe() const req = httpTestingController.expectOne( - `${environment.apiBaseUrl}${endpoint}/?page=1&page_size=100000&fields=id&title__icontains=apple` + `${environment.apiBaseUrl}${endpoint}/?page=1&page_size=100000&fields=id&title_search=apple` ) expect(req.request.method).toEqual('GET') }) diff --git a/src-ui/src/app/utils/query-params.spec.ts b/src-ui/src/app/utils/query-params.spec.ts index c22c90d11..7fd8f6808 100644 --- a/src-ui/src/app/utils/query-params.spec.ts +++ b/src-ui/src/app/utils/query-params.spec.ts @@ -8,6 +8,10 @@ import { FILTER_HAS_CUSTOM_FIELDS_ALL, FILTER_HAS_CUSTOM_FIELDS_ANY, FILTER_HAS_TAGS_ALL, + FILTER_SIMPLE_TEXT, + FILTER_SIMPLE_TITLE, + FILTER_TITLE, + FILTER_TITLE_CONTENT, NEGATIVE_NULL_FILTER_VALUE, } from '../data/filter-rule-type' import { @@ -128,6 +132,26 @@ describe('QueryParams Utils', () => { is_tagged: 0, }) + params = queryParamsFromFilterRules([ + { + rule_type: FILTER_TITLE_CONTENT, + value: 'bank statement', + }, + ]) + expect(params).toEqual({ + text: 'bank statement', + }) + + params = queryParamsFromFilterRules([ + { + rule_type: FILTER_TITLE, + value: 'invoice', + }, + ]) + expect(params).toEqual({ + title_search: 'invoice', + }) + params = queryParamsFromFilterRules([ { rule_type: FILTER_HAS_TAGS_ALL, @@ -148,6 +172,30 @@ describe('QueryParams Utils', () => { it('should convert filter rules to query params', () => { let rules = filterRulesFromQueryParams( + convertToParamMap({ + text: 'bank statement', + }) + ) + expect(rules).toEqual([ + { + rule_type: FILTER_SIMPLE_TEXT, + value: 'bank statement', + }, + ]) + + rules = filterRulesFromQueryParams( + convertToParamMap({ + title_search: 'invoice', + }) + ) + expect(rules).toEqual([ + { + rule_type: FILTER_SIMPLE_TITLE, + value: 'invoice', + }, + ]) + + rules = filterRulesFromQueryParams( convertToParamMap({ tags__id__all, }) diff --git a/src-ui/src/app/utils/query-params.ts b/src-ui/src/app/utils/query-params.ts index 27716cc2d..be33ba724 100644 --- a/src-ui/src/app/utils/query-params.ts +++ b/src-ui/src/app/utils/query-params.ts @@ -9,8 +9,14 @@ import { FILTER_HAS_CUSTOM_FIELDS_ALL, FILTER_HAS_CUSTOM_FIELDS_ANY, FILTER_RULE_TYPES, + FILTER_SIMPLE_TEXT, + FILTER_SIMPLE_TITLE, + FILTER_TITLE, + FILTER_TITLE_CONTENT, FilterRuleType, NEGATIVE_NULL_FILTER_VALUE, + SIMPLE_TEXT_PARAMETER, + SIMPLE_TITLE_PARAMETER, } from '../data/filter-rule-type' import { ListViewState } from '../services/document-list-view.service' @@ -97,6 +103,8 @@ export function transformLegacyFilterRules( export function filterRulesFromQueryParams( queryParams: ParamMap ): FilterRule[] { + let filterRulesFromQueryParams: FilterRule[] = [] + const allFilterRuleQueryParams: string[] = FILTER_RULE_TYPES.map( (rt) => rt.filtervar ) @@ -104,7 +112,6 @@ export function filterRulesFromQueryParams( .filter((rt) => rt !== undefined) // transform query params to filter rules - let filterRulesFromQueryParams: FilterRule[] = [] allFilterRuleQueryParams .filter((frqp) => queryParams.has(frqp)) .forEach((filterQueryParamName) => { @@ -146,7 +153,17 @@ export function queryParamsFromFilterRules(filterRules: FilterRule[]): Params { let params = {} for (let rule of filterRules) { let ruleType = FILTER_RULE_TYPES.find((t) => t.id == rule.rule_type) - if (ruleType.isnull_filtervar && rule.value == null) { + if ( + rule.rule_type === FILTER_TITLE_CONTENT || + rule.rule_type === FILTER_SIMPLE_TEXT + ) { + params[SIMPLE_TEXT_PARAMETER] = rule.value + } else if ( + rule.rule_type === FILTER_TITLE || + rule.rule_type === FILTER_SIMPLE_TITLE + ) { + params[SIMPLE_TITLE_PARAMETER] = rule.value + } else if (ruleType.isnull_filtervar && rule.value == null) { params[ruleType.isnull_filtervar] = 1 } else if ( ruleType.isnull_filtervar && diff --git a/src/documents/filters.py b/src/documents/filters.py index 2f7de1cd4..b2b226ee1 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -3,6 +3,7 @@ from __future__ import annotations import functools import inspect import json +import logging import operator from contextlib import contextmanager from typing import TYPE_CHECKING @@ -77,6 +78,8 @@ DATETIME_KWARGS = [ CUSTOM_FIELD_QUERY_MAX_DEPTH = 10 CUSTOM_FIELD_QUERY_MAX_ATOMS = 20 +logger = logging.getLogger("paperless.api") + class CorrespondentFilterSet(FilterSet): class Meta: @@ -162,9 +165,13 @@ class InboxFilter(Filter): @extend_schema_field(serializers.CharField) class TitleContentFilter(Filter): + # Deprecated but retained for existing saved views. UI uses Tantivy-backed `text` / `title_search` params. def filter(self, qs: Any, value: Any) -> Any: value = value.strip() if isinstance(value, str) else value if value: + logger.warning( + "Deprecated document filter parameter 'title_content' used; use `text` instead.", + ) try: return qs.filter( Q(title__icontains=value) | Q(effective_content__icontains=value), @@ -243,6 +250,9 @@ class CustomFieldsFilter(Filter): def filter(self, qs, value): value = value.strip() if isinstance(value, str) else value if value: + logger.warning( + "Deprecated document filter parameter 'custom_fields__icontains' used; use `custom_field_query` or advanced Tantivy field syntax instead.", + ) fields_with_matching_selects = CustomField.objects.filter( extra_data__icontains=value, ) @@ -747,6 +757,7 @@ class DocumentFilterSet(FilterSet): is_in_inbox = InboxFilter() + # Deprecated, but keep for now for existing saved views title_content = TitleContentFilter() content__istartswith = EffectiveContentFilter(lookup_expr="istartswith") @@ -756,6 +767,7 @@ class DocumentFilterSet(FilterSet): owner__id__none = ObjectFilter(field_name="owner", exclude=True) + # Deprecated, UI no longer includes CF text-search mode, but keep for now for existing saved views custom_fields__icontains = CustomFieldsFilter() custom_fields__id__all = ObjectFilter(field_name="custom_fields__field") diff --git a/src/documents/migrations/0018_saved_view_simple_search_rules.py b/src/documents/migrations/0018_saved_view_simple_search_rules.py new file mode 100644 index 000000000..6d128c593 --- /dev/null +++ b/src/documents/migrations/0018_saved_view_simple_search_rules.py @@ -0,0 +1,92 @@ +# Generated by Django 5.2.12 on 2026-04-01 18:20 + +from django.db import migrations +from django.db import models + +OLD_TITLE_RULE = 0 +OLD_TITLE_CONTENT_RULE = 19 +NEW_SIMPLE_TITLE_RULE = 48 +NEW_SIMPLE_TEXT_RULE = 49 + + +# See documents/models.py SavedViewFilterRule +def migrate_saved_view_rules_forward(apps, schema_editor): + SavedViewFilterRule = apps.get_model("documents", "SavedViewFilterRule") + SavedViewFilterRule.objects.filter(rule_type=OLD_TITLE_RULE).update( + rule_type=NEW_SIMPLE_TITLE_RULE, + ) + SavedViewFilterRule.objects.filter(rule_type=OLD_TITLE_CONTENT_RULE).update( + rule_type=NEW_SIMPLE_TEXT_RULE, + ) + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0017_migrate_fulltext_query_field_prefixes"), + ] + + operations = [ + migrations.AlterField( + model_name="savedviewfilterrule", + name="rule_type", + field=models.PositiveSmallIntegerField( + choices=[ + (0, "title contains"), + (1, "content contains"), + (2, "ASN is"), + (3, "correspondent is"), + (4, "document type is"), + (5, "is in inbox"), + (6, "has tag"), + (7, "has any tag"), + (8, "created before"), + (9, "created after"), + (10, "created year is"), + (11, "created month is"), + (12, "created day is"), + (13, "added before"), + (14, "added after"), + (15, "modified before"), + (16, "modified after"), + (17, "does not have tag"), + (18, "does not have ASN"), + (19, "title or content contains"), + (20, "fulltext query"), + (21, "more like this"), + (22, "has tags in"), + (23, "ASN greater than"), + (24, "ASN less than"), + (25, "storage path is"), + (26, "has correspondent in"), + (27, "does not have correspondent in"), + (28, "has document type in"), + (29, "does not have document type in"), + (30, "has storage path in"), + (31, "does not have storage path in"), + (32, "owner is"), + (33, "has owner in"), + (34, "does not have owner"), + (35, "does not have owner in"), + (36, "has custom field value"), + (37, "is shared by me"), + (38, "has custom fields"), + (39, "has custom field in"), + (40, "does not have custom field in"), + (41, "does not have custom field"), + (42, "custom fields query"), + (43, "created to"), + (44, "created from"), + (45, "added to"), + (46, "added from"), + (47, "mime type is"), + (48, "simple title search"), + (49, "simple text search"), + ], + verbose_name="rule type", + ), + ), + migrations.RunPython( + migrate_saved_view_rules_forward, + migrations.RunPython.noop, + ), + ] diff --git a/src/documents/models.py b/src/documents/models.py index 96f027b94..9af5fbc23 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -623,6 +623,8 @@ class SavedViewFilterRule(models.Model): (45, _("added to")), (46, _("added from")), (47, _("mime type is")), + (48, _("simple title search")), + (49, _("simple text search")), ] saved_view = models.ForeignKey( diff --git a/src/documents/search/__init__.py b/src/documents/search/__init__.py index b0a89f242..a4145d7ef 100644 --- a/src/documents/search/__init__.py +++ b/src/documents/search/__init__.py @@ -1,4 +1,5 @@ from documents.search._backend import SearchIndexLockError +from documents.search._backend import SearchMode from documents.search._backend import SearchResults from documents.search._backend import TantivyBackend from documents.search._backend import TantivyRelevanceList @@ -10,6 +11,7 @@ from documents.search._schema import wipe_index __all__ = [ "SearchIndexLockError", + "SearchMode", "SearchResults", "TantivyBackend", "TantivyRelevanceList", diff --git a/src/documents/search/_backend.py b/src/documents/search/_backend.py index a1bff8a9f..405c24360 100644 --- a/src/documents/search/_backend.py +++ b/src/documents/search/_backend.py @@ -2,11 +2,11 @@ from __future__ import annotations import logging import threading -import unicodedata from collections import Counter from dataclasses import dataclass from datetime import UTC from datetime import datetime +from enum import StrEnum from typing import TYPE_CHECKING from typing import Self from typing import TypedDict @@ -19,7 +19,10 @@ from django.conf import settings from django.utils.timezone import get_current_timezone from guardian.shortcuts import get_users_with_perms +from documents.search._normalize import ascii_fold from documents.search._query import build_permission_filter +from documents.search._query import parse_simple_text_query +from documents.search._query import parse_simple_title_query from documents.search._query import parse_user_query from documents.search._schema import _write_sentinels from documents.search._schema import build_schema @@ -45,14 +48,10 @@ _AUTOCOMPLETE_REGEX_TIMEOUT = 1.0 # seconds; guards against ReDoS on untrusted T = TypeVar("T") -def _ascii_fold(s: str) -> str: - """ - Normalize unicode to ASCII equivalent characters for search consistency. - - Converts accented characters (e.g., "café") to their ASCII base forms ("cafe") - to enable cross-language searching without requiring exact diacritic matching. - """ - return unicodedata.normalize("NFD", s).encode("ascii", "ignore").decode() +class SearchMode(StrEnum): + QUERY = "query" + TEXT = "text" + TITLE = "title" def _extract_autocomplete_words(text_sources: list[str]) -> set[str]: @@ -74,7 +73,7 @@ def _extract_autocomplete_words(text_sources: list[str]) -> set[str]: ) continue for token in tokens: - normalized = _ascii_fold(token.lower()) + normalized = ascii_fold(token.lower()) if normalized: words.add(normalized) return words @@ -294,8 +293,10 @@ class TantivyBackend: doc.add_text("checksum", document.checksum) doc.add_text("title", document.title) doc.add_text("title_sort", document.title) + doc.add_text("simple_title", document.title) doc.add_text("content", content) doc.add_text("bigram_content", content) + doc.add_text("simple_content", content) # Original filename - only add if not None/empty if document.original_filename: @@ -433,6 +434,7 @@ class TantivyBackend: sort_field: str | None, *, sort_reverse: bool, + search_mode: SearchMode = SearchMode.QUERY, ) -> SearchResults: """ Execute a search query against the document index. @@ -441,20 +443,32 @@ class TantivyBackend: permission filtering before executing against Tantivy. Supports both relevance-based and field-based sorting. + QUERY search mode supports natural date keywords, field filters, etc. + TITLE search mode treats the query as plain text to search for in title only + TEXT search mode treats the query as plain text to search for in title and content + Args: - query: User's search query (supports natural date keywords, field filters) + query: User's search query user: User for permission filtering (None for superuser/no filtering) page: Page number (1-indexed) for pagination page_size: Number of results per page sort_field: Field to sort by (None for relevance ranking) sort_reverse: Whether to reverse the sort order + search_mode: "query" for advanced Tantivy syntax, "text" for + plain-text search over title and content only, "title" for + plain-text search over title only Returns: SearchResults with hits, total count, and processed query """ self._ensure_open() tz = get_current_timezone() - user_query = parse_user_query(self._index, query, tz) + if search_mode is SearchMode.TEXT: + user_query = parse_simple_text_query(self._index, query) + elif search_mode is SearchMode.TITLE: + user_query = parse_simple_title_query(self._index, query) + else: + user_query = parse_user_query(self._index, query, tz) # Apply permission filter if user is not None (not superuser) if user is not None: @@ -594,7 +608,7 @@ class TantivyBackend: List of word suggestions ordered by frequency, then alphabetically """ self._ensure_open() - normalized_term = _ascii_fold(term.lower()) + normalized_term = ascii_fold(term.lower()) searcher = self._index.searcher() diff --git a/src/documents/search/_normalize.py b/src/documents/search/_normalize.py new file mode 100644 index 000000000..3d7b23f33 --- /dev/null +++ b/src/documents/search/_normalize.py @@ -0,0 +1,8 @@ +from __future__ import annotations + +import unicodedata + + +def ascii_fold(text: str) -> str: + """Normalize unicode text to ASCII equivalents for search consistency.""" + return unicodedata.normalize("NFD", text).encode("ascii", "ignore").decode() diff --git a/src/documents/search/_query.py b/src/documents/search/_query.py index 212df1516..b7bcbbe9c 100644 --- a/src/documents/search/_query.py +++ b/src/documents/search/_query.py @@ -12,6 +12,8 @@ import tantivy from dateutil.relativedelta import relativedelta from django.conf import settings +from documents.search._normalize import ascii_fold + if TYPE_CHECKING: from datetime import tzinfo @@ -51,6 +53,7 @@ _WHOOSH_REL_RANGE_RE = regex.compile( ) # Whoosh-style 8-digit date: field:YYYYMMDD — field-aware so timezone can be applied correctly _DATE8_RE = regex.compile(r"(?P\w+):(?P\d{8})\b") +_SIMPLE_QUERY_TOKEN_RE = regex.compile(r"\S+") def _fmt(dt: datetime) -> str: @@ -436,7 +439,37 @@ DEFAULT_SEARCH_FIELDS = [ "document_type", "tag", ] +SIMPLE_SEARCH_FIELDS = ["simple_title", "simple_content"] +TITLE_SEARCH_FIELDS = ["simple_title"] _FIELD_BOOSTS = {"title": 2.0} +_SIMPLE_FIELD_BOOSTS = {"simple_title": 2.0} + + +def _build_simple_field_query( + index: tantivy.Index, + field: str, + tokens: list[str], +) -> tantivy.Query: + patterns = [] + for idx, token in enumerate(tokens): + escaped = regex.escape(token) + # For multi-token substring search, only the first token can begin mid-word. + # Later tokens follow a whitespace boundary in the original query, so anchor + # them to the start of the next indexed token to reduce false positives like + # matching "Z-Berichte 16" for the query "Z-Berichte 6". + if idx == 0: + patterns.append(f".*{escaped}.*") + else: + patterns.append(f"{escaped}.*") + if len(patterns) == 1: + query = tantivy.Query.regex_query(index.schema, field, patterns[0]) + else: + query = tantivy.Query.regex_phrase_query(index.schema, field, patterns) + + boost = _SIMPLE_FIELD_BOOSTS.get(field, 1.0) + if boost > 1.0: + return tantivy.Query.boost_query(query, boost) + return query def parse_user_query( @@ -495,3 +528,52 @@ def parse_user_query( ) return exact + + +def parse_simple_query( + index: tantivy.Index, + raw_query: str, + fields: list[str], +) -> tantivy.Query: + """ + Parse a plain-text query using Tantivy over a restricted field set. + + Query string is escaped and normalized to be treated as "simple" text query. + """ + tokens = [ + ascii_fold(token.lower()) + for token in _SIMPLE_QUERY_TOKEN_RE.findall(raw_query, timeout=_REGEX_TIMEOUT) + ] + tokens = [token for token in tokens if token] + if not tokens: + return tantivy.Query.empty_query() + + field_queries = [ + (tantivy.Occur.Should, _build_simple_field_query(index, field, tokens)) + for field in fields + ] + if len(field_queries) == 1: + return field_queries[0][1] + return tantivy.Query.boolean_query(field_queries) + + +def parse_simple_text_query( + index: tantivy.Index, + raw_query: str, +) -> tantivy.Query: + """ + Parse a plain-text query over title/content for simple search inputs. + """ + + return parse_simple_query(index, raw_query, SIMPLE_SEARCH_FIELDS) + + +def parse_simple_title_query( + index: tantivy.Index, + raw_query: str, +) -> tantivy.Query: + """ + Parse a plain-text query over the title field only. + """ + + return parse_simple_query(index, raw_query, TITLE_SEARCH_FIELDS) diff --git a/src/documents/search/_schema.py b/src/documents/search/_schema.py index ba6646007..5e9404235 100644 --- a/src/documents/search/_schema.py +++ b/src/documents/search/_schema.py @@ -53,6 +53,18 @@ def build_schema() -> tantivy.Schema: # CJK support - not stored, indexed only sb.add_text_field("bigram_content", stored=False, tokenizer_name="bigram_analyzer") + # Simple substring search support for title/content - not stored, indexed only + sb.add_text_field( + "simple_title", + stored=False, + tokenizer_name="simple_search_analyzer", + ) + sb.add_text_field( + "simple_content", + stored=False, + tokenizer_name="simple_search_analyzer", + ) + # Autocomplete prefix scan - stored, not indexed sb.add_text_field("autocomplete_word", stored=True, tokenizer_name="raw") diff --git a/src/documents/search/_tokenizer.py b/src/documents/search/_tokenizer.py index e597a879e..2079ca4cc 100644 --- a/src/documents/search/_tokenizer.py +++ b/src/documents/search/_tokenizer.py @@ -70,6 +70,7 @@ def register_tokenizers(index: tantivy.Index, language: str | None) -> None: index.register_tokenizer("paperless_text", _paperless_text(language)) index.register_tokenizer("simple_analyzer", _simple_analyzer()) index.register_tokenizer("bigram_analyzer", _bigram_analyzer()) + index.register_tokenizer("simple_search_analyzer", _simple_search_analyzer()) # Fast-field tokenizer required for fast=True text fields in the schema index.register_fast_field_tokenizer("simple_analyzer", _simple_analyzer()) @@ -114,3 +115,16 @@ def _bigram_analyzer() -> tantivy.TextAnalyzer: .filter(tantivy.Filter.lowercase()) .build() ) + + +def _simple_search_analyzer() -> tantivy.TextAnalyzer: + """Tokenizer for simple substring search fields: non-whitespace chunks -> remove_long(65) -> lowercase -> ascii_fold.""" + return ( + tantivy.TextAnalyzerBuilder( + tantivy.Tokenizer.regex(r"\S+"), + ) + .filter(tantivy.Filter.remove_long(65)) + .filter(tantivy.Filter.lowercase()) + .filter(tantivy.Filter.ascii_fold()) + .build() + ) diff --git a/src/documents/tests/search/test_backend.py b/src/documents/tests/search/test_backend.py index 5c92da447..ff9638e63 100644 --- a/src/documents/tests/search/test_backend.py +++ b/src/documents/tests/search/test_backend.py @@ -5,6 +5,7 @@ from documents.models import CustomField from documents.models import CustomFieldInstance from documents.models import Document from documents.models import Note +from documents.search._backend import SearchMode from documents.search._backend import TantivyBackend from documents.search._backend import get_backend from documents.search._backend import reset_backend @@ -46,6 +47,258 @@ class TestWriteBatch: class TestSearch: """Test search functionality.""" + def test_text_mode_limits_default_search_to_title_and_content( + self, + backend: TantivyBackend, + ): + """Simple text mode must not match metadata-only fields.""" + doc = Document.objects.create( + title="Invoice document", + content="monthly statement", + checksum="TXT1", + pk=9, + ) + backend.add_or_update(doc) + + metadata_only = backend.search( + "document_type:invoice", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TEXT, + ) + assert metadata_only.total == 0 + + content_match = backend.search( + "monthly", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TEXT, + ) + assert content_match.total == 1 + + def test_title_mode_limits_default_search_to_title_only( + self, + backend: TantivyBackend, + ): + """Title mode must not match content-only terms.""" + doc = Document.objects.create( + title="Invoice document", + content="monthly statement", + checksum="TXT2", + pk=10, + ) + backend.add_or_update(doc) + + content_only = backend.search( + "monthly", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TITLE, + ) + assert content_only.total == 0 + + title_match = backend.search( + "invoice", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TITLE, + ) + assert title_match.total == 1 + + def test_text_mode_matches_partial_term_substrings( + self, + backend: TantivyBackend, + ): + """Simple text mode should support substring matching within tokens.""" + doc = Document.objects.create( + title="Account access", + content="password reset instructions", + checksum="TXT3", + pk=11, + ) + backend.add_or_update(doc) + + prefix_match = backend.search( + "pass", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TEXT, + ) + assert prefix_match.total == 1 + + infix_match = backend.search( + "sswo", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TEXT, + ) + assert infix_match.total == 1 + + phrase_match = backend.search( + "sswo re", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TEXT, + ) + assert phrase_match.total == 1 + + def test_text_mode_does_not_match_on_partial_term_overlap( + self, + backend: TantivyBackend, + ): + """Simple text mode should not match documents that merely share partial fragments.""" + doc = Document.objects.create( + title="Adobe Acrobat PDF Files", + content="Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + checksum="TXT7", + pk=13, + ) + backend.add_or_update(doc) + + non_match = backend.search( + "raptor", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TEXT, + ) + assert non_match.total == 0 + + def test_text_mode_anchors_later_query_tokens_to_token_starts( + self, + backend: TantivyBackend, + ): + """Multi-token simple search should not match later tokens in the middle of a word.""" + exact_doc = Document.objects.create( + title="Z-Berichte 6", + content="monthly report", + checksum="TXT9", + pk=15, + ) + prefix_doc = Document.objects.create( + title="Z-Berichte 60", + content="monthly report", + checksum="TXT10", + pk=16, + ) + false_positive = Document.objects.create( + title="Z-Berichte 16", + content="monthly report", + checksum="TXT11", + pk=17, + ) + backend.add_or_update(exact_doc) + backend.add_or_update(prefix_doc) + backend.add_or_update(false_positive) + + results = backend.search( + "Z-Berichte 6", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TEXT, + ) + result_ids = {hit["id"] for hit in results.hits} + + assert exact_doc.id in result_ids + assert prefix_doc.id in result_ids + assert false_positive.id not in result_ids + + def test_text_mode_ignores_queries_without_searchable_tokens( + self, + backend: TantivyBackend, + ): + """Simple text mode should safely return no hits for symbol-only strings.""" + doc = Document.objects.create( + title="Guide", + content="This is a guide.", + checksum="TXT8", + pk=14, + ) + backend.add_or_update(doc) + + no_tokens = backend.search( + "!!!", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TEXT, + ) + assert no_tokens.total == 0 + + def test_title_mode_matches_partial_term_substrings( + self, + backend: TantivyBackend, + ): + """Title mode should support substring matching within title tokens.""" + doc = Document.objects.create( + title="Password guide", + content="reset instructions", + checksum="TXT4", + pk=12, + ) + backend.add_or_update(doc) + + prefix_match = backend.search( + "pass", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TITLE, + ) + assert prefix_match.total == 1 + + infix_match = backend.search( + "sswo", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TITLE, + ) + assert infix_match.total == 1 + + phrase_match = backend.search( + "sswo gu", + user=None, + page=1, + page_size=10, + sort_field=None, + sort_reverse=False, + search_mode=SearchMode.TITLE, + ) + assert phrase_match.total == 1 + def test_scores_normalised_top_hit_is_one(self, backend: TantivyBackend): """Search scores must be normalized so top hit has score 1.0 for UI consistency.""" for i, title in enumerate(["bank invoice", "bank statement", "bank receipt"]): diff --git a/src/documents/tests/search/test_tokenizer.py b/src/documents/tests/search/test_tokenizer.py index aee52a567..fc2c41231 100644 --- a/src/documents/tests/search/test_tokenizer.py +++ b/src/documents/tests/search/test_tokenizer.py @@ -8,6 +8,7 @@ import tantivy from documents.search._tokenizer import _bigram_analyzer from documents.search._tokenizer import _paperless_text +from documents.search._tokenizer import _simple_search_analyzer from documents.search._tokenizer import register_tokenizers if TYPE_CHECKING: @@ -41,6 +42,20 @@ class TestTokenizers: idx.register_tokenizer("bigram_analyzer", _bigram_analyzer()) return idx + @pytest.fixture + def simple_search_index(self) -> tantivy.Index: + """Index with simple-search field for Latin substring tests.""" + sb = tantivy.SchemaBuilder() + sb.add_text_field( + "simple_content", + stored=False, + tokenizer_name="simple_search_analyzer", + ) + schema = sb.build() + idx = tantivy.Index(schema, path=None) + idx.register_tokenizer("simple_search_analyzer", _simple_search_analyzer()) + return idx + def test_ascii_fold_finds_accented_content( self, content_index: tantivy.Index, @@ -66,6 +81,24 @@ class TestTokenizers: q = bigram_index.parse_query("東京", ["bigram_content"]) assert bigram_index.searcher().search(q, limit=5).count == 1 + def test_simple_search_analyzer_supports_regex_substrings( + self, + simple_search_index: tantivy.Index, + ) -> None: + """Whitespace-preserving simple search analyzer supports substring regex matching.""" + writer = simple_search_index.writer() + doc = tantivy.Document() + doc.add_text("simple_content", "tag:invoice password-reset") + writer.add_document(doc) + writer.commit() + simple_search_index.reload() + q = tantivy.Query.regex_query( + simple_search_index.schema, + "simple_content", + ".*sswo.*", + ) + assert simple_search_index.searcher().search(q, limit=5).count == 1 + def test_unsupported_language_logs_warning(self, caplog: LogCaptureFixture) -> None: """Unsupported language codes should log a warning and disable stemming gracefully.""" sb = tantivy.SchemaBuilder() diff --git a/src/documents/tests/test_api_search.py b/src/documents/tests/test_api_search.py index 69bd65198..9e0879e89 100644 --- a/src/documents/tests/test_api_search.py +++ b/src/documents/tests/test_api_search.py @@ -91,6 +91,135 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): self.assertEqual(response.data["count"], 0) self.assertEqual(len(results), 0) + def test_simple_text_search(self) -> None: + tagged = Tag.objects.create(name="invoice") + matching_doc = Document.objects.create( + title="Quarterly summary", + content="Monthly bank report", + checksum="T1", + pk=11, + ) + matching_doc.tags.add(tagged) + + metadata_only_doc = Document.objects.create( + title="Completely unrelated", + content="No matching terms here", + checksum="T2", + pk=12, + ) + metadata_only_doc.tags.add(tagged) + + backend = get_backend() + backend.add_or_update(matching_doc) + backend.add_or_update(metadata_only_doc) + + response = self.client.get("/api/documents/?text=monthly") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["id"], matching_doc.id) + + response = self.client.get("/api/documents/?text=tag:invoice") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 0) + + def test_simple_text_search_matches_substrings(self) -> None: + matching_doc = Document.objects.create( + title="Quarterly summary", + content="Password reset instructions", + checksum="T5", + pk=15, + ) + + backend = get_backend() + backend.add_or_update(matching_doc) + + response = self.client.get("/api/documents/?text=pass") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["id"], matching_doc.id) + + response = self.client.get("/api/documents/?text=sswo") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["id"], matching_doc.id) + + response = self.client.get("/api/documents/?text=sswo re") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["id"], matching_doc.id) + + def test_simple_text_search_does_not_match_on_partial_term_overlap(self) -> None: + non_matching_doc = Document.objects.create( + title="Adobe Acrobat PDF Files", + content="Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + checksum="T7", + pk=17, + ) + + backend = get_backend() + backend.add_or_update(non_matching_doc) + + response = self.client.get("/api/documents/?text=raptor") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 0) + + def test_simple_title_search(self) -> None: + title_match = Document.objects.create( + title="Quarterly summary", + content="No matching content here", + checksum="T3", + pk=13, + ) + content_only = Document.objects.create( + title="Completely unrelated", + content="Quarterly summary appears only in content", + checksum="T4", + pk=14, + ) + + backend = get_backend() + backend.add_or_update(title_match) + backend.add_or_update(content_only) + + response = self.client.get("/api/documents/?title_search=quarterly") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["id"], title_match.id) + + def test_simple_title_search_matches_substrings(self) -> None: + title_match = Document.objects.create( + title="Password handbook", + content="No matching content here", + checksum="T6", + pk=16, + ) + + backend = get_backend() + backend.add_or_update(title_match) + + response = self.client.get("/api/documents/?title_search=pass") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["id"], title_match.id) + + response = self.client.get("/api/documents/?title_search=sswo") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["id"], title_match.id) + + response = self.client.get("/api/documents/?title_search=sswo hand") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + self.assertEqual(response.data["results"][0]["id"], title_match.id) + + def test_search_rejects_multiple_search_modes(self) -> None: + response = self.client.get("/api/documents/?text=bank&query=bank") + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertEqual( + response.data["detail"], + "Specify only one of text, title_search, query, or more_like_id.", + ) + def test_search_returns_all_for_api_version_9(self) -> None: d1 = Document.objects.create( title="invoice", @@ -1493,6 +1622,31 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase): self.assertEqual(results["custom_fields"][0]["id"], custom_field1.id) self.assertEqual(results["workflows"][0]["id"], workflow1.id) + def test_global_search_db_only_limits_documents_to_title_matches(self) -> None: + title_match = Document.objects.create( + title="bank statement", + content="no additional terms", + checksum="GS1", + pk=21, + ) + content_only = Document.objects.create( + title="not a title match", + content="bank appears only in content", + checksum="GS2", + pk=22, + ) + + backend = get_backend() + backend.add_or_update(title_match) + backend.add_or_update(content_only) + + self.client.force_authenticate(self.user) + + response = self.client.get("/api/search/?query=bank&db_only=true") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data["documents"]), 1) + self.assertEqual(response.data["documents"][0]["id"], title_match.id) + def test_global_search_filters_owned_mail_objects(self) -> None: user1 = User.objects.create_user("mail-search-user") user2 = User.objects.create_user("other-mail-search-user") diff --git a/src/documents/views.py b/src/documents/views.py index 024e846a0..68d2b7961 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -1995,11 +1995,23 @@ class ChatStreamingView(GenericAPIView): list=extend_schema( description="Document views including search", parameters=[ + OpenApiParameter( + name="text", + type=OpenApiTypes.STR, + location=OpenApiParameter.QUERY, + description="Simple Tantivy-backed text search query string", + ), + OpenApiParameter( + name="title_search", + type=OpenApiTypes.STR, + location=OpenApiParameter.QUERY, + description="Simple Tantivy-backed title-only search query string", + ), OpenApiParameter( name="query", type=OpenApiTypes.STR, location=OpenApiParameter.QUERY, - description="Advanced search query string", + description="Advanced Tantivy search query string", ), OpenApiParameter( name="full_perms", @@ -2025,22 +2037,28 @@ class ChatStreamingView(GenericAPIView): ), ) class UnifiedSearchViewSet(DocumentViewSet): + SEARCH_PARAM_NAMES = ("text", "title_search", "query", "more_like_id") + def get_serializer_class(self): if self._is_search_request(): return SearchResultSerializer else: return DocumentSerializer + def _get_active_search_params(self, request: Request | None = None) -> list[str]: + request = request or self.request + return [ + param for param in self.SEARCH_PARAM_NAMES if param in request.query_params + ] + def _is_search_request(self): - return ( - "query" in self.request.query_params - or "more_like_id" in self.request.query_params - ) + return bool(self._get_active_search_params()) def list(self, request, *args, **kwargs): if not self._is_search_request(): return super().list(request) + from documents.search import SearchMode from documents.search import TantivyRelevanceList from documents.search import get_backend @@ -2050,9 +2068,31 @@ class UnifiedSearchViewSet(DocumentViewSet): filtered_qs = self.filter_queryset(self.get_queryset()) user = None if request.user.is_superuser else request.user + active_search_params = self._get_active_search_params(request) - if "query" in request.query_params: - query_str = request.query_params["query"] + if len(active_search_params) > 1: + raise ValidationError( + { + "detail": _( + "Specify only one of text, title_search, query, or more_like_id.", + ), + }, + ) + + if ( + "text" in request.query_params + or "title_search" in request.query_params + or "query" in request.query_params + ): + if "text" in request.query_params: + search_mode = SearchMode.TEXT + query_str = request.query_params["text"] + elif "title_search" in request.query_params: + search_mode = SearchMode.TITLE + query_str = request.query_params["title_search"] + else: + search_mode = SearchMode.QUERY + query_str = request.query_params["query"] results = backend.search( query_str, user=user, @@ -2060,6 +2100,7 @@ class UnifiedSearchViewSet(DocumentViewSet): page_size=10000, sort_field=None, sort_reverse=False, + search_mode=search_mode, ) else: # more_like_id — validate permission on the seed document first @@ -2132,6 +2173,8 @@ class UnifiedSearchViewSet(DocumentViewSet): if str(e.detail) == str(invalid_more_like_id_message): return HttpResponseForbidden(invalid_more_like_id_message) return HttpResponseForbidden(_("Insufficient permissions.")) + except ValidationError: + raise except Exception as e: logger.warning(f"An error occurred listing search results: {e!s}") return HttpResponseBadRequest( @@ -3003,6 +3046,9 @@ class GlobalSearchView(PassUserMixin): serializer_class = SearchResultSerializer def get(self, request, *args, **kwargs): + from documents.search import SearchMode + from documents.search import get_backend + query = request.query_params.get("query", None) if query is None: return HttpResponseBadRequest("Query required") @@ -3019,25 +3065,25 @@ class GlobalSearchView(PassUserMixin): "view_document", Document, ) - # First search by title - docs = all_docs.filter(title__icontains=query) - if not db_only and len(docs) < OBJECT_LIMIT: - # If we don't have enough results, search by content. - # Over-fetch from Tantivy (no permission filter) and rely on - # the ORM all_docs queryset for authoritative permission gating. - from documents.search import get_backend - + if db_only: + docs = all_docs.filter(title__icontains=query)[:OBJECT_LIMIT] + else: + user = None if request.user.is_superuser else request.user fts_results = get_backend().search( query, - user=None, + user=user, page=1, page_size=1000, sort_field=None, sort_reverse=False, + search_mode=SearchMode.TEXT, ) - fts_ids = {h["id"] for h in fts_results.hits} - docs = docs | all_docs.filter(id__in=fts_ids) - docs = docs[:OBJECT_LIMIT] + docs_by_id = all_docs.in_bulk([hit["id"] for hit in fts_results.hits]) + docs = [ + docs_by_id[hit["id"]] + for hit in fts_results.hits + if hit["id"] in docs_by_id + ][:OBJECT_LIMIT] saved_views = ( get_objects_for_user_owner_aware( request.user, From d0f8a98a9a7b52ed02fa3fc52e1eb31f83940b5f Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 20:55:14 +0000 Subject: [PATCH 108/113] Auto translate strings --- src-ui/messages.xlf | 68 ++-- src/locale/en_US/LC_MESSAGES/django.po | 452 +++++++++++++------------ 2 files changed, 271 insertions(+), 249 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 19b2f7ce2..f30605a4e 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -1081,7 +1081,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 205 + 203 @@ -3027,10 +3027,6 @@ src/app/components/document-list/filter-editor/filter-editor.component.html 84 - - src/app/components/document-list/filter-editor/filter-editor.component.ts - 200 - src/app/components/manage/document-attributes/document-attributes.component.ts 129 @@ -7504,7 +7500,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 194 src/app/data/document.ts @@ -8817,7 +8813,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 197 + 199 src/app/data/document.ts @@ -9020,56 +9016,63 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 195 + 197 File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 202 + 200 + + + + Custom fields (Deprecated) + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 210 More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 211 + 215 equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 217 + 221 is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 221 + 225 is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 225 + 229 greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 229 + 233 less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 233 + 237 @@ -9078,14 +9081,14 @@ )?.name"/> src/app/components/document-list/filter-editor/filter-editor.component.ts - 274,278 + 278,282 Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 280 + 284 @@ -9094,14 +9097,14 @@ )?.name"/> src/app/components/document-list/filter-editor/filter-editor.component.ts - 286,290 + 290,294 Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 292 + 296 @@ -9110,70 +9113,77 @@ )?.name"/> src/app/components/document-list/filter-editor/filter-editor.component.ts - 298,302 + 302,306 Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 304 + 308 Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308,310 + 312,314 Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 318 Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 318 + 322 Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 321 + 326 + + + + Title & content: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 330 ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 324 + 333 Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 327 + 336 Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 330 + 339 Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 333 + 342 diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index 57ade319a..03fdcc6e1 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-03 03:25+0000\n" +"POT-Creation-Date: 2026-04-03 20:54+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -21,67 +21,67 @@ msgstr "" msgid "Documents" msgstr "" -#: documents/filters.py:421 +#: documents/filters.py:431 msgid "Value must be valid JSON." msgstr "" -#: documents/filters.py:440 +#: documents/filters.py:450 msgid "Invalid custom field query expression" msgstr "" -#: documents/filters.py:450 +#: documents/filters.py:460 msgid "Invalid expression list. Must be nonempty." msgstr "" -#: documents/filters.py:471 +#: documents/filters.py:481 msgid "Invalid logical operator {op!r}" msgstr "" -#: documents/filters.py:485 +#: documents/filters.py:495 msgid "Maximum number of query conditions exceeded." msgstr "" -#: documents/filters.py:550 +#: documents/filters.py:560 msgid "{name!r} is not a valid custom field." msgstr "" -#: documents/filters.py:587 +#: documents/filters.py:597 msgid "{data_type} does not support query expr {expr!r}." msgstr "" -#: documents/filters.py:695 documents/models.py:137 +#: documents/filters.py:705 documents/models.py:137 msgid "Maximum nesting depth exceeded." msgstr "" -#: documents/filters.py:907 +#: documents/filters.py:919 msgid "Custom field not found" msgstr "" -#: documents/models.py:40 documents/models.py:842 documents/models.py:890 +#: documents/models.py:40 documents/models.py:844 documents/models.py:892 msgid "owner" msgstr "" -#: documents/models.py:57 documents/models.py:1172 +#: documents/models.py:57 documents/models.py:1174 msgid "None" msgstr "" -#: documents/models.py:58 documents/models.py:1173 +#: documents/models.py:58 documents/models.py:1175 msgid "Any word" msgstr "" -#: documents/models.py:59 documents/models.py:1174 +#: documents/models.py:59 documents/models.py:1176 msgid "All words" msgstr "" -#: documents/models.py:60 documents/models.py:1175 +#: documents/models.py:60 documents/models.py:1177 msgid "Exact match" msgstr "" -#: documents/models.py:61 documents/models.py:1176 +#: documents/models.py:61 documents/models.py:1178 msgid "Regular expression" msgstr "" -#: documents/models.py:62 documents/models.py:1177 +#: documents/models.py:62 documents/models.py:1179 msgid "Fuzzy word" msgstr "" @@ -89,20 +89,20 @@ msgstr "" msgid "Automatic" msgstr "" -#: documents/models.py:66 documents/models.py:536 documents/models.py:1755 +#: documents/models.py:66 documents/models.py:536 documents/models.py:1757 #: paperless_mail/models.py:23 paperless_mail/models.py:143 msgid "name" msgstr "" -#: documents/models.py:68 documents/models.py:1241 +#: documents/models.py:68 documents/models.py:1243 msgid "match" msgstr "" -#: documents/models.py:71 documents/models.py:1244 +#: documents/models.py:71 documents/models.py:1246 msgid "matching algorithm" msgstr "" -#: documents/models.py:76 documents/models.py:1249 +#: documents/models.py:76 documents/models.py:1251 msgid "is insensitive" msgstr "" @@ -168,7 +168,7 @@ msgstr "" msgid "title" msgstr "" -#: documents/models.py:191 documents/models.py:756 +#: documents/models.py:191 documents/models.py:758 msgid "content" msgstr "" @@ -206,8 +206,8 @@ msgstr "" msgid "The number of pages of the document." msgstr "" -#: documents/models.py:246 documents/models.py:762 documents/models.py:800 -#: documents/models.py:862 documents/models.py:980 documents/models.py:1039 +#: documents/models.py:246 documents/models.py:764 documents/models.py:802 +#: documents/models.py:864 documents/models.py:982 documents/models.py:1041 msgid "created" msgstr "" @@ -271,12 +271,12 @@ msgstr "" msgid "Optional short label for a document version." msgstr "" -#: documents/models.py:340 documents/models.py:773 documents/models.py:827 -#: documents/models.py:1798 +#: documents/models.py:340 documents/models.py:775 documents/models.py:829 +#: documents/models.py:1800 msgid "document" msgstr "" -#: documents/models.py:341 documents/models.py:933 +#: documents/models.py:341 documents/models.py:935 msgid "documents" msgstr "" @@ -296,11 +296,11 @@ msgstr "" msgid "Title" msgstr "" -#: documents/models.py:523 documents/models.py:1193 +#: documents/models.py:523 documents/models.py:1195 msgid "Created" msgstr "" -#: documents/models.py:524 documents/models.py:1192 +#: documents/models.py:524 documents/models.py:1194 msgid "Added" msgstr "" @@ -360,7 +360,7 @@ msgstr "" msgid "Document display fields" msgstr "" -#: documents/models.py:569 documents/models.py:632 +#: documents/models.py:569 documents/models.py:634 msgid "saved view" msgstr "" @@ -560,748 +560,756 @@ msgstr "" msgid "mime type is" msgstr "" -#: documents/models.py:635 -msgid "rule type" +#: documents/models.py:626 +msgid "simple title search" +msgstr "" + +#: documents/models.py:627 +msgid "simple text search" msgstr "" #: documents/models.py:637 +msgid "rule type" +msgstr "" + +#: documents/models.py:639 msgid "value" msgstr "" -#: documents/models.py:640 +#: documents/models.py:642 msgid "filter rule" msgstr "" -#: documents/models.py:641 +#: documents/models.py:643 msgid "filter rules" msgstr "" -#: documents/models.py:665 +#: documents/models.py:667 msgid "Auto Task" msgstr "" -#: documents/models.py:666 +#: documents/models.py:668 msgid "Scheduled Task" msgstr "" -#: documents/models.py:667 +#: documents/models.py:669 msgid "Manual Task" msgstr "" -#: documents/models.py:670 +#: documents/models.py:672 msgid "Consume File" msgstr "" -#: documents/models.py:671 +#: documents/models.py:673 msgid "Train Classifier" msgstr "" -#: documents/models.py:672 +#: documents/models.py:674 msgid "Check Sanity" msgstr "" -#: documents/models.py:673 +#: documents/models.py:675 msgid "Index Optimize" msgstr "" -#: documents/models.py:674 +#: documents/models.py:676 msgid "LLM Index Update" msgstr "" -#: documents/models.py:679 +#: documents/models.py:681 msgid "Task ID" msgstr "" -#: documents/models.py:680 +#: documents/models.py:682 msgid "Celery ID for the Task that was run" msgstr "" -#: documents/models.py:685 +#: documents/models.py:687 msgid "Acknowledged" msgstr "" -#: documents/models.py:686 +#: documents/models.py:688 msgid "If the task is acknowledged via the frontend or API" msgstr "" -#: documents/models.py:692 +#: documents/models.py:694 msgid "Task Filename" msgstr "" -#: documents/models.py:693 +#: documents/models.py:695 msgid "Name of the file which the Task was run for" msgstr "" -#: documents/models.py:700 +#: documents/models.py:702 msgid "Task Name" msgstr "" -#: documents/models.py:701 +#: documents/models.py:703 msgid "Name of the task that was run" msgstr "" -#: documents/models.py:708 +#: documents/models.py:710 msgid "Task State" msgstr "" -#: documents/models.py:709 +#: documents/models.py:711 msgid "Current state of the task being run" msgstr "" -#: documents/models.py:715 +#: documents/models.py:717 msgid "Created DateTime" msgstr "" -#: documents/models.py:716 +#: documents/models.py:718 msgid "Datetime field when the task result was created in UTC" msgstr "" -#: documents/models.py:722 +#: documents/models.py:724 msgid "Started DateTime" msgstr "" -#: documents/models.py:723 +#: documents/models.py:725 msgid "Datetime field when the task was started in UTC" msgstr "" -#: documents/models.py:729 +#: documents/models.py:731 msgid "Completed DateTime" msgstr "" -#: documents/models.py:730 +#: documents/models.py:732 msgid "Datetime field when the task was completed in UTC" msgstr "" -#: documents/models.py:736 +#: documents/models.py:738 msgid "Result Data" msgstr "" -#: documents/models.py:738 +#: documents/models.py:740 msgid "The data returned by the task" msgstr "" -#: documents/models.py:746 +#: documents/models.py:748 msgid "Task Type" msgstr "" -#: documents/models.py:747 +#: documents/models.py:749 msgid "The type of task that was run" msgstr "" -#: documents/models.py:758 +#: documents/models.py:760 msgid "Note for the document" msgstr "" -#: documents/models.py:782 +#: documents/models.py:784 msgid "user" msgstr "" -#: documents/models.py:787 +#: documents/models.py:789 msgid "note" msgstr "" -#: documents/models.py:788 +#: documents/models.py:790 msgid "notes" msgstr "" -#: documents/models.py:796 +#: documents/models.py:798 msgid "Archive" msgstr "" -#: documents/models.py:797 +#: documents/models.py:799 msgid "Original" msgstr "" -#: documents/models.py:808 documents/models.py:870 paperless_mail/models.py:75 +#: documents/models.py:810 documents/models.py:872 paperless_mail/models.py:75 msgid "expiration" msgstr "" -#: documents/models.py:815 documents/models.py:877 +#: documents/models.py:817 documents/models.py:879 msgid "slug" msgstr "" -#: documents/models.py:847 +#: documents/models.py:849 msgid "share link" msgstr "" -#: documents/models.py:848 +#: documents/models.py:850 msgid "share links" msgstr "" -#: documents/models.py:856 +#: documents/models.py:858 msgid "Pending" msgstr "" -#: documents/models.py:857 +#: documents/models.py:859 msgid "Processing" msgstr "" -#: documents/models.py:858 +#: documents/models.py:860 msgid "Ready" msgstr "" -#: documents/models.py:859 +#: documents/models.py:861 msgid "Failed" msgstr "" -#: documents/models.py:906 +#: documents/models.py:908 msgid "size (bytes)" msgstr "" -#: documents/models.py:912 +#: documents/models.py:914 msgid "last error" msgstr "" -#: documents/models.py:919 +#: documents/models.py:921 msgid "file path" msgstr "" -#: documents/models.py:925 +#: documents/models.py:927 msgid "built at" msgstr "" -#: documents/models.py:938 +#: documents/models.py:940 msgid "share link bundle" msgstr "" -#: documents/models.py:939 +#: documents/models.py:941 msgid "share link bundles" msgstr "" -#: documents/models.py:942 +#: documents/models.py:944 #, python-format msgid "Share link bundle %(slug)s" msgstr "" -#: documents/models.py:968 +#: documents/models.py:970 msgid "String" msgstr "" -#: documents/models.py:969 +#: documents/models.py:971 msgid "URL" msgstr "" -#: documents/models.py:970 +#: documents/models.py:972 msgid "Date" msgstr "" -#: documents/models.py:971 +#: documents/models.py:973 msgid "Boolean" msgstr "" -#: documents/models.py:972 +#: documents/models.py:974 msgid "Integer" msgstr "" -#: documents/models.py:973 +#: documents/models.py:975 msgid "Float" msgstr "" -#: documents/models.py:974 +#: documents/models.py:976 msgid "Monetary" msgstr "" -#: documents/models.py:975 +#: documents/models.py:977 msgid "Document Link" msgstr "" -#: documents/models.py:976 +#: documents/models.py:978 msgid "Select" msgstr "" -#: documents/models.py:977 +#: documents/models.py:979 msgid "Long Text" msgstr "" -#: documents/models.py:989 +#: documents/models.py:991 msgid "data type" msgstr "" -#: documents/models.py:996 +#: documents/models.py:998 msgid "extra data" msgstr "" -#: documents/models.py:1000 +#: documents/models.py:1002 msgid "Extra data for the custom field, such as select options" msgstr "" -#: documents/models.py:1006 +#: documents/models.py:1008 msgid "custom field" msgstr "" -#: documents/models.py:1007 +#: documents/models.py:1009 msgid "custom fields" msgstr "" -#: documents/models.py:1107 +#: documents/models.py:1109 msgid "custom field instance" msgstr "" -#: documents/models.py:1108 +#: documents/models.py:1110 msgid "custom field instances" msgstr "" -#: documents/models.py:1180 +#: documents/models.py:1182 msgid "Consumption Started" msgstr "" -#: documents/models.py:1181 +#: documents/models.py:1183 msgid "Document Added" msgstr "" -#: documents/models.py:1182 +#: documents/models.py:1184 msgid "Document Updated" msgstr "" -#: documents/models.py:1183 +#: documents/models.py:1185 msgid "Scheduled" msgstr "" -#: documents/models.py:1186 +#: documents/models.py:1188 msgid "Consume Folder" msgstr "" -#: documents/models.py:1187 +#: documents/models.py:1189 msgid "Api Upload" msgstr "" -#: documents/models.py:1188 +#: documents/models.py:1190 msgid "Mail Fetch" msgstr "" -#: documents/models.py:1189 +#: documents/models.py:1191 msgid "Web UI" msgstr "" -#: documents/models.py:1194 +#: documents/models.py:1196 msgid "Modified" msgstr "" -#: documents/models.py:1195 +#: documents/models.py:1197 msgid "Custom Field" msgstr "" -#: documents/models.py:1198 +#: documents/models.py:1200 msgid "Workflow Trigger Type" msgstr "" -#: documents/models.py:1210 +#: documents/models.py:1212 msgid "filter path" msgstr "" -#: documents/models.py:1215 +#: documents/models.py:1217 msgid "" "Only consume documents with a path that matches this if specified. Wildcards " "specified as * are allowed. Case insensitive." msgstr "" -#: documents/models.py:1222 +#: documents/models.py:1224 msgid "filter filename" msgstr "" -#: documents/models.py:1227 paperless_mail/models.py:200 +#: documents/models.py:1229 paperless_mail/models.py:200 msgid "" "Only consume documents which entirely match this filename if specified. " "Wildcards such as *.pdf or *invoice* are allowed. Case insensitive." msgstr "" -#: documents/models.py:1238 +#: documents/models.py:1240 msgid "filter documents from this mail rule" msgstr "" -#: documents/models.py:1254 +#: documents/models.py:1256 msgid "has these tag(s)" msgstr "" -#: documents/models.py:1261 +#: documents/models.py:1263 msgid "has all of these tag(s)" msgstr "" -#: documents/models.py:1268 +#: documents/models.py:1270 msgid "does not have these tag(s)" msgstr "" -#: documents/models.py:1276 +#: documents/models.py:1278 msgid "has this document type" msgstr "" -#: documents/models.py:1283 +#: documents/models.py:1285 msgid "has one of these document types" msgstr "" -#: documents/models.py:1290 +#: documents/models.py:1292 msgid "does not have these document type(s)" msgstr "" -#: documents/models.py:1298 +#: documents/models.py:1300 msgid "has this correspondent" msgstr "" -#: documents/models.py:1305 +#: documents/models.py:1307 msgid "does not have these correspondent(s)" msgstr "" -#: documents/models.py:1312 +#: documents/models.py:1314 msgid "has one of these correspondents" msgstr "" -#: documents/models.py:1320 +#: documents/models.py:1322 msgid "has this storage path" msgstr "" -#: documents/models.py:1327 +#: documents/models.py:1329 msgid "has one of these storage paths" msgstr "" -#: documents/models.py:1334 +#: documents/models.py:1336 msgid "does not have these storage path(s)" msgstr "" -#: documents/models.py:1338 +#: documents/models.py:1340 msgid "filter custom field query" msgstr "" -#: documents/models.py:1341 +#: documents/models.py:1343 msgid "JSON-encoded custom field query expression." msgstr "" -#: documents/models.py:1345 +#: documents/models.py:1347 msgid "schedule offset days" msgstr "" -#: documents/models.py:1348 +#: documents/models.py:1350 msgid "The number of days to offset the schedule trigger by." msgstr "" -#: documents/models.py:1353 +#: documents/models.py:1355 msgid "schedule is recurring" msgstr "" -#: documents/models.py:1356 +#: documents/models.py:1358 msgid "If the schedule should be recurring." msgstr "" -#: documents/models.py:1361 +#: documents/models.py:1363 msgid "schedule recurring delay in days" msgstr "" -#: documents/models.py:1365 +#: documents/models.py:1367 msgid "The number of days between recurring schedule triggers." msgstr "" -#: documents/models.py:1370 +#: documents/models.py:1372 msgid "schedule date field" msgstr "" -#: documents/models.py:1375 +#: documents/models.py:1377 msgid "The field to check for a schedule trigger." msgstr "" -#: documents/models.py:1384 +#: documents/models.py:1386 msgid "schedule date custom field" msgstr "" -#: documents/models.py:1388 +#: documents/models.py:1390 msgid "workflow trigger" msgstr "" -#: documents/models.py:1389 +#: documents/models.py:1391 msgid "workflow triggers" msgstr "" -#: documents/models.py:1397 +#: documents/models.py:1399 msgid "email subject" msgstr "" -#: documents/models.py:1401 +#: documents/models.py:1403 msgid "" "The subject of the email, can include some placeholders, see documentation." msgstr "" -#: documents/models.py:1407 +#: documents/models.py:1409 msgid "email body" msgstr "" -#: documents/models.py:1410 +#: documents/models.py:1412 msgid "" "The body (message) of the email, can include some placeholders, see " "documentation." msgstr "" -#: documents/models.py:1416 +#: documents/models.py:1418 msgid "emails to" msgstr "" -#: documents/models.py:1419 +#: documents/models.py:1421 msgid "The destination email addresses, comma separated." msgstr "" -#: documents/models.py:1425 +#: documents/models.py:1427 msgid "include document in email" msgstr "" -#: documents/models.py:1436 +#: documents/models.py:1438 msgid "webhook url" msgstr "" -#: documents/models.py:1439 +#: documents/models.py:1441 msgid "The destination URL for the notification." msgstr "" -#: documents/models.py:1444 +#: documents/models.py:1446 msgid "use parameters" msgstr "" -#: documents/models.py:1449 +#: documents/models.py:1451 msgid "send as JSON" msgstr "" -#: documents/models.py:1453 +#: documents/models.py:1455 msgid "webhook parameters" msgstr "" -#: documents/models.py:1456 +#: documents/models.py:1458 msgid "The parameters to send with the webhook URL if body not used." msgstr "" -#: documents/models.py:1460 +#: documents/models.py:1462 msgid "webhook body" msgstr "" -#: documents/models.py:1463 +#: documents/models.py:1465 msgid "The body to send with the webhook URL if parameters not used." msgstr "" -#: documents/models.py:1467 +#: documents/models.py:1469 msgid "webhook headers" msgstr "" -#: documents/models.py:1470 +#: documents/models.py:1472 msgid "The headers to send with the webhook URL." msgstr "" -#: documents/models.py:1475 +#: documents/models.py:1477 msgid "include document in webhook" msgstr "" -#: documents/models.py:1486 +#: documents/models.py:1488 msgid "Assignment" msgstr "" -#: documents/models.py:1490 +#: documents/models.py:1492 msgid "Removal" msgstr "" -#: documents/models.py:1494 documents/templates/account/password_reset.html:15 +#: documents/models.py:1496 documents/templates/account/password_reset.html:15 msgid "Email" msgstr "" -#: documents/models.py:1498 +#: documents/models.py:1500 msgid "Webhook" msgstr "" -#: documents/models.py:1502 +#: documents/models.py:1504 msgid "Password removal" msgstr "" -#: documents/models.py:1506 +#: documents/models.py:1508 msgid "Move to trash" msgstr "" -#: documents/models.py:1510 +#: documents/models.py:1512 msgid "Workflow Action Type" msgstr "" -#: documents/models.py:1515 documents/models.py:1757 +#: documents/models.py:1517 documents/models.py:1759 #: paperless_mail/models.py:145 msgid "order" msgstr "" -#: documents/models.py:1518 +#: documents/models.py:1520 msgid "assign title" msgstr "" -#: documents/models.py:1522 +#: documents/models.py:1524 msgid "Assign a document title, must be a Jinja2 template, see documentation." msgstr "" -#: documents/models.py:1530 paperless_mail/models.py:274 +#: documents/models.py:1532 paperless_mail/models.py:274 msgid "assign this tag" msgstr "" -#: documents/models.py:1539 paperless_mail/models.py:282 +#: documents/models.py:1541 paperless_mail/models.py:282 msgid "assign this document type" msgstr "" -#: documents/models.py:1548 paperless_mail/models.py:296 +#: documents/models.py:1550 paperless_mail/models.py:296 msgid "assign this correspondent" msgstr "" -#: documents/models.py:1557 +#: documents/models.py:1559 msgid "assign this storage path" msgstr "" -#: documents/models.py:1566 +#: documents/models.py:1568 msgid "assign this owner" msgstr "" -#: documents/models.py:1573 +#: documents/models.py:1575 msgid "grant view permissions to these users" msgstr "" -#: documents/models.py:1580 +#: documents/models.py:1582 msgid "grant view permissions to these groups" msgstr "" -#: documents/models.py:1587 +#: documents/models.py:1589 msgid "grant change permissions to these users" msgstr "" -#: documents/models.py:1594 +#: documents/models.py:1596 msgid "grant change permissions to these groups" msgstr "" -#: documents/models.py:1601 +#: documents/models.py:1603 msgid "assign these custom fields" msgstr "" -#: documents/models.py:1605 +#: documents/models.py:1607 msgid "custom field values" msgstr "" -#: documents/models.py:1609 +#: documents/models.py:1611 msgid "Optional values to assign to the custom fields." msgstr "" -#: documents/models.py:1618 +#: documents/models.py:1620 msgid "remove these tag(s)" msgstr "" -#: documents/models.py:1623 +#: documents/models.py:1625 msgid "remove all tags" msgstr "" -#: documents/models.py:1630 +#: documents/models.py:1632 msgid "remove these document type(s)" msgstr "" -#: documents/models.py:1635 +#: documents/models.py:1637 msgid "remove all document types" msgstr "" -#: documents/models.py:1642 +#: documents/models.py:1644 msgid "remove these correspondent(s)" msgstr "" -#: documents/models.py:1647 +#: documents/models.py:1649 msgid "remove all correspondents" msgstr "" -#: documents/models.py:1654 +#: documents/models.py:1656 msgid "remove these storage path(s)" msgstr "" -#: documents/models.py:1659 +#: documents/models.py:1661 msgid "remove all storage paths" msgstr "" -#: documents/models.py:1666 +#: documents/models.py:1668 msgid "remove these owner(s)" msgstr "" -#: documents/models.py:1671 +#: documents/models.py:1673 msgid "remove all owners" msgstr "" -#: documents/models.py:1678 +#: documents/models.py:1680 msgid "remove view permissions for these users" msgstr "" -#: documents/models.py:1685 +#: documents/models.py:1687 msgid "remove view permissions for these groups" msgstr "" -#: documents/models.py:1692 +#: documents/models.py:1694 msgid "remove change permissions for these users" msgstr "" -#: documents/models.py:1699 +#: documents/models.py:1701 msgid "remove change permissions for these groups" msgstr "" -#: documents/models.py:1704 +#: documents/models.py:1706 msgid "remove all permissions" msgstr "" -#: documents/models.py:1711 +#: documents/models.py:1713 msgid "remove these custom fields" msgstr "" -#: documents/models.py:1716 +#: documents/models.py:1718 msgid "remove all custom fields" msgstr "" -#: documents/models.py:1725 +#: documents/models.py:1727 msgid "email" msgstr "" -#: documents/models.py:1734 +#: documents/models.py:1736 msgid "webhook" msgstr "" -#: documents/models.py:1738 +#: documents/models.py:1740 msgid "passwords" msgstr "" -#: documents/models.py:1742 +#: documents/models.py:1744 msgid "" "Passwords to try when removing PDF protection. Separate with commas or new " "lines." msgstr "" -#: documents/models.py:1747 +#: documents/models.py:1749 msgid "workflow action" msgstr "" -#: documents/models.py:1748 +#: documents/models.py:1750 msgid "workflow actions" msgstr "" -#: documents/models.py:1763 +#: documents/models.py:1765 msgid "triggers" msgstr "" -#: documents/models.py:1770 +#: documents/models.py:1772 msgid "actions" msgstr "" -#: documents/models.py:1773 paperless_mail/models.py:154 +#: documents/models.py:1775 paperless_mail/models.py:154 msgid "enabled" msgstr "" -#: documents/models.py:1784 +#: documents/models.py:1786 msgid "workflow" msgstr "" -#: documents/models.py:1788 +#: documents/models.py:1790 msgid "workflow trigger type" msgstr "" -#: documents/models.py:1802 +#: documents/models.py:1804 msgid "date run" msgstr "" -#: documents/models.py:1808 +#: documents/models.py:1810 msgid "workflow run" msgstr "" -#: documents/models.py:1809 +#: documents/models.py:1811 msgid "workflow runs" msgstr "" #: documents/serialisers.py:463 documents/serialisers.py:815 -#: documents/serialisers.py:2545 documents/views.py:2079 -#: documents/views.py:2134 paperless_mail/serialisers.py:143 +#: documents/serialisers.py:2545 documents/views.py:2120 +#: documents/views.py:2175 paperless_mail/serialisers.py:143 msgid "Insufficient permissions." msgstr "" @@ -1341,7 +1349,7 @@ msgstr "" msgid "Duplicate document identifiers are not allowed." msgstr "" -#: documents/serialisers.py:2631 documents/views.py:3738 +#: documents/serialisers.py:2631 documents/views.py:3784 #, python-format msgid "Documents not found: %(ids)s" msgstr "" @@ -1609,24 +1617,28 @@ msgstr "" msgid "Unable to parse URI {value}" msgstr "" -#: documents/views.py:2072 documents/views.py:2131 +#: documents/views.py:2077 +msgid "Specify only one of text, title_search, query, or more_like_id." +msgstr "" + +#: documents/views.py:2113 documents/views.py:2172 msgid "Invalid more_like_id" msgstr "" -#: documents/views.py:3750 +#: documents/views.py:3796 #, python-format msgid "Insufficient permissions to share document %(id)s." msgstr "" -#: documents/views.py:3793 +#: documents/views.py:3839 msgid "Bundle is already being processed." msgstr "" -#: documents/views.py:3850 +#: documents/views.py:3896 msgid "The share link bundle is still being prepared. Please try again later." msgstr "" -#: documents/views.py:3860 +#: documents/views.py:3906 msgid "The share link bundle is unavailable." msgstr "" From c2f02851da5417817a21b6d237b5a215a7fcec22 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Fri, 3 Apr 2026 14:18:01 -0700 Subject: [PATCH 109/113] Chore: Better typed status manager messages (#12509) --- src/documents/consumer.py | 14 ++-- src/documents/plugins/helpers.py | 91 +++++++++++++++++++++----- src/documents/tests/utils.py | 13 ++-- src/paperless/consumers.py | 25 +++++-- src/paperless/tests/test_websockets.py | 10 ++- 5 files changed, 114 insertions(+), 39 deletions(-) diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 6ae5914b7..f68fa0685 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -139,14 +139,12 @@ class ConsumerPluginMixin: message, current_progress, max_progress, - extra_args={ - "document_id": document_id, - "owner_id": self.metadata.owner_id if self.metadata.owner_id else None, - "users_can_view": (self.metadata.view_users or []) - + (self.metadata.change_users or []), - "groups_can_view": (self.metadata.view_groups or []) - + (self.metadata.change_groups or []), - }, + document_id=document_id, + owner_id=self.metadata.owner_id if self.metadata.owner_id else None, + users_can_view=(self.metadata.view_users or []) + + (self.metadata.change_users or []), + groups_can_view=(self.metadata.view_groups or []) + + (self.metadata.change_groups or []), ) def _fail( diff --git a/src/documents/plugins/helpers.py b/src/documents/plugins/helpers.py index e5cfde3b8..e30591125 100644 --- a/src/documents/plugins/helpers.py +++ b/src/documents/plugins/helpers.py @@ -1,6 +1,9 @@ import enum -from collections.abc import Mapping from typing import TYPE_CHECKING +from typing import Literal +from typing import Self +from typing import TypeAlias +from typing import TypedDict from asgiref.sync import async_to_sync from channels.layers import get_channel_layer @@ -16,6 +19,59 @@ class ProgressStatusOptions(enum.StrEnum): FAILED = "FAILED" +class PermissionsData(TypedDict, total=False): + """Permission fields included in status messages for access control.""" + + owner_id: int | None + users_can_view: list[int] + groups_can_view: list[int] + + +class ProgressUpdateData(TypedDict): + filename: str | None + task_id: str | None + current_progress: int + max_progress: int + status: str + message: str + document_id: int | None + owner_id: int | None + users_can_view: list[int] + groups_can_view: list[int] + + +class StatusUpdatePayload(TypedDict): + type: Literal["status_update"] + data: ProgressUpdateData + + +class DocumentsDeletedData(TypedDict): + documents: list[int] + + +class DocumentsDeletedPayload(TypedDict): + type: Literal["documents_deleted"] + data: DocumentsDeletedData + + +class DocumentUpdatedData(TypedDict): + document_id: int + modified: str + owner_id: int | None + users_can_view: list[int] + groups_can_view: list[int] + + +class DocumentUpdatedPayload(TypedDict): + type: Literal["document_updated"] + data: DocumentUpdatedData + + +WebsocketPayload: TypeAlias = ( + StatusUpdatePayload | DocumentsDeletedPayload | DocumentUpdatedPayload +) + + class BaseStatusManager: """ Handles sending of progress information via the channel layer, with proper management @@ -25,11 +81,11 @@ class BaseStatusManager: def __init__(self) -> None: self._channel: RedisPubSubChannelLayer | None = None - def __enter__(self): + def __enter__(self) -> Self: self.open() return self - def __exit__(self, exc_type, exc_val, exc_tb): + def __exit__(self, exc_type: object, exc_val: object, exc_tb: object) -> None: self.close() def open(self) -> None: @@ -48,7 +104,7 @@ class BaseStatusManager: async_to_sync(self._channel.flush) self._channel = None - def send(self, payload: Mapping[str, object]) -> None: + def send(self, payload: WebsocketPayload) -> None: # Ensure the layer is open self.open() @@ -72,36 +128,36 @@ class ProgressManager(BaseStatusManager): message: str, current_progress: int, max_progress: int, - extra_args: dict[str, str | int | None] | None = None, + *, + document_id: int | None = None, + owner_id: int | None = None, + users_can_view: list[int] | None = None, + groups_can_view: list[int] | None = None, ) -> None: - data: dict[str, object] = { + data: ProgressUpdateData = { "filename": self.filename, "task_id": self.task_id, "current_progress": current_progress, "max_progress": max_progress, "status": status, "message": message, + "document_id": document_id, + "owner_id": owner_id, + "users_can_view": users_can_view or [], + "groups_can_view": groups_can_view or [], } - if extra_args is not None: - data.update(extra_args) - - payload: dict[str, object] = { - "type": "status_update", - "data": data, - } - + payload: StatusUpdatePayload = {"type": "status_update", "data": data} self.send(payload) class DocumentsStatusManager(BaseStatusManager): def send_documents_deleted(self, documents: list[int]) -> None: - payload: dict[str, object] = { + payload: DocumentsDeletedPayload = { "type": "documents_deleted", "data": { "documents": documents, }, } - self.send(payload) def send_document_updated( @@ -113,7 +169,7 @@ class DocumentsStatusManager(BaseStatusManager): users_can_view: list[int] | None = None, groups_can_view: list[int] | None = None, ) -> None: - payload: dict[str, object] = { + payload: DocumentUpdatedPayload = { "type": "document_updated", "data": { "document_id": document_id, @@ -123,5 +179,4 @@ class DocumentsStatusManager(BaseStatusManager): "groups_can_view": groups_can_view or [], }, } - self.send(payload) diff --git a/src/documents/tests/utils.py b/src/documents/tests/utils.py index cc4190974..98c8258b8 100644 --- a/src/documents/tests/utils.py +++ b/src/documents/tests/utils.py @@ -435,7 +435,11 @@ class DummyProgressManager: message: str, current_progress: int, max_progress: int, - extra_args: dict[str, str | int] | None = None, + *, + document_id: int | None = None, + owner_id: int | None = None, + users_can_view: list[int] | None = None, + groups_can_view: list[int] | None = None, ) -> None: # Ensure the layer is open self.open() @@ -449,9 +453,10 @@ class DummyProgressManager: "max_progress": max_progress, "status": status, "message": message, + "document_id": document_id, + "owner_id": owner_id, + "users_can_view": users_can_view or [], + "groups_can_view": groups_can_view or [], }, } - if extra_args is not None: - payload["data"].update(extra_args) - self.payloads.append(payload) diff --git a/src/paperless/consumers.py b/src/paperless/consumers.py index 9d59a1a5a..4a3cda8fe 100644 --- a/src/paperless/consumers.py +++ b/src/paperless/consumers.py @@ -1,16 +1,27 @@ +from __future__ import annotations + import json -from typing import Any +from typing import TYPE_CHECKING from channels.generic.websocket import AsyncWebsocketConsumer +if TYPE_CHECKING: + from django.contrib.auth.base_user import AbstractBaseUser + from django.contrib.auth.models import AnonymousUser + + from documents.plugins.helpers import DocumentsDeletedPayload + from documents.plugins.helpers import DocumentUpdatedPayload + from documents.plugins.helpers import PermissionsData + from documents.plugins.helpers import StatusUpdatePayload + class StatusConsumer(AsyncWebsocketConsumer): def _authenticated(self) -> bool: - user: Any = self.scope.get("user") + user: AbstractBaseUser | AnonymousUser | None = self.scope.get("user") return user is not None and user.is_authenticated - async def _can_view(self, data: dict[str, Any]) -> bool: - user: Any = self.scope.get("user") + async def _can_view(self, data: PermissionsData) -> bool: + user: AbstractBaseUser | AnonymousUser | None = self.scope.get("user") if user is None: return False owner_id = data.get("owner_id") @@ -32,19 +43,19 @@ class StatusConsumer(AsyncWebsocketConsumer): async def disconnect(self, code: int) -> None: await self.channel_layer.group_discard("status_updates", self.channel_name) - async def status_update(self, event: dict[str, Any]) -> None: + async def status_update(self, event: StatusUpdatePayload) -> None: if not self._authenticated(): await self.close() elif await self._can_view(event["data"]): await self.send(json.dumps(event)) - async def documents_deleted(self, event: dict[str, Any]) -> None: + async def documents_deleted(self, event: DocumentsDeletedPayload) -> None: if not self._authenticated(): await self.close() else: await self.send(json.dumps(event)) - async def document_updated(self, event: dict[str, Any]) -> None: + async def document_updated(self, event: DocumentUpdatedPayload) -> None: if not self._authenticated(): await self.close() elif await self._can_view(event["data"]): diff --git a/src/paperless/tests/test_websockets.py b/src/paperless/tests/test_websockets.py index bffc44f82..9f7c9a652 100644 --- a/src/paperless/tests/test_websockets.py +++ b/src/paperless/tests/test_websockets.py @@ -200,7 +200,10 @@ class TestWebSockets: "Test message", 1, 10, - extra_args={"foo": "bar"}, + document_id=42, + owner_id=1, + users_can_view=[2, 3], + groups_can_view=[4], ) assert mock_group_send.call_args[0][1] == { @@ -212,7 +215,10 @@ class TestWebSockets: "max_progress": 10, "status": ProgressStatusOptions.STARTED, "message": "Test message", - "foo": "bar", + "document_id": 42, + "owner_id": 1, + "users_can_view": [2, 3], + "groups_can_view": [4], }, } From b807b107adcb3020b16ad1112d588046eb6b37b9 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 3 Apr 2026 14:51:57 -0700 Subject: [PATCH 110/113] Enhancement: include sharelinks + bundles in export/import (#12479) --- .../management/commands/document_exporter.py | 76 +++++++++++++ .../management/commands/document_importer.py | 60 +++++++++- src/documents/settings.py | 1 + .../tests/test_management_exporter.py | 107 ++++++++++++++++++ 4 files changed, 243 insertions(+), 1 deletion(-) diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py index ee3b44e0c..562a2ca8d 100644 --- a/src/documents/management/commands/document_exporter.py +++ b/src/documents/management/commands/document_exporter.py @@ -45,6 +45,8 @@ from documents.models import DocumentType from documents.models import Note from documents.models import SavedView from documents.models import SavedViewFilterRule +from documents.models import ShareLink +from documents.models import ShareLinkBundle from documents.models import StoragePath from documents.models import Tag from documents.models import UiSettings @@ -55,6 +57,7 @@ from documents.models import WorkflowActionWebhook from documents.models import WorkflowTrigger from documents.settings import EXPORTER_ARCHIVE_NAME from documents.settings import EXPORTER_FILE_NAME +from documents.settings import EXPORTER_SHARE_LINK_BUNDLE_NAME from documents.settings import EXPORTER_THUMBNAIL_NAME from documents.utils import compute_checksum from documents.utils import copy_file_with_basic_stats @@ -389,6 +392,8 @@ class Command(CryptMixin, PaperlessCommand): "app_configs": ApplicationConfiguration.objects.all(), "notes": Note.global_objects.all(), "documents": Document.global_objects.order_by("id").all(), + "share_links": ShareLink.global_objects.all(), + "share_link_bundles": ShareLinkBundle.objects.order_by("id").all(), "social_accounts": SocialAccount.objects.all(), "social_apps": SocialApp.objects.all(), "social_tokens": SocialToken.objects.all(), @@ -409,6 +414,7 @@ class Command(CryptMixin, PaperlessCommand): ) document_manifest: list[dict] = [] + share_link_bundle_manifest: list[dict] = [] manifest_path = (self.target / "manifest.json").resolve() with StreamingManifestWriter( @@ -427,6 +433,15 @@ class Command(CryptMixin, PaperlessCommand): for record in batch: self._encrypt_record_inline(record) document_manifest.extend(batch) + elif key == "share_link_bundles": + # Accumulate for file-copy loop; written to manifest after + for batch in serialize_queryset_batched( + qs, + batch_size=self.batch_size, + ): + for record in batch: + self._encrypt_record_inline(record) + share_link_bundle_manifest.extend(batch) elif self.split_manifest and key in ( "notes", "custom_field_instances", @@ -445,6 +460,12 @@ class Command(CryptMixin, PaperlessCommand): document_map: dict[int, Document] = { d.pk: d for d in Document.global_objects.order_by("id") } + share_link_bundle_map: dict[int, ShareLinkBundle] = { + b.pk: b + for b in ShareLinkBundle.objects.order_by("id").prefetch_related( + "documents", + ) + } # 3. Export files from each document for index, document_dict in enumerate( @@ -478,6 +499,19 @@ class Command(CryptMixin, PaperlessCommand): else: writer.write_record(document_dict) + for bundle_dict in share_link_bundle_manifest: + bundle = share_link_bundle_map[bundle_dict["pk"]] + + bundle_target = self.generate_share_link_bundle_target( + bundle, + bundle_dict, + ) + + if not self.data_only and bundle_target is not None: + self.copy_share_link_bundle_file(bundle, bundle_target) + + writer.write_record(bundle_dict) + # 4.2 write version information to target folder extra_metadata_path = (self.target / "metadata.json").resolve() metadata: dict[str, str | int | dict[str, str | int]] = { @@ -598,6 +632,48 @@ class Command(CryptMixin, PaperlessCommand): archive_target, ) + def generate_share_link_bundle_target( + self, + bundle: ShareLinkBundle, + bundle_dict: dict, + ) -> Path | None: + """ + Generates the export target for a share link bundle file, when present. + """ + if not bundle.file_path: + return None + + stored_bundle_path = Path(bundle.file_path) + portable_bundle_path = ( + stored_bundle_path + if not stored_bundle_path.is_absolute() + else Path(stored_bundle_path.name) + ) + export_bundle_path = Path("share_link_bundles") / portable_bundle_path + + bundle_dict["fields"]["file_path"] = portable_bundle_path.as_posix() + bundle_dict[EXPORTER_SHARE_LINK_BUNDLE_NAME] = export_bundle_path.as_posix() + + return (self.target / export_bundle_path).resolve() + + def copy_share_link_bundle_file( + self, + bundle: ShareLinkBundle, + bundle_target: Path, + ) -> None: + """ + Copies a share link bundle ZIP into the export directory. + """ + bundle_source_path = bundle.absolute_file_path + if bundle_source_path is None: + raise FileNotFoundError(f"Share link bundle {bundle.pk} has no file path") + + self.check_and_copy( + bundle_source_path, + None, + bundle_target, + ) + def _encrypt_record_inline(self, record: dict) -> None: """Encrypt sensitive fields in a single record, if passphrase is set.""" if not self.passphrase: diff --git a/src/documents/management/commands/document_importer.py b/src/documents/management/commands/document_importer.py index 4572b4617..becdf7b76 100644 --- a/src/documents/management/commands/document_importer.py +++ b/src/documents/management/commands/document_importer.py @@ -32,10 +32,12 @@ from documents.models import CustomFieldInstance from documents.models import Document from documents.models import DocumentType from documents.models import Note +from documents.models import ShareLinkBundle from documents.models import Tag from documents.settings import EXPORTER_ARCHIVE_NAME from documents.settings import EXPORTER_CRYPTO_SETTINGS_NAME from documents.settings import EXPORTER_FILE_NAME +from documents.settings import EXPORTER_SHARE_LINK_BUNDLE_NAME from documents.settings import EXPORTER_THUMBNAIL_NAME from documents.signals.handlers import check_paths_and_prune_custom_fields from documents.signals.handlers import update_filename_and_move_files @@ -348,18 +350,42 @@ class Command(CryptMixin, PaperlessCommand): f"Failed to read from archive file {doc_archive_path}", ) from e + def check_share_link_bundle_validity(bundle_record: dict) -> None: + if EXPORTER_SHARE_LINK_BUNDLE_NAME not in bundle_record: + return + + bundle_file = bundle_record[EXPORTER_SHARE_LINK_BUNDLE_NAME] + bundle_path: Path = self.source / bundle_file + if not bundle_path.exists(): + raise CommandError( + f'The manifest file refers to "{bundle_file}" which does not ' + "appear to be in the source directory.", + ) + try: + with bundle_path.open(mode="rb"): + pass + except Exception as e: + raise CommandError( + f"Failed to read from share link bundle file {bundle_path}", + ) from e + self.stdout.write("Checking the manifest") for manifest_path in self.manifest_paths: for record in iter_manifest_records(manifest_path): # Only check if the document files exist if this is not data only # We don't care about documents for a data only import - if not self.data_only and record["model"] == "documents.document": + if self.data_only: + continue + if record["model"] == "documents.document": check_document_validity(record) + elif record["model"] == "documents.sharelinkbundle": + check_share_link_bundle_validity(record) def _import_files_from_manifest(self) -> None: settings.ORIGINALS_DIR.mkdir(parents=True, exist_ok=True) settings.THUMBNAIL_DIR.mkdir(parents=True, exist_ok=True) settings.ARCHIVE_DIR.mkdir(parents=True, exist_ok=True) + settings.SHARE_LINK_BUNDLE_DIR.mkdir(parents=True, exist_ok=True) self.stdout.write("Copy files into paperless...") @@ -374,6 +400,18 @@ class Command(CryptMixin, PaperlessCommand): for record in iter_manifest_records(manifest_path) if record["model"] == "documents.document" ] + share_link_bundle_records = [ + { + "pk": record["pk"], + EXPORTER_SHARE_LINK_BUNDLE_NAME: record.get( + EXPORTER_SHARE_LINK_BUNDLE_NAME, + ), + } + for manifest_path in self.manifest_paths + for record in iter_manifest_records(manifest_path) + if record["model"] == "documents.sharelinkbundle" + and record.get(EXPORTER_SHARE_LINK_BUNDLE_NAME) + ] for record in self.track(document_records, description="Copying files..."): document = Document.global_objects.get(pk=record["pk"]) @@ -416,6 +454,26 @@ class Command(CryptMixin, PaperlessCommand): document.save() + for record in self.track( + share_link_bundle_records, + description="Copying share link bundles...", + ): + bundle = ShareLinkBundle.objects.get(pk=record["pk"]) + bundle_file = record[EXPORTER_SHARE_LINK_BUNDLE_NAME] + bundle_source_path = (self.source / bundle_file).resolve() + bundle_target_path = bundle.absolute_file_path + if bundle_target_path is None: + raise CommandError( + f"Share link bundle {bundle.pk} does not have a valid file path.", + ) + + with FileLock(settings.MEDIA_LOCK): + bundle_target_path.parent.mkdir(parents=True, exist_ok=True) + copy_file_with_basic_stats( + bundle_source_path, + bundle_target_path, + ) + def _decrypt_record_if_needed(self, record: dict) -> dict: fields = self.CRYPT_FIELDS_BY_MODEL.get(record.get("model", "")) if fields: diff --git a/src/documents/settings.py b/src/documents/settings.py index 9dff44c95..c4c87b8a7 100644 --- a/src/documents/settings.py +++ b/src/documents/settings.py @@ -3,6 +3,7 @@ EXPORTER_FILE_NAME = "__exported_file_name__" EXPORTER_THUMBNAIL_NAME = "__exported_thumbnail_name__" EXPORTER_ARCHIVE_NAME = "__exported_archive_name__" +EXPORTER_SHARE_LINK_BUNDLE_NAME = "__exported_share_link_bundle_name__" EXPORTER_CRYPTO_SETTINGS_NAME = "__crypto__" EXPORTER_CRYPTO_SALT_NAME = "__salt_hex__" diff --git a/src/documents/tests/test_management_exporter.py b/src/documents/tests/test_management_exporter.py index a214ef51d..4ee7677ca 100644 --- a/src/documents/tests/test_management_exporter.py +++ b/src/documents/tests/test_management_exporter.py @@ -2,6 +2,7 @@ import hashlib import json import shutil import tempfile +from datetime import timedelta from io import StringIO from pathlib import Path from unittest import mock @@ -11,6 +12,7 @@ import pytest from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.models import SocialApp from allauth.socialaccount.models import SocialToken +from django.conf import settings from django.contrib.auth.models import Group from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType @@ -31,6 +33,8 @@ from documents.models import CustomFieldInstance from documents.models import Document from documents.models import DocumentType from documents.models import Note +from documents.models import ShareLink +from documents.models import ShareLinkBundle from documents.models import StoragePath from documents.models import Tag from documents.models import User @@ -39,6 +43,7 @@ from documents.models import WorkflowAction from documents.models import WorkflowTrigger from documents.sanity_checker import check_sanity from documents.settings import EXPORTER_FILE_NAME +from documents.settings import EXPORTER_SHARE_LINK_BUNDLE_NAME from documents.tests.utils import DirectoriesMixin from documents.tests.utils import FileSystemAssertsMixin from documents.tests.utils import SampleDirMixin @@ -306,6 +311,108 @@ class TestExportImport( ): self.test_exporter(use_filename_format=True) + def test_exporter_includes_share_links_and_bundles(self) -> None: + shutil.rmtree(Path(self.dirs.media_dir) / "documents") + shutil.copytree( + Path(__file__).parent / "samples" / "documents", + Path(self.dirs.media_dir) / "documents", + ) + + share_link = ShareLink.objects.create( + slug="share-link-slug", + document=self.d1, + owner=self.user, + file_version=ShareLink.FileVersion.ORIGINAL, + expiration=timezone.now() + timedelta(days=7), + ) + + bundle_relative_path = Path("nested") / "share-bundle.zip" + bundle_source_path = settings.SHARE_LINK_BUNDLE_DIR / bundle_relative_path + bundle_source_path.parent.mkdir(parents=True, exist_ok=True) + bundle_source_path.write_bytes(b"share-bundle-contents") + bundle = ShareLinkBundle.objects.create( + slug="share-bundle-slug", + owner=self.user, + file_version=ShareLink.FileVersion.ARCHIVE, + expiration=timezone.now() + timedelta(days=7), + status=ShareLinkBundle.Status.READY, + size_bytes=bundle_source_path.stat().st_size, + file_path=str(bundle_relative_path), + built_at=timezone.now(), + ) + bundle.documents.set([self.d1, self.d2]) + + manifest = self._do_export() + + share_link_records = [ + record for record in manifest if record["model"] == "documents.sharelink" + ] + self.assertEqual(len(share_link_records), 1) + self.assertEqual(share_link_records[0]["pk"], share_link.pk) + self.assertEqual(share_link_records[0]["fields"]["document"], self.d1.pk) + self.assertEqual(share_link_records[0]["fields"]["owner"], self.user.pk) + + share_link_bundle_records = [ + record + for record in manifest + if record["model"] == "documents.sharelinkbundle" + ] + self.assertEqual(len(share_link_bundle_records), 1) + bundle_record = share_link_bundle_records[0] + self.assertEqual(bundle_record["pk"], bundle.pk) + self.assertEqual( + bundle_record["fields"]["documents"], + [self.d1.pk, self.d2.pk], + ) + self.assertEqual( + bundle_record[EXPORTER_SHARE_LINK_BUNDLE_NAME], + "share_link_bundles/nested/share-bundle.zip", + ) + self.assertEqual( + bundle_record["fields"]["file_path"], + "nested/share-bundle.zip", + ) + self.assertIsFile(self.target / bundle_record[EXPORTER_SHARE_LINK_BUNDLE_NAME]) + + with paperless_environment(): + ShareLink.objects.all().delete() + ShareLinkBundle.objects.all().delete() + shutil.rmtree(settings.SHARE_LINK_BUNDLE_DIR, ignore_errors=True) + + call_command( + "document_importer", + "--no-progress-bar", + self.target, + skip_checks=True, + ) + + imported_share_link = ShareLink.objects.get(pk=share_link.pk) + self.assertEqual(imported_share_link.document_id, self.d1.pk) + self.assertEqual(imported_share_link.owner_id, self.user.pk) + self.assertEqual( + imported_share_link.file_version, + ShareLink.FileVersion.ORIGINAL, + ) + + imported_bundle = ShareLinkBundle.objects.get(pk=bundle.pk) + imported_bundle_path = imported_bundle.absolute_file_path + self.assertEqual(imported_bundle.owner_id, self.user.pk) + self.assertEqual( + list( + imported_bundle.documents.order_by("pk").values_list( + "pk", + flat=True, + ), + ), + [self.d1.pk, self.d2.pk], + ) + self.assertEqual(imported_bundle.file_path, "nested/share-bundle.zip") + self.assertIsNotNone(imported_bundle_path) + self.assertEqual( + imported_bundle_path.read_bytes(), + b"share-bundle-contents", + ) + def test_update_export_changed_time(self) -> None: shutil.rmtree(Path(self.dirs.media_dir) / "documents") shutil.copytree( From c039df423fdb9aa11b5431794e5b9c611772b83c Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 3 Apr 2026 15:41:38 -0700 Subject: [PATCH 111/113] Documentation: note required secret key in v3 guide (#12513) --- docs/migration-v3.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/migration-v3.md b/docs/migration-v3.md index 1cfb212ff..afbc83186 100644 --- a/docs/migration-v3.md +++ b/docs/migration-v3.md @@ -1,5 +1,24 @@ # v3 Migration Guide +## Secret Key is Now Required + +The `PAPERLESS_SECRET_KEY` environment variable is now required. This is a critical security setting used for cryptographic signing and should be set to a long, random value. + +### Action Required + +If you are upgrading an existing installation, you must now set `PAPERLESS_SECRET_KEY` explicitly. + +If your installation was relying on the previous built-in default key, you have two options: + +- Set `PAPERLESS_SECRET_KEY` to that previous value to preserve existing sessions and tokens. +- Set `PAPERLESS_SECRET_KEY` to a new random value to improve security, understanding that this will invalidate existing sessions and other signed tokens. + +For new installations, or if you choose to rotate the key, you may generate a new secret key with: + +```bash +python3 -c "import secrets; print(secrets.token_urlsafe(64))" +``` + ## Consumer Settings Changes The v3 consumer command uses a [different library](https://watchfiles.helpmanual.io/) to unify From 5f5fb263c96047b28d4197916418b992bd1e1c92 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Fri, 3 Apr 2026 17:34:15 -0700 Subject: [PATCH 112/113] Fix: Don't create a new note highlight generator per note in the loop (#12512) --- src/documents/search/_backend.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/documents/search/_backend.py b/src/documents/search/_backend.py index 405c24360..2005a436f 100644 --- a/src/documents/search/_backend.py +++ b/src/documents/search/_backend.py @@ -532,6 +532,7 @@ class TantivyBackend: # Build result hits with highlights hits: list[SearchHit] = [] snippet_generator = None + notes_snippet_generator = None for rank, (doc_address, score) in enumerate(page_hits, start=offset + 1): # Get the actual document from the searcher using the doc address @@ -558,13 +559,16 @@ class TantivyBackend: # Try notes highlights if "notes" in doc_dict: - notes_generator = tantivy.SnippetGenerator.create( - searcher, - final_query, - self._schema, - "notes", + if notes_snippet_generator is None: + notes_snippet_generator = tantivy.SnippetGenerator.create( + searcher, + final_query, + self._schema, + "notes", + ) + notes_snippet = notes_snippet_generator.snippet_from_doc( + actual_doc, ) - notes_snippet = notes_generator.snippet_from_doc(actual_doc) if notes_snippet: highlights["notes"] = str(notes_snippet) From a945cd9379e5358e25cf256d80b9153fb9d273a3 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 3 Apr 2026 21:17:23 -0700 Subject: [PATCH 113/113] Security: add static analysis CI workflow (#12466) --- .github/workflows/ci-backend.yml | 5 +++ .github/workflows/ci-docker.yml | 2 ++ .github/workflows/ci-docs.yml | 3 ++ .github/workflows/ci-frontend.yml | 9 +++++ .github/workflows/ci-lint.yml | 2 ++ .github/workflows/ci-release.yml | 3 ++ .github/workflows/ci-static-analysis.yml | 42 ++++++++++++++++++++++++ .github/workflows/codeql-analysis.yml | 2 ++ .github/workflows/crowdin.yml | 1 + .github/workflows/translate-strings.yml | 1 + 10 files changed, 70 insertions(+) create mode 100644 .github/workflows/ci-static-analysis.yml diff --git a/.github/workflows/ci-backend.yml b/.github/workflows/ci-backend.yml index f92d1fb00..cff139e8c 100644 --- a/.github/workflows/ci-backend.yml +++ b/.github/workflows/ci-backend.yml @@ -24,6 +24,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 + persist-credentials: false - name: Decide run mode id: force run: | @@ -72,6 +73,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false - name: Start containers run: | docker compose --file docker/compose/docker-compose.ci-test.yml pull --quiet @@ -145,6 +148,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false - name: Set up Python id: setup-python uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 48d258dca..43b79728d 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -42,6 +42,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false - name: Determine ref name id: ref run: | diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 68f202264..a598a3c9d 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -26,6 +26,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 + persist-credentials: false - name: Decide run mode id: force run: | @@ -71,6 +72,8 @@ jobs: - uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false - name: Set up Python id: setup-python uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 diff --git a/.github/workflows/ci-frontend.yml b/.github/workflows/ci-frontend.yml index dffb54e6b..9d4e23a1a 100644 --- a/.github/workflows/ci-frontend.yml +++ b/.github/workflows/ci-frontend.yml @@ -62,6 +62,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: @@ -90,6 +92,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: @@ -125,6 +129,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: @@ -176,6 +182,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: @@ -209,6 +217,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 2 + persist-credentials: false - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml index bf1458e1d..314250719 100644 --- a/.github/workflows/ci-lint.yml +++ b/.github/workflows/ci-lint.yml @@ -16,6 +16,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false - name: Install Python uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index b38ecbc40..030e3bcad 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -29,6 +29,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false # ---- Frontend Build ---- - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 @@ -179,6 +181,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: main + persist-credentials: true # for pushing changelog branch - name: Set up Python id: setup-python uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 diff --git a/.github/workflows/ci-static-analysis.yml b/.github/workflows/ci-static-analysis.yml new file mode 100644 index 000000000..99388354a --- /dev/null +++ b/.github/workflows/ci-static-analysis.yml @@ -0,0 +1,42 @@ +name: Static Analysis +on: + push: + branches-ignore: + - 'translations**' + pull_request: + branches-ignore: + - 'translations**' + workflow_dispatch: +concurrency: + group: static-analysis-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +permissions: + contents: read +jobs: + zizmor: + name: Run zizmor + runs-on: ubuntu-24.04 + permissions: + contents: read + actions: read + security-events: write + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + - name: Run zizmor + uses: zizmorcore/zizmor-action@71321a20a9ded102f6e9ce5718a2fcec2c4f70d8 # v0.5.2 + semgrep: + name: Semgrep CE + runs-on: ubuntu-24.04 + container: + image: semgrep/semgrep:1.155.0@sha256:cc869c685dcc0fe497c86258da9f205397d8108e56d21a86082ea4886e52784d + if: github.actor != 'dependabot[bot]' + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + - name: Run Semgrep + run: semgrep scan --config auto diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 08c2bc1a2..e295e938d 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -35,6 +35,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@c793b717bc78562f491db7b0e93a3a178b099162 # v4.32.5 diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml index 38e73bbb5..29b4be02f 100644 --- a/.github/workflows/crowdin.yml +++ b/.github/workflows/crowdin.yml @@ -16,6 +16,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: token: ${{ secrets.PNGX_BOT_PAT }} + persist-credentials: false - name: crowdin action uses: crowdin/github-action@8818ff65bfc4322384f983ea37e3926948c11745 # v2.15.0 with: diff --git a/.github/workflows/translate-strings.yml b/.github/workflows/translate-strings.yml index c38886bc2..ad894abe7 100644 --- a/.github/workflows/translate-strings.yml +++ b/.github/workflows/translate-strings.yml @@ -17,6 +17,7 @@ jobs: with: token: ${{ secrets.PNGX_BOT_PAT }} ref: ${{ env.GH_REF }} + persist-credentials: true # for pushing translation branch - name: Set up Python id: setup-python uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0