diff --git a/backend/src/api/routes/documents.py b/backend/src/api/routes/documents.py
index d43c4d0..103a6e1 100644
--- a/backend/src/api/routes/documents.py
+++ b/backend/src/api/routes/documents.py
@@ -83,12 +83,13 @@ router = APIRouter()
@router.get("/", response_model=List[DocumentResponse])
async def list_documents(
skip: int = 0,
- limit: int = 50,
+ limit: int = 50, # 기본값 복원
tag: Optional[str] = None,
search: Optional[str] = None,
current_user: User = Depends(get_current_active_user),
db: AsyncSession = Depends(get_db)
):
+ """페이지네이션이 있는 문서 목록 조회"""
"""문서 목록 조회"""
query = select(Document).options(
selectinload(Document.uploader),
@@ -160,6 +161,70 @@ async def list_documents(
return response_data
+@router.get("/all", response_model=List[DocumentResponse])
+async def list_all_documents(
+ current_user: User = Depends(get_current_active_user),
+ db: AsyncSession = Depends(get_db)
+):
+ """모든 문서 조회 (페이지네이션 없음) - 프론트엔드 전용"""
+
+ query = select(Document).options(
+ selectinload(Document.uploader),
+ selectinload(Document.tags),
+ selectinload(Document.book), # 서적 정보 추가
+ selectinload(Document.category) # 소분류 정보 추가
+ )
+
+ # 권한 필터링 (관리자가 아니면 공개 문서 + 자신이 업로드한 문서만)
+ if not current_user.is_admin:
+ query = query.where(
+ or_(
+ Document.is_public == True,
+ Document.uploaded_by == current_user.id
+ )
+ )
+
+ query = query.order_by(Document.created_at.desc())
+
+ result = await db.execute(query)
+ documents = result.scalars().all()
+
+ # 응답 데이터 변환
+ response_data = []
+ for doc in documents:
+ doc_data = DocumentResponse(
+ id=str(doc.id),
+ title=doc.title,
+ description=doc.description,
+ html_path=doc.html_path, # None 가능 (PDF만 업로드한 경우)
+ pdf_path=doc.pdf_path,
+ thumbnail_path=doc.thumbnail_path,
+ file_size=doc.file_size,
+ page_count=doc.page_count,
+ language=doc.language,
+ is_public=doc.is_public,
+ is_processed=doc.is_processed,
+ created_at=doc.created_at,
+ updated_at=doc.updated_at,
+ document_date=doc.document_date,
+ uploader_name=doc.uploader.full_name or doc.uploader.email,
+ tags=[tag.name for tag in doc.tags],
+ # 서적 정보 추가
+ book_id=str(doc.book.id) if doc.book else None,
+ book_title=doc.book.title if doc.book else None,
+ book_author=doc.book.author if doc.book else None,
+ # 소분류 정보 추가
+ category_id=str(doc.category.id) if doc.category else None,
+ category_name=doc.category.name if doc.category else None,
+ sort_order=doc.sort_order,
+ # PDF 매칭 정보 추가
+ matched_pdf_id=str(doc.matched_pdf_id) if doc.matched_pdf_id else None
+ )
+ response_data.append(doc_data)
+
+ return response_data
+
+
@router.get("/hierarchy/structured", response_model=dict)
async def get_documents_by_hierarchy(
current_user: User = Depends(get_current_active_user),
@@ -375,10 +440,14 @@ async def upload_document(
await db.commit()
- # 문서 정보를 다시 로드 (태그 포함)
+ # 문서 정보를 다시 로드 (태그, 서적, 카테고리 포함)
result = await db.execute(
select(Document)
- .options(selectinload(Document.tags))
+ .options(
+ selectinload(Document.tags),
+ selectinload(Document.book),
+ selectinload(Document.category)
+ )
.where(Document.id == document.id)
)
document_with_tags = result.scalar_one()
@@ -401,6 +470,14 @@ async def upload_document(
document_date=document_with_tags.document_date,
uploader_name=current_user.full_name or current_user.email,
tags=[tag.name for tag in document_with_tags.tags],
+ # 서적 정보 추가
+ book_id=str(document_with_tags.book.id) if document_with_tags.book else None,
+ book_title=document_with_tags.book.title if document_with_tags.book else None,
+ book_author=document_with_tags.book.author if document_with_tags.book else None,
+ # 소분류 정보 추가
+ category_id=str(document_with_tags.category.id) if document_with_tags.category else None,
+ category_name=document_with_tags.category.name if document_with_tags.category else None,
+ sort_order=document_with_tags.sort_order,
matched_pdf_id=str(document_with_tags.matched_pdf_id) if document_with_tags.matched_pdf_id else None
)
diff --git a/frontend/book-editor.html b/frontend/book-editor.html
index 6a86ed6..f297e6f 100644
--- a/frontend/book-editor.html
+++ b/frontend/book-editor.html
@@ -95,16 +95,29 @@
rows="3"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
+
+
+
+
+
+
+
-
+
-
- 문서 순서 및 PDF 매칭
+
+ HTML 문서 순서 및 PDF 매칭
+
+
+
+
+
+
+ 등록된 PDF 문서 관리
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PDF 전용
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/index.html b/frontend/index.html
index 5ab9c33..714c004 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -150,7 +150,10 @@
-
+
+
+
+
@@ -222,11 +225,22 @@
-
+
-
-
+
+
+
+ 편집
+
+
@@ -319,7 +327,7 @@
title="다운로드">
-
diff --git a/frontend/static/js/api.js b/frontend/static/js/api.js
index adb6313..f418b32 100644
--- a/frontend/static/js/api.js
+++ b/frontend/static/js/api.js
@@ -213,6 +213,11 @@ class DocumentServerAPI {
return await this.get('/documents/', params);
}
+ async getAllDocuments() {
+ // 모든 문서를 가져오는 전용 엔드포인트
+ return await this.get('/documents/all');
+ }
+
async getDocumentsHierarchy() {
return await this.get('/documents/hierarchy/structured');
}
@@ -429,6 +434,14 @@ class DocumentServerAPI {
return await this.post('/books', bookData);
}
+ async updateBook(bookId, bookData) {
+ return await this.put(`/books/${bookId}`, bookData);
+ }
+
+ async deleteBook(bookId) {
+ return await this.delete(`/books/${bookId}`);
+ }
+
async getBook(bookId) {
return await this.get(`/books/${bookId}`);
}
diff --git a/frontend/static/js/book-documents.js b/frontend/static/js/book-documents.js
index 847a3c6..0f7baf5 100644
--- a/frontend/static/js/book-documents.js
+++ b/frontend/static/js/book-documents.js
@@ -75,7 +75,7 @@ window.bookDocumentsApp = () => ({
try {
// 모든 문서 가져오기
- const allDocuments = await window.api.getDocuments();
+ const allDocuments = await window.api.getAllDocuments();
if (this.bookId === 'none') {
// 서적 미분류 HTML 문서들만 (폴더로 구분)
diff --git a/frontend/static/js/book-editor.js b/frontend/static/js/book-editor.js
index 66185e1..1ebfcef 100644
--- a/frontend/static/js/book-editor.js
+++ b/frontend/static/js/book-editor.js
@@ -1,7 +1,8 @@
// 서적 편집 애플리케이션 컴포넌트
window.bookEditorApp = () => ({
// 상태 관리
- documents: [],
+ documents: [], // HTML 문서들 (순서 관리용)
+ pdfDocuments: [], // PDF 전용 문서들 (별도 관리용)
bookInfo: {},
availablePDFs: [],
loading: false,
@@ -40,8 +41,9 @@ window.bookEditorApp = () => ({
// URL 파라미터 파싱
parseUrlParams() {
const urlParams = new URLSearchParams(window.location.search);
- this.bookId = urlParams.get('bookId');
+ this.bookId = urlParams.get('id') || urlParams.get('bookId'); // 'id' 또는 'bookId' 파라미터 지원
console.log('📖 편집할 서적 ID:', this.bookId);
+ console.log('📖 URL 파라미터들:', Object.fromEntries(urlParams));
},
// 인증 상태 확인
@@ -74,21 +76,35 @@ window.bookEditorApp = () => ({
this.error = '';
try {
+ console.log('🔍 서적 ID 확인:', this.bookId);
+
// 서적 정보 로드
this.bookInfo = await window.api.getBook(this.bookId);
console.log('📚 서적 정보 로드:', this.bookInfo);
- // 모든 문서 가져와서 이 서적에 속한 HTML 문서들만 필터링 (폴더로 구분)
- const allDocuments = await window.api.getDocuments();
+ // 모든 문서 가져와서 이 서적에 속한 문서들 필터링
+ const allDocuments = await window.api.getAllDocuments();
+
+ // HTML 문서만 (순서 관리용)
this.documents = allDocuments
.filter(doc =>
doc.book_id === this.bookId &&
- doc.html_path &&
- doc.html_path.includes('/documents/') // HTML은 documents 폴더에 저장됨
+ doc.html_path &&
+ doc.html_path.includes('/documents/')
)
.sort((a, b) => (a.sort_order || 0) - (b.sort_order || 0)); // 순서대로 정렬
- console.log('📄 서적 문서들:', this.documents.length, '개');
+ // PDF 전용 문서들 (별도 관리용)
+ this.pdfDocuments = allDocuments
+ .filter(doc =>
+ doc.book_id === this.bookId &&
+ doc.pdf_path &&
+ !doc.html_path // PDF만 있는 문서
+ )
+ .sort((a, b) => new Date(b.created_at) - new Date(a.created_at)); // 최신순
+
+ console.log('📄 HTML 문서들:', this.documents.length, '개 (순서 관리)');
+ console.log('📕 PDF 전용 문서들:', this.pdfDocuments.length, '개 (별도 관리)');
// 각 문서의 PDF 매칭 상태 확인
this.documents.forEach((doc, index) => {
@@ -295,6 +311,93 @@ window.bookEditorApp = () => ({
}
},
+ // 서적 정보 저장
+ async saveBookInfo() {
+ try {
+ await window.api.updateBook(this.bookId, {
+ title: this.bookInfo.title,
+ author: this.bookInfo.author,
+ description: this.bookInfo.description
+ });
+
+ this.showNotification('서적 정보가 저장되었습니다', 'success');
+ } catch (error) {
+ console.error('서적 정보 저장 실패:', error);
+ this.showNotification('서적 정보 저장에 실패했습니다: ' + error.message, 'error');
+ }
+ },
+
+ // 서적 삭제 (모든 문서 포함)
+ async deleteBook() {
+ if (!this.bookInfo.title) {
+ alert('서적 정보가 로드되지 않았습니다.');
+ return;
+ }
+
+ const confirmMessage = `"${this.bookInfo.title}" 서적을 완전히 삭제하시겠습니까?\n\n⚠️ 경고: 이 작업은 되돌릴 수 없습니다!\n\n삭제될 항목:\n- 서적 정보\n- HTML 문서 ${this.documents.length}개\n- PDF 전용 문서 ${this.pdfDocuments.length}개\n- 관련된 모든 하이라이트, 노트, 링크`;
+
+ if (!confirm(confirmMessage)) {
+ return;
+ }
+
+ // 한 번 더 확인
+ const finalConfirm = prompt(`정말로 삭제하시려면 서적 제목을 입력하세요:\n"${this.bookInfo.title}"`);
+ if (finalConfirm !== this.bookInfo.title) {
+ alert('서적 제목이 일치하지 않습니다. 삭제가 취소되었습니다.');
+ return;
+ }
+
+ try {
+ // 서적에 속한 모든 HTML 문서 삭제
+ for (const doc of this.documents) {
+ console.log(`🗑️ HTML 문서 삭제 중: ${doc.title}`);
+ await window.api.deleteDocument(doc.id);
+ }
+
+ // 서적에 속한 모든 PDF 전용 문서 삭제
+ for (const doc of this.pdfDocuments) {
+ console.log(`🗑️ PDF 문서 삭제 중: ${doc.title}`);
+ await window.api.deleteDocument(doc.id);
+ }
+
+ // 서적 삭제
+ await window.api.deleteBook(this.bookId);
+
+ alert('서적이 완전히 삭제되었습니다.');
+
+ // 메인 페이지로 이동
+ window.location.href = '/index.html';
+ } catch (error) {
+ console.error('서적 삭제 실패:', error);
+ alert('서적 삭제에 실패했습니다: ' + error.message);
+ }
+ },
+
+ // PDF 미리보기
+ previewPDF(pdf) {
+ // PDF 뷰어 페이지로 이동
+ window.open(`/viewer.html?id=${pdf.id}`, '_blank');
+ },
+
+ // PDF 삭제
+ async deletePDF(pdf) {
+ if (!confirm(`"${pdf.title}" PDF 문서를 삭제하시겠습니까?\n\n이 작업은 되돌릴 수 없습니다.`)) {
+ return;
+ }
+
+ try {
+ await window.api.deleteDocument(pdf.id);
+
+ // PDF 목록에서 제거
+ this.pdfDocuments = this.pdfDocuments.filter(p => p.id !== pdf.id);
+
+ this.showNotification('PDF 문서가 삭제되었습니다', 'success');
+ } catch (error) {
+ console.error('PDF 삭제 실패:', error);
+ this.showNotification('PDF 삭제에 실패했습니다: ' + error.message, 'error');
+ }
+ },
+
// 뒤로가기
goBack() {
window.location.href = `book-documents.html?bookId=${this.bookId}`;
diff --git a/frontend/static/js/main.js b/frontend/static/js/main.js
index b4cbb47..4b0b5f7 100644
--- a/frontend/static/js/main.js
+++ b/frontend/static/js/main.js
@@ -134,7 +134,10 @@ window.documentApp = () => ({
this.error = '';
try {
- const allDocuments = await window.api.getDocuments();
+ const allDocuments = await window.api.getAllDocuments();
+
+ // 디버깅: API 응답 원본 확인
+ console.log('🔍 API 응답 원본 (첫 3개):', JSON.stringify(allDocuments.slice(0, 3), null, 2));
// HTML 문서만 필터링 (PDF 파일 제외)
this.documents = allDocuments.filter(doc =>
@@ -146,6 +149,19 @@ window.documentApp = () => ({
console.log('📄 HTML 문서:', this.documents.length, '개');
console.log('📄 PDF 파일:', allDocuments.length - this.documents.length, '개 (제외됨)');
+ // 디버깅: 사라진 문서 찾기
+ console.log('🔍 HTML 경로가 있는 문서들:');
+ allDocuments.forEach(doc => {
+ if (doc.html_path) {
+ console.log(` - ${doc.title}: ${doc.html_path}`);
+ }
+ });
+
+ console.log('🔍 필터링된 문서들:');
+ this.documents.forEach(doc => {
+ console.log(` - ${doc.title}: ${doc.html_path}`);
+ });
+
this.updateAvailableTags();
this.filterDocuments();
this.syncUIState(); // UI 상태 동기화
@@ -206,6 +222,32 @@ window.documentApp = () => ({
this.filterDocuments();
},
+ // 서적 삭제
+ async deleteBook(book) {
+ if (!book || !book.id) {
+ alert('서적 정보가 올바르지 않습니다.');
+ return;
+ }
+
+ const confirmMessage = `"${book.title}" 서적을 삭제하시겠습니까?\n\n⚠️ 주의: 이 서적에 속한 모든 문서들이 '서적 미분류'로 이동됩니다.`;
+
+ if (!confirm(confirmMessage)) {
+ return;
+ }
+
+ try {
+ await window.api.deleteBook(book.id);
+
+ // 문서 목록 다시 로드
+ await this.loadDocuments();
+
+ alert('서적이 삭제되었습니다.');
+ } catch (error) {
+ console.error('서적 삭제 실패:', error);
+ alert('서적 삭제에 실패했습니다: ' + error.message);
+ }
+ },
+
// 필터 초기화
clearFilters() {
this.searchQuery = '';
diff --git a/frontend/static/js/pdf-manager.js b/frontend/static/js/pdf-manager.js
index a8e9e74..bd4a0e7 100644
--- a/frontend/static/js/pdf-manager.js
+++ b/frontend/static/js/pdf-manager.js
@@ -67,7 +67,7 @@ window.pdfManagerApp = () => ({
try {
// 모든 문서 가져오기
- this.allDocuments = await window.api.getDocuments();
+ this.allDocuments = await window.api.getAllDocuments();
// PDF 파일들만 필터링
this.pdfDocuments = this.allDocuments.filter(doc =>
diff --git a/uploads/pdfs/0271c01d-096e-47ef-909e-b31b42c24f72.pdf b/uploads/pdfs/0271c01d-096e-47ef-909e-b31b42c24f72.pdf
new file mode 100644
index 0000000..beecae6
Binary files /dev/null and b/uploads/pdfs/0271c01d-096e-47ef-909e-b31b42c24f72.pdf differ
diff --git a/uploads/pdfs/044257e1-8f60-4ee4-9ccf-d765d0239fd5.pdf b/uploads/pdfs/044257e1-8f60-4ee4-9ccf-d765d0239fd5.pdf
new file mode 100644
index 0000000..4749264
Binary files /dev/null and b/uploads/pdfs/044257e1-8f60-4ee4-9ccf-d765d0239fd5.pdf differ
diff --git a/uploads/pdfs/8f219650-cb4f-4e17-b100-cd1853d45ca4.pdf b/uploads/pdfs/0802001e-90e6-407e-804f-335ca69b6c4d.pdf
similarity index 100%
rename from uploads/pdfs/8f219650-cb4f-4e17-b100-cd1853d45ca4.pdf
rename to uploads/pdfs/0802001e-90e6-407e-804f-335ca69b6c4d.pdf
diff --git a/uploads/pdfs/0a789d13-9c7d-4f64-bc33-311c2bf4e9c4.pdf b/uploads/pdfs/0a789d13-9c7d-4f64-bc33-311c2bf4e9c4.pdf
new file mode 100644
index 0000000..c5c75dc
Binary files /dev/null and b/uploads/pdfs/0a789d13-9c7d-4f64-bc33-311c2bf4e9c4.pdf differ
diff --git a/uploads/pdfs/8091c28f-31ee-49af-b83d-80c86e7cd6a9.pdf b/uploads/pdfs/0a84c183-f33f-42af-adce-062f7987126c.pdf
similarity index 100%
rename from uploads/pdfs/8091c28f-31ee-49af-b83d-80c86e7cd6a9.pdf
rename to uploads/pdfs/0a84c183-f33f-42af-adce-062f7987126c.pdf
diff --git a/uploads/pdfs/5b227846-dc77-4048-9154-87fe90885949.pdf b/uploads/pdfs/0ae92433-cda0-41dd-aec4-0d9632af8cde.pdf
similarity index 100%
rename from uploads/pdfs/5b227846-dc77-4048-9154-87fe90885949.pdf
rename to uploads/pdfs/0ae92433-cda0-41dd-aec4-0d9632af8cde.pdf
diff --git a/uploads/pdfs/0ba7d965-7132-438a-9796-5b39322f4ca6.pdf b/uploads/pdfs/0ba7d965-7132-438a-9796-5b39322f4ca6.pdf
new file mode 100644
index 0000000..4cb3564
Binary files /dev/null and b/uploads/pdfs/0ba7d965-7132-438a-9796-5b39322f4ca6.pdf differ
diff --git a/uploads/pdfs/c3006793-98de-44ab-ab39-c2f3cba2680a.pdf b/uploads/pdfs/0e210572-0158-4047-b1d0-d7278c80d50f.pdf
similarity index 100%
rename from uploads/pdfs/c3006793-98de-44ab-ab39-c2f3cba2680a.pdf
rename to uploads/pdfs/0e210572-0158-4047-b1d0-d7278c80d50f.pdf
diff --git a/uploads/pdfs/2567758e-d631-4b5a-9be5-2f2e35cb9d5e.pdf b/uploads/pdfs/159b627c-6170-4f0d-97a8-3ac3d39b784c.pdf
similarity index 100%
rename from uploads/pdfs/2567758e-d631-4b5a-9be5-2f2e35cb9d5e.pdf
rename to uploads/pdfs/159b627c-6170-4f0d-97a8-3ac3d39b784c.pdf
diff --git a/uploads/pdfs/1784a4ff-0fcf-4bc6-a1ef-dbf2948dd2ad.pdf b/uploads/pdfs/1784a4ff-0fcf-4bc6-a1ef-dbf2948dd2ad.pdf
new file mode 100644
index 0000000..c10973b
Binary files /dev/null and b/uploads/pdfs/1784a4ff-0fcf-4bc6-a1ef-dbf2948dd2ad.pdf differ
diff --git a/uploads/pdfs/1a444bf5-eb9a-4e8e-b0d8-1f767cbab5e1.pdf b/uploads/pdfs/1a444bf5-eb9a-4e8e-b0d8-1f767cbab5e1.pdf
new file mode 100644
index 0000000..edf3b9c
Binary files /dev/null and b/uploads/pdfs/1a444bf5-eb9a-4e8e-b0d8-1f767cbab5e1.pdf differ
diff --git a/uploads/pdfs/1cf885e9-c425-4a8d-90e4-fd2fb704ffad.pdf b/uploads/pdfs/1cf885e9-c425-4a8d-90e4-fd2fb704ffad.pdf
new file mode 100644
index 0000000..b7e63cc
Binary files /dev/null and b/uploads/pdfs/1cf885e9-c425-4a8d-90e4-fd2fb704ffad.pdf differ
diff --git a/uploads/pdfs/237da603-1d16-43c4-b09b-e1e19a2a3e23.pdf b/uploads/pdfs/237da603-1d16-43c4-b09b-e1e19a2a3e23.pdf
new file mode 100644
index 0000000..986698c
Binary files /dev/null and b/uploads/pdfs/237da603-1d16-43c4-b09b-e1e19a2a3e23.pdf differ
diff --git a/uploads/pdfs/b0fe24d1-3bdd-499d-ad48-e3ebc0db0518.pdf b/uploads/pdfs/266164b2-dada-4444-a265-1269d2d170dd.pdf
similarity index 100%
rename from uploads/pdfs/b0fe24d1-3bdd-499d-ad48-e3ebc0db0518.pdf
rename to uploads/pdfs/266164b2-dada-4444-a265-1269d2d170dd.pdf
diff --git a/uploads/pdfs/c90e3080-d430-4e58-bf60-c749dc6ff4fc.pdf b/uploads/pdfs/3a1f04c0-07d8-4b52-b565-185b6c7bfc10.pdf
similarity index 100%
rename from uploads/pdfs/c90e3080-d430-4e58-bf60-c749dc6ff4fc.pdf
rename to uploads/pdfs/3a1f04c0-07d8-4b52-b565-185b6c7bfc10.pdf
diff --git a/uploads/pdfs/3a436477-538d-4d35-b134-21d3d2e0b91a.pdf b/uploads/pdfs/3cbf9924-728c-483e-b96c-ec84eba19d81.pdf
similarity index 100%
rename from uploads/pdfs/3a436477-538d-4d35-b134-21d3d2e0b91a.pdf
rename to uploads/pdfs/3cbf9924-728c-483e-b96c-ec84eba19d81.pdf
diff --git a/uploads/pdfs/0e26c39f-87e3-4685-b621-20789de0ae24.pdf b/uploads/pdfs/3d1bea67-9999-46f9-8b29-bc8367622271.pdf
similarity index 100%
rename from uploads/pdfs/0e26c39f-87e3-4685-b621-20789de0ae24.pdf
rename to uploads/pdfs/3d1bea67-9999-46f9-8b29-bc8367622271.pdf
diff --git a/uploads/pdfs/425cf9a8-69f3-4b64-944a-ca7dc150bea9.pdf b/uploads/pdfs/425cf9a8-69f3-4b64-944a-ca7dc150bea9.pdf
new file mode 100644
index 0000000..5c54a5e
Binary files /dev/null and b/uploads/pdfs/425cf9a8-69f3-4b64-944a-ca7dc150bea9.pdf differ
diff --git a/uploads/pdfs/45128e60-b6cb-46e0-a33c-fb8523deb7ad.pdf b/uploads/pdfs/45128e60-b6cb-46e0-a33c-fb8523deb7ad.pdf
new file mode 100644
index 0000000..45c5d8f
Binary files /dev/null and b/uploads/pdfs/45128e60-b6cb-46e0-a33c-fb8523deb7ad.pdf differ
diff --git a/uploads/pdfs/4e767e23-d3d9-4df9-a683-2ceb9719e709.pdf b/uploads/pdfs/4e767e23-d3d9-4df9-a683-2ceb9719e709.pdf
new file mode 100644
index 0000000..86beab2
Binary files /dev/null and b/uploads/pdfs/4e767e23-d3d9-4df9-a683-2ceb9719e709.pdf differ
diff --git a/uploads/pdfs/5667922f-5878-4258-a3db-fb471e6531b1.pdf b/uploads/pdfs/5667922f-5878-4258-a3db-fb471e6531b1.pdf
new file mode 100644
index 0000000..5f2c471
Binary files /dev/null and b/uploads/pdfs/5667922f-5878-4258-a3db-fb471e6531b1.pdf differ
diff --git a/uploads/pdfs/59f6939c-d85d-42e7-987c-47ceeff9c78e.pdf b/uploads/pdfs/59f6939c-d85d-42e7-987c-47ceeff9c78e.pdf
new file mode 100644
index 0000000..1e39779
Binary files /dev/null and b/uploads/pdfs/59f6939c-d85d-42e7-987c-47ceeff9c78e.pdf differ
diff --git a/uploads/pdfs/5aafb935-e989-4f86-9c3a-5dd3f5ac7b1e.pdf b/uploads/pdfs/5aafb935-e989-4f86-9c3a-5dd3f5ac7b1e.pdf
new file mode 100644
index 0000000..6bb91f9
Binary files /dev/null and b/uploads/pdfs/5aafb935-e989-4f86-9c3a-5dd3f5ac7b1e.pdf differ
diff --git a/uploads/pdfs/5d4f3282-229b-4566-b6dd-e264623953dc_additional.pdf b/uploads/pdfs/5d4f3282-229b-4566-b6dd-e264623953dc_additional.pdf
new file mode 100644
index 0000000..a7d4e33
Binary files /dev/null and b/uploads/pdfs/5d4f3282-229b-4566-b6dd-e264623953dc_additional.pdf differ
diff --git a/uploads/pdfs/0b20c70c-f389-45cf-8f7f-b5263dcda651.pdf b/uploads/pdfs/5e74d3a9-1b1e-4012-a39c-ff939bdf7833.pdf
similarity index 100%
rename from uploads/pdfs/0b20c70c-f389-45cf-8f7f-b5263dcda651.pdf
rename to uploads/pdfs/5e74d3a9-1b1e-4012-a39c-ff939bdf7833.pdf
diff --git a/uploads/pdfs/60555ee8-6517-4e34-8c9d-1924d9bb4355.pdf b/uploads/pdfs/60555ee8-6517-4e34-8c9d-1924d9bb4355.pdf
new file mode 100644
index 0000000..852eb89
Binary files /dev/null and b/uploads/pdfs/60555ee8-6517-4e34-8c9d-1924d9bb4355.pdf differ
diff --git a/uploads/pdfs/ca2e7cd9-e1ac-406e-995e-627fd15077ec.pdf b/uploads/pdfs/60943071-46af-44da-9ec8-16d13a4daeeb.pdf
similarity index 100%
rename from uploads/pdfs/ca2e7cd9-e1ac-406e-995e-627fd15077ec.pdf
rename to uploads/pdfs/60943071-46af-44da-9ec8-16d13a4daeeb.pdf
diff --git a/uploads/pdfs/8ce986e2-8e52-48fc-bbdc-589f63bd3ba4.pdf b/uploads/pdfs/61527370-e79d-4059-a78e-4765c37cebd0.pdf
similarity index 100%
rename from uploads/pdfs/8ce986e2-8e52-48fc-bbdc-589f63bd3ba4.pdf
rename to uploads/pdfs/61527370-e79d-4059-a78e-4765c37cebd0.pdf
diff --git a/uploads/pdfs/65f56284-8cca-4b8a-8976-b1ac6600f33b.pdf b/uploads/pdfs/65f56284-8cca-4b8a-8976-b1ac6600f33b.pdf
new file mode 100644
index 0000000..72fa53c
Binary files /dev/null and b/uploads/pdfs/65f56284-8cca-4b8a-8976-b1ac6600f33b.pdf differ
diff --git a/uploads/pdfs/6d6e63f2-e05d-45fa-a8d5-4a155b18405c.pdf b/uploads/pdfs/6d6e63f2-e05d-45fa-a8d5-4a155b18405c.pdf
new file mode 100644
index 0000000..2ab7a29
Binary files /dev/null and b/uploads/pdfs/6d6e63f2-e05d-45fa-a8d5-4a155b18405c.pdf differ
diff --git a/uploads/pdfs/181f8f2d-4eaf-43f8-a9fd-17fd64fe9439.pdf b/uploads/pdfs/6f8ae37a-4a65-4e54-a705-103673ac824b.pdf
similarity index 100%
rename from uploads/pdfs/181f8f2d-4eaf-43f8-a9fd-17fd64fe9439.pdf
rename to uploads/pdfs/6f8ae37a-4a65-4e54-a705-103673ac824b.pdf
diff --git a/uploads/pdfs/79e33e90-1ced-402e-b1df-3251a68e3e71.pdf b/uploads/pdfs/79e33e90-1ced-402e-b1df-3251a68e3e71.pdf
new file mode 100644
index 0000000..883d0d8
Binary files /dev/null and b/uploads/pdfs/79e33e90-1ced-402e-b1df-3251a68e3e71.pdf differ
diff --git a/uploads/pdfs/7ed83ee2-9f35-41b8-8508-b72229084198.pdf b/uploads/pdfs/7ed83ee2-9f35-41b8-8508-b72229084198.pdf
new file mode 100644
index 0000000..489bd47
Binary files /dev/null and b/uploads/pdfs/7ed83ee2-9f35-41b8-8508-b72229084198.pdf differ
diff --git a/uploads/pdfs/81d2c796-e450-4f23-a8c8-5c14ad019e88.pdf b/uploads/pdfs/81d2c796-e450-4f23-a8c8-5c14ad019e88.pdf
new file mode 100644
index 0000000..c851c45
Binary files /dev/null and b/uploads/pdfs/81d2c796-e450-4f23-a8c8-5c14ad019e88.pdf differ
diff --git a/uploads/pdfs/87a91e5e-212b-4f09-9d31-6bc935411843.pdf b/uploads/pdfs/82a06949-442c-4e3d-82db-264600db2940.pdf
similarity index 100%
rename from uploads/pdfs/87a91e5e-212b-4f09-9d31-6bc935411843.pdf
rename to uploads/pdfs/82a06949-442c-4e3d-82db-264600db2940.pdf
diff --git a/uploads/pdfs/86bd40ab-369d-4dc4-bd52-a6787f806642.pdf b/uploads/pdfs/86bd40ab-369d-4dc4-bd52-a6787f806642.pdf
new file mode 100644
index 0000000..68bfe22
Binary files /dev/null and b/uploads/pdfs/86bd40ab-369d-4dc4-bd52-a6787f806642.pdf differ
diff --git a/uploads/pdfs/871ed168-eecf-442b-9771-f86662accf69.pdf b/uploads/pdfs/871ed168-eecf-442b-9771-f86662accf69.pdf
new file mode 100644
index 0000000..654339d
Binary files /dev/null and b/uploads/pdfs/871ed168-eecf-442b-9771-f86662accf69.pdf differ
diff --git a/uploads/pdfs/e01903fc-33e3-4e95-835e-d7a9c3897719.pdf b/uploads/pdfs/87cbffc9-8b91-47c9-bedc-8634543f567e.pdf
similarity index 100%
rename from uploads/pdfs/e01903fc-33e3-4e95-835e-d7a9c3897719.pdf
rename to uploads/pdfs/87cbffc9-8b91-47c9-bedc-8634543f567e.pdf
diff --git a/uploads/pdfs/88494df8-ac20-44d3-85e6-361d55ccae0e.pdf b/uploads/pdfs/88494df8-ac20-44d3-85e6-361d55ccae0e.pdf
new file mode 100644
index 0000000..3bef1e0
Binary files /dev/null and b/uploads/pdfs/88494df8-ac20-44d3-85e6-361d55ccae0e.pdf differ
diff --git a/uploads/pdfs/d912a6bb-9236-4924-b7a5-1d5fc9c64684.pdf b/uploads/pdfs/8ad7482f-eb50-4fb5-a5d8-05deac064cd3.pdf
similarity index 100%
rename from uploads/pdfs/d912a6bb-9236-4924-b7a5-1d5fc9c64684.pdf
rename to uploads/pdfs/8ad7482f-eb50-4fb5-a5d8-05deac064cd3.pdf
diff --git a/uploads/pdfs/8c55189e-a570-4b74-89c5-47954e5cdd49.pdf b/uploads/pdfs/8c55189e-a570-4b74-89c5-47954e5cdd49.pdf
new file mode 100644
index 0000000..cd0c67a
Binary files /dev/null and b/uploads/pdfs/8c55189e-a570-4b74-89c5-47954e5cdd49.pdf differ
diff --git a/uploads/pdfs/6dc6f6a6-f040-4079-ac3b-46d3f59202de.pdf b/uploads/pdfs/910f4f5d-7eaa-43a4-815a-4909b1e59ab3.pdf
similarity index 100%
rename from uploads/pdfs/6dc6f6a6-f040-4079-ac3b-46d3f59202de.pdf
rename to uploads/pdfs/910f4f5d-7eaa-43a4-815a-4909b1e59ab3.pdf
diff --git a/uploads/pdfs/923ed2b0-3aa1-414e-a083-5c5cef2d9ad3.pdf b/uploads/pdfs/923ed2b0-3aa1-414e-a083-5c5cef2d9ad3.pdf
new file mode 100644
index 0000000..20bd890
Binary files /dev/null and b/uploads/pdfs/923ed2b0-3aa1-414e-a083-5c5cef2d9ad3.pdf differ
diff --git a/uploads/pdfs/92bfb634-60aa-4186-b5bf-ef78d10bb19c.pdf b/uploads/pdfs/92bfb634-60aa-4186-b5bf-ef78d10bb19c.pdf
new file mode 100644
index 0000000..6a8b556
Binary files /dev/null and b/uploads/pdfs/92bfb634-60aa-4186-b5bf-ef78d10bb19c.pdf differ
diff --git a/uploads/pdfs/a658fdec-0ca0-4c11-9767-d74077d4bb69.pdf b/uploads/pdfs/9591b7cb-5aae-48ed-b8e3-f2cac5d10845.pdf
similarity index 100%
rename from uploads/pdfs/a658fdec-0ca0-4c11-9767-d74077d4bb69.pdf
rename to uploads/pdfs/9591b7cb-5aae-48ed-b8e3-f2cac5d10845.pdf
diff --git a/uploads/pdfs/96efd9ec-261d-4542-b406-1f78e9e40223.pdf b/uploads/pdfs/96efd9ec-261d-4542-b406-1f78e9e40223.pdf
new file mode 100644
index 0000000..9ba969c
Binary files /dev/null and b/uploads/pdfs/96efd9ec-261d-4542-b406-1f78e9e40223.pdf differ
diff --git a/uploads/pdfs/9c712a1b-8e44-47ea-bf0d-429d7aa855f9.pdf b/uploads/pdfs/9c712a1b-8e44-47ea-bf0d-429d7aa855f9.pdf
new file mode 100644
index 0000000..3450c20
Binary files /dev/null and b/uploads/pdfs/9c712a1b-8e44-47ea-bf0d-429d7aa855f9.pdf differ
diff --git a/uploads/pdfs/047196c4-c041-4b36-a88b-cc81dc00b374.pdf b/uploads/pdfs/9c761beb-14e3-4ae9-ab7d-89f1379c8ce3.pdf
similarity index 100%
rename from uploads/pdfs/047196c4-c041-4b36-a88b-cc81dc00b374.pdf
rename to uploads/pdfs/9c761beb-14e3-4ae9-ab7d-89f1379c8ce3.pdf
diff --git a/uploads/pdfs/273f8299-54db-4652-a602-3fbe4acb7d98.pdf b/uploads/pdfs/9ce35767-b06e-44fc-9b56-f19ba0a908d1.pdf
similarity index 100%
rename from uploads/pdfs/273f8299-54db-4652-a602-3fbe4acb7d98.pdf
rename to uploads/pdfs/9ce35767-b06e-44fc-9b56-f19ba0a908d1.pdf
diff --git a/uploads/pdfs/f90a3eaa-b607-449a-aa75-ee3763c52492.pdf b/uploads/pdfs/9ea37e47-e6af-45e6-a095-9cac2aebd70c.pdf
similarity index 100%
rename from uploads/pdfs/f90a3eaa-b607-449a-aa75-ee3763c52492.pdf
rename to uploads/pdfs/9ea37e47-e6af-45e6-a095-9cac2aebd70c.pdf
diff --git a/uploads/pdfs/a284c509-5931-48f0-acc5-18c1788b826a.pdf b/uploads/pdfs/a284c509-5931-48f0-acc5-18c1788b826a.pdf
new file mode 100644
index 0000000..2f5f9dc
Binary files /dev/null and b/uploads/pdfs/a284c509-5931-48f0-acc5-18c1788b826a.pdf differ
diff --git a/uploads/pdfs/cde540ce-ec7c-424e-8187-83cb2f85ee6b.pdf b/uploads/pdfs/a5d2baac-f531-4741-bf5c-11e7c529edb5.pdf
similarity index 100%
rename from uploads/pdfs/cde540ce-ec7c-424e-8187-83cb2f85ee6b.pdf
rename to uploads/pdfs/a5d2baac-f531-4741-bf5c-11e7c529edb5.pdf
diff --git a/uploads/pdfs/a79308d0-3947-43a3-983d-ac4fe39b3dae.pdf b/uploads/pdfs/a79308d0-3947-43a3-983d-ac4fe39b3dae.pdf
new file mode 100644
index 0000000..b5d687b
Binary files /dev/null and b/uploads/pdfs/a79308d0-3947-43a3-983d-ac4fe39b3dae.pdf differ
diff --git a/uploads/pdfs/adaeeec4-241f-44b3-82fe-b6653f541d48.pdf b/uploads/pdfs/adaeeec4-241f-44b3-82fe-b6653f541d48.pdf
new file mode 100644
index 0000000..4c8c464
Binary files /dev/null and b/uploads/pdfs/adaeeec4-241f-44b3-82fe-b6653f541d48.pdf differ
diff --git a/uploads/pdfs/ae849cd7-0b48-403f-8ae4-6f544c45a5a8.pdf b/uploads/pdfs/ae849cd7-0b48-403f-8ae4-6f544c45a5a8.pdf
new file mode 100644
index 0000000..771346a
Binary files /dev/null and b/uploads/pdfs/ae849cd7-0b48-403f-8ae4-6f544c45a5a8.pdf differ
diff --git a/uploads/pdfs/b081d72c-3a4a-45ec-a0c9-1fbfc60f0dee.pdf b/uploads/pdfs/b081d72c-3a4a-45ec-a0c9-1fbfc60f0dee.pdf
new file mode 100644
index 0000000..cefd8d9
Binary files /dev/null and b/uploads/pdfs/b081d72c-3a4a-45ec-a0c9-1fbfc60f0dee.pdf differ
diff --git a/uploads/pdfs/b4f5f979-f5ca-49cd-8fa7-05bd2680dc44.pdf b/uploads/pdfs/b4f5f979-f5ca-49cd-8fa7-05bd2680dc44.pdf
new file mode 100644
index 0000000..7ad5767
Binary files /dev/null and b/uploads/pdfs/b4f5f979-f5ca-49cd-8fa7-05bd2680dc44.pdf differ
diff --git a/uploads/pdfs/ba71be69-faaf-4197-a9d3-57bc08c1d80a.pdf b/uploads/pdfs/ba71be69-faaf-4197-a9d3-57bc08c1d80a.pdf
new file mode 100644
index 0000000..43cab9b
Binary files /dev/null and b/uploads/pdfs/ba71be69-faaf-4197-a9d3-57bc08c1d80a.pdf differ
diff --git a/uploads/pdfs/c8eeb6ec-a7a7-4534-83e5-758453f3aca4.pdf b/uploads/pdfs/c8eeb6ec-a7a7-4534-83e5-758453f3aca4.pdf
new file mode 100644
index 0000000..da8bb0a
Binary files /dev/null and b/uploads/pdfs/c8eeb6ec-a7a7-4534-83e5-758453f3aca4.pdf differ
diff --git a/uploads/pdfs/c93c4310-5371-4f92-883a-2edc779ac9c3.pdf b/uploads/pdfs/c93c4310-5371-4f92-883a-2edc779ac9c3.pdf
new file mode 100644
index 0000000..f4de307
Binary files /dev/null and b/uploads/pdfs/c93c4310-5371-4f92-883a-2edc779ac9c3.pdf differ
diff --git a/uploads/pdfs/cd790600-28aa-472d-9e54-db3cbed0097c.pdf b/uploads/pdfs/cd790600-28aa-472d-9e54-db3cbed0097c.pdf
new file mode 100644
index 0000000..3f27bbc
Binary files /dev/null and b/uploads/pdfs/cd790600-28aa-472d-9e54-db3cbed0097c.pdf differ
diff --git a/uploads/pdfs/16912a03-5e8b-4eaf-a69b-f6396445376f.pdf b/uploads/pdfs/cfc71fbe-3a82-4195-832d-77b2bbe832a6.pdf
similarity index 100%
rename from uploads/pdfs/16912a03-5e8b-4eaf-a69b-f6396445376f.pdf
rename to uploads/pdfs/cfc71fbe-3a82-4195-832d-77b2bbe832a6.pdf
diff --git a/uploads/pdfs/d55d7866-ea97-4271-9142-8beb53ba4229.pdf b/uploads/pdfs/d55d7866-ea97-4271-9142-8beb53ba4229.pdf
new file mode 100644
index 0000000..2f1e42b
Binary files /dev/null and b/uploads/pdfs/d55d7866-ea97-4271-9142-8beb53ba4229.pdf differ
diff --git a/uploads/pdfs/a6ad93df-a288-4073-826d-109afde024d7.pdf b/uploads/pdfs/d6c036a6-013c-4ba9-ada7-8728d5bc4823.pdf
similarity index 100%
rename from uploads/pdfs/a6ad93df-a288-4073-826d-109afde024d7.pdf
rename to uploads/pdfs/d6c036a6-013c-4ba9-ada7-8728d5bc4823.pdf
diff --git a/uploads/pdfs/9b9d44d3-7bc7-447d-a37d-a3a73a33c679.pdf b/uploads/pdfs/dddb0bfa-f8a2-4a6b-9f78-60903124d50a.pdf
similarity index 100%
rename from uploads/pdfs/9b9d44d3-7bc7-447d-a37d-a3a73a33c679.pdf
rename to uploads/pdfs/dddb0bfa-f8a2-4a6b-9f78-60903124d50a.pdf
diff --git a/uploads/pdfs/5dc57bcf-5898-40f7-9ca2-1d57a14ddc76.pdf b/uploads/pdfs/e452eb5b-460a-4483-9882-d7153e277ed7.pdf
similarity index 100%
rename from uploads/pdfs/5dc57bcf-5898-40f7-9ca2-1d57a14ddc76.pdf
rename to uploads/pdfs/e452eb5b-460a-4483-9882-d7153e277ed7.pdf
diff --git a/uploads/pdfs/e5bb3cb9-3d5f-4e9c-9441-60a110ea2a3c.pdf b/uploads/pdfs/e5bb3cb9-3d5f-4e9c-9441-60a110ea2a3c.pdf
new file mode 100644
index 0000000..277c264
Binary files /dev/null and b/uploads/pdfs/e5bb3cb9-3d5f-4e9c-9441-60a110ea2a3c.pdf differ
diff --git a/uploads/pdfs/e98ec815-78c6-4aac-9e9e-9a7b65d31cdc.pdf b/uploads/pdfs/e98ec815-78c6-4aac-9e9e-9a7b65d31cdc.pdf
new file mode 100644
index 0000000..a148df0
Binary files /dev/null and b/uploads/pdfs/e98ec815-78c6-4aac-9e9e-9a7b65d31cdc.pdf differ
diff --git a/uploads/pdfs/850e918e-b906-48fd-ac1c-f823f1b91449.pdf b/uploads/pdfs/f0a5e80e-a079-4a23-93bc-b5703f02c169.pdf
similarity index 100%
rename from uploads/pdfs/850e918e-b906-48fd-ac1c-f823f1b91449.pdf
rename to uploads/pdfs/f0a5e80e-a079-4a23-93bc-b5703f02c169.pdf
diff --git a/uploads/pdfs/f22d9bad-fe0a-4773-a073-534d60913f67.pdf b/uploads/pdfs/f22d9bad-fe0a-4773-a073-534d60913f67.pdf
new file mode 100644
index 0000000..68b803c
Binary files /dev/null and b/uploads/pdfs/f22d9bad-fe0a-4773-a073-534d60913f67.pdf differ
diff --git a/uploads/pdfs/07c1c740-77c5-4ae9-b859-04f13ed8fb6d.pdf b/uploads/pdfs/f4cc2d07-b57a-433c-9d0f-c75a73142e30.pdf
similarity index 100%
rename from uploads/pdfs/07c1c740-77c5-4ae9-b859-04f13ed8fb6d.pdf
rename to uploads/pdfs/f4cc2d07-b57a-433c-9d0f-c75a73142e30.pdf
diff --git a/uploads/pdfs/2c7b2c83-75bf-486f-a06f-a885e440c962.pdf b/uploads/pdfs/f7c9f34a-b95c-485e-90b5-ee28d3607842.pdf
similarity index 100%
rename from uploads/pdfs/2c7b2c83-75bf-486f-a06f-a885e440c962.pdf
rename to uploads/pdfs/f7c9f34a-b95c-485e-90b5-ee28d3607842.pdf
diff --git a/uploads/pdfs/f84f9929-6151-461b-93fc-995707badeb3.pdf b/uploads/pdfs/f84f9929-6151-461b-93fc-995707badeb3.pdf
new file mode 100644
index 0000000..b6574d9
Binary files /dev/null and b/uploads/pdfs/f84f9929-6151-461b-93fc-995707badeb3.pdf differ
diff --git a/uploads/pdfs/bf770f95-45c0-4275-8aa6-f723126a17ae.pdf b/uploads/pdfs/f9521c21-8c40-412b-b567-74d43fe7dfaa.pdf
similarity index 100%
rename from uploads/pdfs/bf770f95-45c0-4275-8aa6-f723126a17ae.pdf
rename to uploads/pdfs/f9521c21-8c40-412b-b567-74d43fe7dfaa.pdf
diff --git a/uploads/pdfs/fcb7dafd-a7d4-4b47-bc7c-8db6080ffd1f.pdf b/uploads/pdfs/fcb7dafd-a7d4-4b47-bc7c-8db6080ffd1f.pdf
new file mode 100644
index 0000000..80d1ef8
Binary files /dev/null and b/uploads/pdfs/fcb7dafd-a7d4-4b47-bc7c-8db6080ffd1f.pdf differ
diff --git a/uploads/pdfs/fe8e9764-0f45-4c52-9be2-11f0cc478b4d.pdf b/uploads/pdfs/fe8e9764-0f45-4c52-9be2-11f0cc478b4d.pdf
new file mode 100644
index 0000000..d64ecec
Binary files /dev/null and b/uploads/pdfs/fe8e9764-0f45-4c52-9be2-11f0cc478b4d.pdf differ