Utilities for Excel files.
Project description
ut_xls
Overview
Excel ‘Utilities’
The package ut_xls ís a collection of interface modules to the following ‘Python Excel Utilities’
openpyxl
pyexcelerate
pandas dataframe excel functions
polars dataframe excel functions
Installation
The package ut_xls can be installed from PyPI.
To install with pip:
$ python -m pip install ut_xls
Package files
lassification
The Package ut_xls consist of the following file types (c.f.: Appendix: Python Terminology):
Special files:
py.typed
Special modules:
__init__.py
__version__.py
Sub-packages
op Modules for Excel files using Openpyxl
Modules for Excel I/O control
iocwb.py I/O Control Module for Excel Workbooks
Modules for Excel Input control accessed by path key
pathkioiwb.py Input Module for Excel workbooks using path key
pathkioowb.py Output Module for Excel workbooks using path key
Modules for Excel Input control accessed by path
pathioiwb.py Input Module for Excel workbooks using path
pathioowb.py Output Module for Excel workbooks using path
pathiouwb.py Update Module for Excel workbooks using path
pathioiws.py Input Module for Excel worksheets using path
wb.py Module for Excel workbook processing
ws.py Module for Excel worksheet processing
rw.py Module for Excel worksheet row processing
pd Modules for Excel files using pandas
Excel I/O module
pathkioiwb.py
pathioiwb.py
pathioowb.py
pe Modules for Excel files using pyexcelerate
Excel modules for dictionary of arrays
doaos.py
doaod.py
Excel I/O modules
iocwb.py
pathkioowb.py
pathioowb.py
pl Modules for Excel files using pyexcelerate
pathioiwb.py
I/O Control Module for Excel Workbooks
Module: iocwb.py
The Module iocwb.py is used to control I/O for Excel Worksheets using the Openpyxl package; it contains the following static classes:
Static classes of module iocwb.py Name
Description
SheetNms
Manage Excel worksheet Names.
Ws
Manage Excel worksheets.
Class SheetNms
Methods
Methods of static class SheetNms Name
Description
sh_sheetnms
Show Excel workheet names.
sh_sheetnm
Show Excel workheet name.
Method: sh_sheetnms
Parameter of method sh_sheetnms Name
Type
Description
cls
class
current class.
sheetnms
TySheetnms
Excel sheet names.
sheet
TyAoSheet
Excel array of Excel sheets.
Return value of method sh_sheetnms Name
Type
Description
sheetnms
TySheetnms
Excel sheet names.
Class Ws
The class Ws contains:
the static subclass Headers,
static- or class-methods.
Subclass: Headers
Methods of static class Headers Name
Description
iter_column
Iterate over Worksheet columns.
Methods
Methods of class Ws Name
Description
append_rows
Ierate over workbook sheet names.
filter_rows
Iterate over workbook sheets.
iter_sheet_lst
sh_headers
sh_aoa
sh_id
sh_chartsheet
sh_worksheet
to_aod_apply_fnc_to_value
to_aod_apply_str_to_value
to_rows
to_row_values
to_dic
update_ws_cell_from_df_with_d_body
update_ws_cell_with_d_head
Input module for Excel workbooks accessed with path names
Module: pathkioiwb.py
The Module pathkioiwb.py is used to control Input processing for Excel Worksheets refered by patn-names using the Openpyxl package; it contains the following static class IoiPathnmWb:
Methods
Methods of class IoiPathnmWb Name
Description
load
Ierate over workbook sheet names.
read_wb_to_aod
Iterate over workbook sheets.
read_wb_to_doaod
Iterate over workbook sheets.
read_wb_to_aod_or_doaod
Iterate over workbook sheets.
read_wb_to_aoa
Iterate over workbook sheets.
sh_wb_adm
Iterate over workbook sheets.
sh_wb_del
Iterate over workbook sheets.
sh_wb_reg
Iterate over workbook sheets.
Input module for Excel workbooks accessed with path
Module: pathioiwb.py
The Module pathioiwb.py is used to control Input processing for Excel Worksheets refered by patn-names using the Openpyxl package; it contains the following static class IoiPathWb:
Methods
Methods of class IoiPathWb Name
Description
load
Load Excel workbook accessed by path
read_wb_to_aod
Read Excel workbook accessed by path into array of dictionaries.
read_wb_to_doaod
Read Excel workbook accessed by path into dictionary of array of dictionaries.
read_wb_to_aod_or_doaod
Read Excel workbook accessed by path into array of dictionaries or dictionary of array of dictionaries.
read_wb_to_aoa
Read Excel workbook accessed by path into array of arrays. .
sh_wb_adm
Show Excel workbook with admin sheet.
sh_wb_del
Show Excel workbook with delete sheet.
sh_wb_reg
Show Excel workbook with regular (admin or delete) sheets.
Input module for Excel workbooks accessed with path names
Module: pathioiws.py
The Module pathioiws.py is used to control Input processing for Excel Worksheets refered by patn-names using the Openpyxl package; it contains the following static class IoiPathWs:
Methods
Methods of class IoiPathWs Name
Description
read_ws_to_dic
Read Excel workbook accessed by path into dictionary.
read_ws_to_aod
Read Excel workbook accessed by path into array of dictionaries.
read_ws_filter_rows
Read Excel workbook accessed by path into array of dictionaries.
read_ws_to_aoa
Read Excel workbook accessed by path int oarray of arrays.
read_sheetnames
Read Excel workbook accessed by path int oarray of arrays.
read_ws_to_doaoa
Read Excel workbook accessed by path int oarray of arrays.
read_ws_to_dowsop
Read Excel workbook accessed by path int oarray of arrays.
Output module for Excel workbooks accessed with path names
Module: pathkioowb.py
The Module pathkioowb.py is used to control Output processing for Excel Worksheets refered by patn-names using the Openpyxl package; it contains the following static class IooPathNmWb:
Methods
Methods of class IooPathNmbs Name
Description
read_ws_to_dic
Read Excel workbook accessed by path into dictionary.
read_ws_to_aod
Read Excel workbook accessed by path into array of dictionaries.
read_ws_filter_rows
Read Excel workbook accessed by path into array of dictionaries.
read_ws_to_aoa
Read Excel workbook accessed by path int oarray of arrays.
read_sheetnames
Read Excel workbook accessed by path int oarray of arrays.
read_ws_to_doaoa
Read Excel workbook accessed by path int oarray of arrays.
read_ws_to_dowsop
Read Excel workbook accessed by path int oarray of arrays.
Output Module for Excel workbooks accessed with path
Module: pathioowb.py
The Module pathioowb.py is used to control Output processing for Excel Worksheets refered by patn-names using the Openpyxl package; it contains the following static class IooPathWb:
Methods
Methods of class IooPathNmbs Name
Description
read_ws_to_dic
Read Excel workbook accessed by path into dictionary.
read_ws_to_aod
Read Excel workbook accessed by path into array of dictionaries.
read_ws_filter_rows
Read Excel workbook accessed by path into array of dictionaries.
read_ws_to_aoa
Read Excel workbook accessed by path int oarray of arrays.
read_sheetnames
Read Excel workbook accessed by path int oarray of arrays.
read_ws_to_doaoa
Read Excel workbook accessed by path int oarray of arrays.
read_ws_to_dowsop
Read Excel workbook accessed by path int oarray of arrays.
Update Module for Excel workbooks accessed with path
Module: pathioowb.py
The Module pathioowb.py is used to control Output processing for Excel Worksheets refered by patn-names using the Openpyxl package; it contains the following static class IooPathWb:
Methods
Methods of class IooPathNmbs Name
Description
read_ws_to_dic
Read Excel workbook accessed by path into dictionary.
read_ws_to_aod
Read Excel workbook accessed by path into array of dictionaries.
read_ws_filter_rows
Read Excel workbook accessed by path into array of dictionaries.
read_ws_to_aoa
Read Excel workbook accessed by path int oarray of arrays.
read_sheetnames
Read Excel workbook accessed by path int oarray of arrays.
read_ws_to_doaoa
Read Excel workbook accessed by path int oarray of arrays.
read_ws_to_dowsop
Read Excel workbook accessed by path int oarray of arrays.
Modules for Excel worksheet row processing
Module: rw.py
The Module rw.py is used to manage Excel Worksheet rows using the Openpyxl package; it contains the following static class:
Static classes of module rw.py Name
Description
Rw
Manage Excel worksheet rows
Class Rw
Methods
Methods of static class Rw Name
Description
iter_cell_value
Iterate over cell values of Excel worksheet rows
Method: iter_cell_value
Parameter of method iter_cell_value Name
Type
Description
cls
class
current class
row
TyTupleCell
Excel Worksheet rows
**kwargs
TyAny
Keyword arguments
Yield value of method iter_cell_value Name
Type
Description
cell.value
TyAny
Excel Worksheet row cell value
Modules for Excel workbook processing
Module: wb.py
The Module wb.py is used to manage Excel Workbooks using the Openpyxl package; it contains the following static classes:
Static Classes of Input I/O Module ioipath.py Name
Description
DoAoA
Manage workbooks from Dictionaries of Arrays.
DoAoA
Manage workbooks from Dictionaries of dictionaries.
Wb
Manage workbooks.
Class DoAoA
Methods
Methods of static class DoAoA Name
Description
create_wb
Create Excel Workbook from Dictionary of array of arrays using the openpyxel package.
Method: create_wb
Parameter of method create_wb Name
Type
Description
doaoa
TyDoAoA
Dictionary of array of dictionaries
Return value of method create_wb Name
Type
Description
wb
TyWb
Excel Workbook of Openpyxl package
Class DoAoD
Methods
Methods of static class DoAoD Name
Description
create_wb
Create Excel Workbook from Dictionary of array of dictionaries using the openpyxxel package.
Method: create_wb
Parameter of method create_wb Name
Type
Description
doaoa
TyDoAoA
Dictionary of array of dictionaries
Return value of method create_wb Name
Type
Description
wb
TyWb
Excel Workbook of Openpyxl package
Class Wb
Methods
Methods of static class Wb Name
Description
iter_sheet_names
Ierate over workbook sheet names.
iter_sheet
Iterate over workbook sheets.
sh_sheetnm
sh_sheetnms
sh_sheet_by_sheetnm
sh_sheet
sh_chartsheet_by_sheetnm
sh_chartsheet
sh_worksheet_by_sheetnm
sh_worksheet
to_aod
to_doaod
to_aod_or_doaod
createupdate_wb_with_doaoa
update_wb_with_aoa
update_wb_with_aod
update_wb_with_doaoa
update_wb_with_dodf
Modules for Excel worksheet processing
Module: ws.py
The Module ws.py is used to manage Excel Worksheets using the Openpyxl package; it contains the following static classes:
Static classes of module ws.py Name
Description
DoAoA
Manage workbooks from Dictionaries of Arrays
DoAoA
Manage workbooks from Dictionaries of dictionaries.
Wb
Manage workbooks.
Appendix
Package Logging
Description
Logging use the module log.py of the logging package ut_log. The module supports two Logging types:
Standard Logging (std) or
User Logging (usr).
The Logging type can be defined by one of the values ‘std’ or ‘usr’ of the parameter log_type; ‘std’ is the default. The different Logging types are configured by one of the following configuration files:
log.std.yml or
log.usr.yml
The configuration files can be stored in different configuration directories (ordered by increased priority):
<package directory of the log package ut_log>/cfg,
<package directory of the application package ui_eviq_srr>/cfg,
<application directory of the application eviq>/cfg,
The active configuration file is the configuration file in the directory with the highest priority.
Examples
Site-packages-path = /appl/eviq/.pyenv/versions/3.11.12/lib/python3.11/site-packages Log-package = ut_log Application-package = ui_eviq_srr Application-home-path = /appl/eviq
Log Configuration |
|||
|---|---|---|---|
Type |
Directory Type |
Directory |
File |
std |
Log package |
<Site-packages-path>/<Log-package>/cfg |
log.std.yml |
Application package |
<Site-packages-path>/<application-package>/cfg |
||
Application |
<application-home-path>/cfg |
||
usr |
Log package |
<site-packages-path>/ut_log/cfg |
log.usr.yml |
Application package |
<site-packages-path>/ui_eviq_srr/cfg |
||
Application |
<application-path>/cfg |
Log message types
Logging defines log file path names for the following log message types: .
debug
info
warning
error
critical
Log types and Log directories
Single or multiple Application log directories can be used for each message type:
Log type |
Log directory |
||
|---|---|---|---|
long |
short |
multiple |
single |
debug |
dbqs |
dbqs |
logs |
info |
infs |
infs |
logs |
warning |
wrns |
wrns |
logs |
error |
errs |
errs |
logs |
critical |
crts |
crts |
logs |
Application parameter for logging
Name |
Decription |
Value |
Description |
Default |
Example |
|---|---|---|---|---|---|
appl_data |
data directory |
/data/eviq |
|||
tenant |
tenant name |
UMH |
UMH |
||
package |
package name |
ui_eviq_srr |
|||
cmd |
command |
evupreg |
|||
log_type |
Logging Type |
std: |
Standard logging |
std |
std |
usr: |
User Logging |
||||
log_ts_type |
Logging timestamp type |
ts: |
Sec since 1.1.1970 |
ts |
ts |
dt: |
Datetime |
||||
log_sw_single_dir |
Use single log directory |
True |
use single dir. |
True |
True |
False |
use muliple dir. |
Log files naming
Naming Conventions (table format)
Type |
Directory |
File |
|---|---|---|
debug |
/<appl_data>/<tenant>/RUN/<package>/<cmd>/debs |
debs_<ts>_<pid>.log |
critical |
/<appl_data>/<tenant>/RUN/<package>/<cmd>/logs |
crts_<ts>_<pid>.log |
error |
/<appl_data>/<tenant>/RUN/<package>/<cmd>/logs |
errs_<ts>_<pid>.log |
info |
/<appl_data>/<tenant>/RUN/<package>/<cmd>/logs |
infs_<ts>_<pid>.log |
warning |
/<appl_data>/<tenant>/RUN/<package>/<cmd>/logs |
rnsg_<ts>_<pid>.log |
Naming Conventions (tree format)
<appl_data> Application data folder
│
└── <tenant> Application tenant folder
│
└── RUN Applications RUN folder for Application log files
│
└── <package> RUN folder of Application package: <package>
│
└── <cmd> RUN folder of Application command <cmd>
│
├── debs Application command debug messages folder
│ │
│ └── debs_<ts>_<pid>.log debug messages for
│ run of command <cmd>
│ with pid <pid> at <ts>
│
└── logs Application command log messages folder
│
├── crts_<ts>_<pid>.log critical messages for
│ run of command <cmd>
│ with pid <pid> at <ts>
├── errs_<ts>_<pid>.log error messages for
│ run of command <cmd>
│ with pid <pid> at <ts>
├── infs_<ts>_<pid>.log info messages for
│ run of command <cmd>
│ with pid <pid> at <ts>
└── wrns_<ts>_<pid>.log warning messages for
run of command <cmd>
with pid <pid> at <ts>
Naming Examples (table format)
Type |
Directory |
File |
|---|---|---|
debug |
/appl/eviq/UMH/RUN/ui_eviq_srr/evdomap/debs/ |
debs_1750096540_354710.log |
critical |
/appl/eviq/UMH/RUN/ui_eviq_srr/evdomap/logs/ |
crts_1749971151_240257.log |
error |
errs_1749971151_240257.log |
|
info |
infs_1750096540_354710.log |
|
warning |
wrns_1749971151_240257.log |
Naming Examples (tree format)
/data/eviq/UMH/RUN/ui_eviq_srr/evdomap Run folder of
│ of function evdomap
│ of package ui_eviq_srr
│ for teanant UMH
│ of application eviq
│
├── debs debug folder of Application function: evdomap
│ │
│ └── debs_1748609414_314062.log debug messages for run
│ of function evdomap
│ using pid: 314062 at: 1748609414
│
└── logs log folder of Application function: evdomap
│
├── errs_1748609414_314062.log error messages for run
│ of function evdomap
│ with pid: 314062 at: 1748609414
├── infs_1748609414_314062.log info messages for run
│ of function evdomap
│ with pid: 314062 at: 1748609414
└── wrns_1748609414_314062.log warning messages for run
of function evdomap
with pid: 314062 at: 1748609414
Configuration files
log.std.yml (jinja2 yml file)
Content
version: 1
disable_existing_loggers: False
loggers:
# standard logger
std:
# level: NOTSET
level: DEBUG
handlers:
- std_debug_console
- std_debug_file
- std_info_file
- std_warning_file
- std_error_file
- std_critical_file
handlers:
std_debug_console:
class: 'logging.StreamHandler'
level: DEBUG
formatter: std_debug
stream: 'ext://sys.stderr'
std_debug_file:
class: 'logging.FileHandler'
level: DEBUG
formatter: std_debug
filename: '{{dir_run_debs}}/debs_{{ts}}_{{pid}}.log'
mode: 'a'
delay: true
std_info_file:
class: 'logging.FileHandler'
level: INFO
formatter: std_info
filename: '{{dir_run_infs}}/infs_{{ts}}_{{pid}}.log'
mode: 'a'
delay: true
std_warning_file:
class: 'logging.FileHandler'
level: WARNING
formatter: std_warning
filename: '{{dir_run_wrns}}/wrns_{{ts}}_{{pid}}.log'
mode: 'a'
delay: true
std_error_file:
class: 'logging.FileHandler'
level: ERROR
formatter: std_error
filename: '{{dir_run_errs}}/errs_{{ts}}_{{pid}}.log'
mode: 'a'
delay: true
std_critical_file:
class: 'logging.FileHandler'
level: CRITICAL
formatter: std_critical
filename: '{{dir_run_crts}}/crts_{{ts}}_{{pid}}.log'
mode: 'a'
delay: true
std_critical_mail:
class: 'logging.handlers.SMTPHandler'
level: CRITICAL
formatter: std_critical_mail
mailhost : localhost
fromaddr: 'monitoring@domain.com'
toaddrs:
- 'dev@domain.com'
- 'qa@domain.com'
subject: 'Critical error with application name'
formatters:
std_debug:
format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
datefmt: '%Y-%m-%d %H:%M:%S'
std_info:
format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
datefmt: '%Y-%m-%d %H:%M:%S'
std_warning:
format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
datefmt: '%Y-%m-%d %H:%M:%S'
std_error:
format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
datefmt: '%Y-%m-%d %H:%M:%S'
std_critical:
format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
datefmt: '%Y-%m-%d %H:%M:%S'
std_critical_mail:
format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
datefmt: '%Y-%m-%d %H:%M:%S'
Jinja2-variables
Name |
Definition |
Example |
|---|---|---|
dir_run_debs |
debug run directory |
/data/eviq/UMH/RUN/ui_eviq_srr/evupreg/debs |
dir_run_infs |
info run directory |
/data/eviq/UMH/RUN/ui_eviq_srr/evupreg/logs |
dir_run_wrns |
warning run directory |
|
dir_run_errs |
error run directory |
|
dir_run_crts |
critical error run directory |
|
ts |
Timestamp since 1970 in [sec] if log_ts_type == ‘ts’ |
1749483509 |
Datetime in timezone Europe/ Berlin if log_ts_type == ‘dt’ |
20250609 17:38:29 GMT+0200 |
|
pid |
Process ID |
79133 |
Python Glossary
Python Modules
Overview
Python Modules Name
Definition
Python modules
Files with suffix .py; they could be empty or contain python code; other modules can be imported into a module.
special Python modules
Modules like __init__.py or main.py with special names and functionality.
Python Function
Overview
Python Function Name
Definition
Python function
Files with suffix .py; they could be empty or contain python code; other modules can be imported into a module.
special Python modules
Modules like __init__.py or main.py with special names and functionality.
Python Packages
Overview
Python Packages Overview Name
Definition
Python package
Python packages are directories that contains the special module __init__.py and other modules, sub packages, files or directories.
Python sub-package
Python sub-packages are python packages which are contained in another python package.
Python package sub-directory
directory contained in a python package.
Python package special sub-directory
Python package sub-directories with a special meaning like data or cfg
Special python package sub-directories
Special python package sub-directories Name
Description
bin
Directory for package scripts.
cfg
Directory for package configuration files.
data
Directory for package data files.
service
Directory for systemd service scripts.
Python Files
Overview
Python files Name
Definition
Python modules
Files with suffix .py; they could be empty or contain python code; other modules can be imported into a module.
Python package files
Files within a python package.
Python dunder modules
Python modules which are named with leading and trailing double underscores.
special Python files
Files which are not modules and used as python marker files like py.typed.
special Python modules
Modules like __init__.py or main.py with special names and functionality.
Python Special Files
Python special files Name
Type
Description
py.typed
Type checking marker file
The py.typed file is a marker file used in Python packages to indicate that the package supports type checking. This is a part of the PEP 561 standard, which provides a standardized way to package and distribute type information in Python.
Python Special Modules
Python special modules Name
Type
Description
__init__.py
Package directory marker file
The dunder (double underscore) module __init__.py is used to execute initialisation code or mark the directory it contains as a package. The Module enforces explicit imports and thus clear namespace use and call them with the dot notation.
__main__.py
entry point for the package
The dunder module __main__.py serves as package entry point point. The module is executed when the package is called by the interpreter with the command python -m <package name>.
__version__.py
Version file
The dunder module __version__.py consist of assignment statements used in Versioning.
Python classes
Overview
Python classes overview Name
Description
Python class
A class is a container to group related methods and variables together, even if no objects are created. This helps in organizing code logically.
Python static class
A class which contains only @staticmethod or @classmethod methods and no instance-specific attributes or methods.
Python methods
Overview
Python methods overview Name
Description
Python method
Python functions defined in python modules.
Python class method
Python functions defined in python classes.
Python special class method
Python class methods with special names and functionalities.
Python class methods
Python class methods Name
Description
Python no instance class method
Python function defined in python classes and decorated with @classmethod or @staticmethod. The first parameter conventionally called cls is a reference to the current class.
Python instance class method
Python function defined in python classes; the first parameter conventionally called self is a reference to the current class object.
special Python class method
Python class functions with special names and functionalities.
Python special class methods
Python methods examples Name
Type
Description
__init__
class object constructor method
The special method __init__ is called when an instance (object) of a class is created; instance attributes can be defined and initalized in the method. The method us a single parameter conventionally called self to access the object.
Table of Contents
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ut_xls-2.0.0.20251021.tar.gz.
File metadata
- Download URL: ut_xls-2.0.0.20251021.tar.gz
- Upload date:
- Size: 51.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c5d1ba25bfbdabbf2649a1fec15a5cb7af5c47cde048ee5287f6ad96c1dd769a
|
|
| MD5 |
907cde3cf52413930e592c440ff6b6b9
|
|
| BLAKE2b-256 |
fb18b2b7fbddd5324502902fa84642bd071bda64cd07e68fa0563f8a28d75cb6
|
File details
Details for the file ut_xls-2.0.0.20251021-py3-none-any.whl.
File metadata
- Download URL: ut_xls-2.0.0.20251021-py3-none-any.whl
- Upload date:
- Size: 26.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8f5edced432de481f7e8bf5dadb082db1c08ccd78cc45b3a86b61e17ddb4ca76
|
|
| MD5 |
7912d28771f00afcba792d30bf3103cc
|
|
| BLAKE2b-256 |
f2af95ea3899a80f2db150c90a7e2738f4f71a8b7578238578b99962e8a98368
|