From bb828be8ad5a1b603bba9a8a22bde7ff73767fe5 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 18 Oct 2026 11:50:44 +0400 Subject: [PATCH] =?UTF-8?q?Golden=20=D0=B8=20=D1=81=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D1=82=D0=B8=D0=BA=D0=B0=20s29=E2=80=93s31=20(tabular-par?= =?UTF-8?q?ser=20#47,=20AURORA-1662,=201663,=201664)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Синтетика: xls без CODEPAGE, «Вал»/«Кол-во», строки ниже «Итого» + описание в README. Golden: три новых снимка; изменён один реальный — rb/2024-Q1 «сч 60_ 1 кв 2024 г»: добавлено предупреждение о числах под «Итого» (контрольные суммы правее таблицы). Co-Authored-By: Claude Sonnet 5.5 --- .../rb/2024-Q1/сч 60_ 1 кв 2024 г.json | 3 +- .../synthetic/s29_xls_no_codepage.json | 252 ++++++++++++++++++ .../synthetic/s30_val_kol_vo_materials.json | 193 ++++++++++++++ .../synthetic/s31_rows_below_total.json | 252 ++++++++++++++++++ osv/synthetic/README.md | 5 + osv/synthetic/s29_xls_no_codepage.xls | Bin 0 -> 5632 bytes osv/synthetic/s30_val_kol_vo_materials.xlsx | Bin 0 -> 5550 bytes osv/synthetic/s31_rows_below_total.xlsx | Bin 0 -> 5891 bytes 8 files changed, 704 insertions(+), 1 deletion(-) create mode 100644 golden/expected_osv_parse/synthetic/s29_xls_no_codepage.json create mode 100644 golden/expected_osv_parse/synthetic/s30_val_kol_vo_materials.json create mode 100644 golden/expected_osv_parse/synthetic/s31_rows_below_total.json create mode 100644 osv/synthetic/s29_xls_no_codepage.xls create mode 100644 osv/synthetic/s30_val_kol_vo_materials.xlsx create mode 100644 osv/synthetic/s31_rows_below_total.xlsx diff --git a/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json b/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json index 17f7610..63dfa1e 100644 --- a/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json +++ b/golden/expected_osv_parse/rb/2024-Q1/сч 60_ 1 кв 2024 г.json @@ -7,7 +7,8 @@ "metrics": { "rows": 612, "warnings": [ - "sheet=Лист_1 hierarchy=outline" + "sheet=Лист_1 hierarchy=outline", + "строки 625–626: ниже таблицы (после «Итого») есть числа — строки ниже «Итого» вне документа и не разобраны" ] }, "documents": [ diff --git a/golden/expected_osv_parse/synthetic/s29_xls_no_codepage.json b/golden/expected_osv_parse/synthetic/s29_xls_no_codepage.json new file mode 100644 index 0000000..074cdea --- /dev/null +++ b/golden/expected_osv_parse/synthetic/s29_xls_no_codepage.json @@ -0,0 +1,252 @@ +{ + "schema_version": "1.2", + "service": { + "name": "tabular-parser" + }, + "status": "done", + "metrics": { + "rows": 9, + "warnings": [ + "xls без кодовой страницы — строки прочитаны как cp1251", + "sheet=Лист_1 hierarchy=indent" + ] + }, + "documents": [ + { + "document_type": "OSV", + "locator": "sheet:Лист_1", + "header": { + "organization_name": "ООО \"Тестовая организация\"", + "organization_inn": null, + "account_code_raw": "60", + "period_text": "1 квартал 2025 г.", + "period_year": 2025, + "period_quarter": "Q1", + "is_cumulative": true, + "period_start": "2025-01-01", + "period_end": "2025-03-31", + "is_from_year_start": true, + "data_type": "BU", + "currency": "RUB", + "header_variant": 1 + }, + "group_schema": [ + { + "type": "ACCOUNT", + "name": "Счет" + }, + { + "type": "COUNTERPARTY", + "name": "Контрагенты", + "has_inn": true + } + ], + "columns": { + "opening_debit": "G", + "opening_credit": "H", + "turnover_debit": "I", + "turnover_credit": "J", + "closing_debit": "K", + "closing_credit": "L", + "inn": "E" + }, + "rows": [ + { + "row_number": 11, + "level": 0, + "parent_row_number": null, + "row_value": "60", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "135000.00", + "opening_credit": "262500.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "503500.60", + "extra": null + }, + { + "row_number": 12, + "level": 1, + "parent_row_number": 11, + "row_value": "60.01", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60.01", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "15000.00", + "opening_credit": "253000.50", + "turnover_debit": "273000.25", + "turnover_credit": "460000.00", + "closing_debit": "65000.00", + "closing_credit": "490000.25", + "extra": null + }, + { + "row_number": 13, + "level": 2, + "parent_row_number": 12, + "row_value": "ООО Альфа", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "ООО Альфа", + "counterparty_inn": "7701234567", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "250000.50", + "turnover_debit": "180000.25", + "turnover_credit": "420000.00", + "closing_debit": null, + "closing_credit": "490000.25", + "extra": null + }, + { + "row_number": 14, + "level": 2, + "parent_row_number": 12, + "row_value": "ООО Бета", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "ООО Бета", + "counterparty_inn": "7707654321", + "data_type": "BU", + "opening_debit": "15000.00", + "opening_credit": null, + "turnover_debit": "90000.00", + "turnover_credit": "40000.00", + "closing_debit": "65000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 15, + "level": 2, + "parent_row_number": 12, + "row_value": "Иванов Иван", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "Иванов Иван", + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": null, + "opening_credit": "3000.00", + "turnover_debit": "3000.00", + "turnover_credit": null, + "closing_debit": null, + "closing_credit": null, + "extra": null + }, + { + "row_number": 16, + "level": 1, + "parent_row_number": 11, + "row_value": "60.02", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60.02", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "120000.00", + "opening_credit": "9500.10", + "turnover_debit": "38000.10", + "turnover_credit": "112000.35", + "closing_debit": "50000.00", + "closing_credit": "13500.35", + "extra": null + }, + { + "row_number": 17, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Гамма", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ООО Гамма", + "counterparty_inn": "5001234567", + "data_type": "BU", + "opening_debit": "120000.00", + "opening_credit": null, + "turnover_debit": "30000.00", + "turnover_credit": "100000.00", + "closing_debit": "50000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 18, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Дельта", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ООО Дельта", + "counterparty_inn": "7812345678", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "8000.10", + "turnover_debit": "8000.10", + "turnover_credit": "12000.35", + "closing_debit": null, + "closing_credit": "12000.35", + "extra": null + }, + { + "row_number": 19, + "level": 2, + "parent_row_number": 16, + "row_value": "ИП Сидоров", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ИП Сидоров", + "counterparty_inn": "500100732259", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "1500.00", + "turnover_debit": null, + "turnover_credit": null, + "closing_debit": null, + "closing_credit": "1500.00", + "extra": null + }, + { + "row_number": 20, + "level": 0, + "parent_row_number": null, + "row_value": "Итого", + "group_type": "TOTAL", + "group_name": null, + "account_code_raw": null, + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "135000.00", + "opening_credit": "262500.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "503500.60", + "extra": null + } + ], + "checks": { + "total_row_matches_root": true, + "balance_identity_violations": [], + "parent_sum_violations": [] + } + } + ] +} diff --git a/golden/expected_osv_parse/synthetic/s30_val_kol_vo_materials.json b/golden/expected_osv_parse/synthetic/s30_val_kol_vo_materials.json new file mode 100644 index 0000000..c9f3731 --- /dev/null +++ b/golden/expected_osv_parse/synthetic/s30_val_kol_vo_materials.json @@ -0,0 +1,193 @@ +{ + "schema_version": "1.2", + "service": { + "name": "tabular-parser" + }, + "status": "done", + "metrics": { + "rows": 6, + "warnings": [ + "sheet=Лист_1 hierarchy=outline", + "валюта в шапке не найдена" + ] + }, + "documents": [ + { + "document_type": "OSV", + "locator": "sheet:Лист_1", + "header": { + "organization_name": "ООО \"Тестовая организация\"", + "organization_inn": null, + "account_code_raw": "10", + "period_text": "2 квартал 2025 г.", + "period_year": 2025, + "period_quarter": "Q2", + "is_cumulative": false, + "period_start": "2025-04-01", + "period_end": "2025-06-30", + "is_from_year_start": false, + "data_type": "BU", + "currency": null, + "header_variant": 2 + }, + "group_schema": [ + { + "type": "ACCOUNT", + "name": "Субконто" + }, + { + "type": "OTHER", + "name": "Номенклатура" + } + ], + "columns": { + "opening_debit": "C", + "opening_credit": "D", + "turnover_debit": "E", + "turnover_credit": "F", + "closing_debit": "G", + "closing_credit": "H" + }, + "rows": [ + { + "row_number": 9, + "level": 0, + "parent_row_number": null, + "row_value": "10", + "group_type": "ACCOUNT", + "group_name": "Субконто", + "account_code_raw": "10", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "1700.00", + "opening_credit": null, + "turnover_debit": "350.00", + "turnover_credit": "100.00", + "closing_debit": "1950.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 10, + "level": 1, + "parent_row_number": 9, + "row_value": "10.1", + "group_type": "ACCOUNT", + "group_name": "Субконто", + "account_code_raw": "10.1", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "1700.00", + "opening_credit": null, + "turnover_debit": "350.00", + "turnover_credit": "100.00", + "closing_debit": "1950.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 11, + "level": 2, + "parent_row_number": 10, + "row_value": "Вал", + "group_type": "OTHER", + "group_name": "Номенклатура", + "account_code_raw": "10.1", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "1500.00", + "opening_credit": null, + "turnover_debit": "300.00", + "turnover_credit": "100.00", + "closing_debit": "1700.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 12, + "level": 3, + "parent_row_number": 11, + "row_value": "Кол-во", + "group_type": "OTHER", + "group_name": null, + "account_code_raw": "10.1", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "QUANTITY", + "opening_debit": "10.00", + "opening_credit": null, + "turnover_debit": "2.00", + "turnover_credit": "1.00", + "closing_debit": "11.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 13, + "level": 2, + "parent_row_number": 10, + "row_value": "Болт М8", + "group_type": "OTHER", + "group_name": "Номенклатура", + "account_code_raw": "10.1", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "200.00", + "opening_credit": null, + "turnover_debit": "50.00", + "turnover_credit": null, + "closing_debit": "250.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 14, + "level": 3, + "parent_row_number": 13, + "row_value": "Кол-во", + "group_type": "OTHER", + "group_name": null, + "account_code_raw": "10.1", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "QUANTITY", + "opening_debit": "400.00", + "opening_credit": null, + "turnover_debit": "100.00", + "turnover_credit": null, + "closing_debit": "500.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 15, + "level": 0, + "parent_row_number": null, + "row_value": "Итого", + "group_type": "TOTAL", + "group_name": null, + "account_code_raw": null, + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "1700.00", + "opening_credit": null, + "turnover_debit": "350.00", + "turnover_credit": "100.00", + "closing_debit": "1950.00", + "closing_credit": null, + "extra": null + } + ], + "checks": { + "total_row_matches_root": true, + "balance_identity_violations": [], + "parent_sum_violations": [] + } + } + ] +} diff --git a/golden/expected_osv_parse/synthetic/s31_rows_below_total.json b/golden/expected_osv_parse/synthetic/s31_rows_below_total.json new file mode 100644 index 0000000..8cfff18 --- /dev/null +++ b/golden/expected_osv_parse/synthetic/s31_rows_below_total.json @@ -0,0 +1,252 @@ +{ + "schema_version": "1.2", + "service": { + "name": "tabular-parser" + }, + "status": "done", + "metrics": { + "rows": 9, + "warnings": [ + "sheet=Лист_1 hierarchy=outline", + "строки 24–25: ниже таблицы (после «Итого») есть числа — строки ниже «Итого» вне документа и не разобраны" + ] + }, + "documents": [ + { + "document_type": "OSV", + "locator": "sheet:Лист_1", + "header": { + "organization_name": "ООО \"Тестовая организация\"", + "organization_inn": null, + "account_code_raw": "60", + "period_text": "1 квартал 2025 г.", + "period_year": 2025, + "period_quarter": "Q1", + "is_cumulative": true, + "period_start": "2025-01-01", + "period_end": "2025-03-31", + "is_from_year_start": true, + "data_type": "BU", + "currency": "RUB", + "header_variant": 1 + }, + "group_schema": [ + { + "type": "ACCOUNT", + "name": "Счет" + }, + { + "type": "COUNTERPARTY", + "name": "Контрагенты", + "has_inn": true + } + ], + "columns": { + "opening_debit": "G", + "opening_credit": "H", + "turnover_debit": "I", + "turnover_credit": "J", + "closing_debit": "K", + "closing_credit": "L", + "inn": "E" + }, + "rows": [ + { + "row_number": 11, + "level": 0, + "parent_row_number": null, + "row_value": "60", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "135000.00", + "opening_credit": "262500.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "503500.60", + "extra": null + }, + { + "row_number": 12, + "level": 1, + "parent_row_number": 11, + "row_value": "60.01", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60.01", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "15000.00", + "opening_credit": "253000.50", + "turnover_debit": "273000.25", + "turnover_credit": "460000.00", + "closing_debit": "65000.00", + "closing_credit": "490000.25", + "extra": null + }, + { + "row_number": 13, + "level": 2, + "parent_row_number": 12, + "row_value": "ООО Альфа", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "ООО Альфа", + "counterparty_inn": "7701234567", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "250000.50", + "turnover_debit": "180000.25", + "turnover_credit": "420000.00", + "closing_debit": null, + "closing_credit": "490000.25", + "extra": null + }, + { + "row_number": 14, + "level": 2, + "parent_row_number": 12, + "row_value": "ООО Бета", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "ООО Бета", + "counterparty_inn": "7707654321", + "data_type": "BU", + "opening_debit": "15000.00", + "opening_credit": null, + "turnover_debit": "90000.00", + "turnover_credit": "40000.00", + "closing_debit": "65000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 15, + "level": 2, + "parent_row_number": 12, + "row_value": "Иванов Иван", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.01", + "counterparty_name": "Иванов Иван", + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": null, + "opening_credit": "3000.00", + "turnover_debit": "3000.00", + "turnover_credit": null, + "closing_debit": null, + "closing_credit": null, + "extra": null + }, + { + "row_number": 16, + "level": 1, + "parent_row_number": 11, + "row_value": "60.02", + "group_type": "ACCOUNT", + "group_name": "Счет", + "account_code_raw": "60.02", + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "120000.00", + "opening_credit": "9500.10", + "turnover_debit": "38000.10", + "turnover_credit": "112000.35", + "closing_debit": "50000.00", + "closing_credit": "13500.35", + "extra": null + }, + { + "row_number": 17, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Гамма", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ООО Гамма", + "counterparty_inn": "5001234567", + "data_type": "BU", + "opening_debit": "120000.00", + "opening_credit": null, + "turnover_debit": "30000.00", + "turnover_credit": "100000.00", + "closing_debit": "50000.00", + "closing_credit": null, + "extra": null + }, + { + "row_number": 18, + "level": 2, + "parent_row_number": 16, + "row_value": "ООО Дельта", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ООО Дельта", + "counterparty_inn": "7812345678", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "8000.10", + "turnover_debit": "8000.10", + "turnover_credit": "12000.35", + "closing_debit": null, + "closing_credit": "12000.35", + "extra": null + }, + { + "row_number": 19, + "level": 2, + "parent_row_number": 16, + "row_value": "ИП Сидоров", + "group_type": "COUNTERPARTY", + "group_name": "Контрагенты", + "account_code_raw": "60.02", + "counterparty_name": "ИП Сидоров", + "counterparty_inn": "500100732259", + "data_type": "BU", + "opening_debit": null, + "opening_credit": "1500.00", + "turnover_debit": null, + "turnover_credit": null, + "closing_debit": null, + "closing_credit": "1500.00", + "extra": null + }, + { + "row_number": 20, + "level": 0, + "parent_row_number": null, + "row_value": "Итого", + "group_type": "TOTAL", + "group_name": null, + "account_code_raw": null, + "counterparty_name": null, + "counterparty_inn": null, + "data_type": "BU", + "opening_debit": "135000.00", + "opening_credit": "262500.60", + "turnover_debit": "311000.35", + "turnover_credit": "572000.35", + "closing_debit": "115000.00", + "closing_credit": "503500.60", + "extra": null + } + ], + "checks": { + "total_row_matches_root": true, + "balance_identity_violations": [], + "parent_sum_violations": [] + } + } + ] +} diff --git a/osv/synthetic/README.md b/osv/synthetic/README.md index 2520b2c..9ae48cc 100644 --- a/osv/synthetic/README.md +++ b/osv/synthetic/README.md @@ -53,10 +53,15 @@ cd tabular-parser/api | `s26_inn_below_sibling_sums.xlsx` | ИНН строкой **под** наименованием, сосед, с суммами | ИНН — своему контрагенту, `done` | | `s27_inn_below_sibling_blank.xlsx` | ИНН строкой под наименованием, сосед, без сумм (дефект main: ИНН уходил следующему контрагенту) | ИНН — своему контрагенту; направление — по блоку 60.02, кончающемуся строкой ИНН; `done` | | `s28_inn_bad_checksum.xlsx` | раскладка `s20` («над, не в дереве, без сумм»), но у ООО Альфа строка ИНН `7701234567` с неверной контрольной суммой (#35) | строка остаётся обычной, у Альфы ИНН нет, предупреждение «похожа на ИНН … контрольная сумма не сходится», `needs_check`; остальные контрагенты — со своими ИНН (направление «над» — по блоку 60.02) | +| `s29_xls_no_codepage.xls` | xls BIFF5 без записи CODEPAGE, строки в cp1251 (собран `tests/synthetic/xls_writer.py`); отступ — ведущими пробелами (AURORA-1662) | кириллица читается как cp1251, предупреждение «xls без кодовой страницы — строки прочитаны как cp1251», `done` | +| `s30_val_kol_vo_materials.xlsx` | счёт 10 (вариант 2, номенклатура): материал «Вал» без точки, под материалами строки «Кол-во» (AURORA-1663) | «Вал» — обычная строка (`data_type` шапки, `OTHER`), «Кол-во» — `QUANTITY`, `done` | +| `s31_rows_below_total.xlsx` | под «Итого» дописаны «Ответственный:», блок «ООО Альфа (ГК)» с числами и строка «Итого по ГК» (AURORA-1664) | таблица кончается на первой «Итого», хвост вне документа, предупреждение «ниже таблицы … есть числа», `done` | `s17`–`s19` — регрессия извлечения ИНН из текста (issue #9). `s14`–`s16` добавлены тестом покрытия словарей `tabular-parser` (`rules/*.yaml`, решение R-22): каждая запись словаря должна сработать на реальных или синтетических файлах; эти файлы закрывают записи, которых нет в реальных ОСВ. +`s29`–`s31` — tabular-parser#47 (кодировка xls без CODEPAGE, «Вал»/«Кол-во», строки ниже «Итого»). + `s20`–`s27` — восемь раскладок строки ИНН рядом с контрагентом (issue tabular-parser#35); ИНН с верной контрольной суммой — без подсказки в шапке другие не склеиваются. ## О файле xlsb diff --git a/osv/synthetic/s29_xls_no_codepage.xls b/osv/synthetic/s29_xls_no_codepage.xls new file mode 100644 index 0000000000000000000000000000000000000000..c36c8abb915539d9c08b8b0c26f9b36d988b01f9 GIT binary patch literal 5632 zcmeHIO>7%g5T34glg9t{rY(sIJaPi5t?YFjmq?(dqPKFXgv5!e7bIE)QPm4v=%JN3 zRftO!ZsmeFB8~`=hDul=P6$0Cy{x^e72BKjhV(~vYi8cQU9VeJrD`vron*bc^XAPr z^Ub{3Kh|^n`VZ5a@QAz(F?cwbfU%H%4?fc+Bn!Ac7|^qSr)N|}@*iU00me%8i(&0l zyfnP1=Hqzn#cKjDT94%a$-rs&6#p&)gOl(H-Y>vsSn+=^`$5~|GZV~)r)&?;ixUF> z{8M&3c{vVBfKPEe*>bp|&?C;T7bMS&|AKIRH_wGXu@_Idrh$8Kb-W0ZP(`nUFTRqc z)aEaIboOH|$=VIEdj(SPu83gl_h#2UQ;g$_=PWCndE;XewMkHw8DR=A4Qp#_Z01j^ z>)IwCFx#o~PV+Xu(;UpG%1QZoc?;GyZO3*y_TesX^&7&}v>JBX?z(-pZL{uO%iUqK z1$LXWBHJ>#u243K~oyW={%Zgt$Asw7ZNqdW%HT1{0__)3vzaMRkP(9)=&@jeDCj@4+Q zhD<1s5fhsHqb3y2h)H6^Brf6wBx$w~LzK9HMH5*19OgX@;eLqnwU(6{!X?ewUS4Vl zxKt|rxODL~sUcvJOM3sf=ZBDKm+{jp^Qw|T3P{F*VNV<>6v-$Nz{9DU*p?7!li@pN zTDVS#v`KUQdoLg&&y!2~L22W|!_V8&j|T@Z-+US2_hE~Zq!6AlYVf62|8FdCo_Ze_ z;!vp+ibm;ZdA35KC4)dNU-km=+XvaZuL;=XFpzJjq-GR$5&=n)0qhOzUqVd{Q7g0M zqa{NSl6s7gRFFR0-xaA*CrJ6SE;ZrwRpkJrg+WH3R!!cqO-46LEFB~U3*U+D=^+Ga zs8kuT-7l3v+cKfZ9*Auj;i$H{x|+PYEH%_A*cYYPRa0sx)^8RU7q$0$QWL~_t|>Ld z8TmQ%!3x6flcQ`{s$Y4#ElA5s(#nN!sj`oSmK|nv>MsG39g=qLp45Z`QI-98#!1pa zscu@WzE`ZAU#w%YLyi$8IY9s=H+B3M;WH<2M>Rx%NN(XbX%nQ28p6$oaI5QVquId0 zYO2a4u25?xf$}XBDkZ}xze&jXPz|pMuX%aA(0t($-45 zXVgFIx=4UD{#o}1Soo~#a)v-~)^!0+yXdS3w2AKfrx>Kfrx>KfoEpm EA2Ho?761SM literal 0 HcmV?d00001 diff --git a/osv/synthetic/s30_val_kol_vo_materials.xlsx b/osv/synthetic/s30_val_kol_vo_materials.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e37b220fee04efe3a691d1de63d2d82f51dd4f22 GIT binary patch literal 5550 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 W>KI7B69B+Ler1s@9rjB|fd2t=lsypu literal 0 HcmV?d00001