howler-api 4.0.0.dev1279__tar.gz → 4.0.0.dev1283__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/PKG-INFO +1 -1
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/demote.py +2 -2
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/promote.py +2 -6
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v2/ingest.py +2 -2
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/config.py +1 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/hit.py +10 -9
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/workflow.py +7 -1
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/helper.py +1 -1
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/howler_data.py +2 -6
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/random_data.py +0 -1
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/correlation_service.py +3 -2
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/hit_service.py +1 -1
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/pyproject.toml +1 -1
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/README.md +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/add_label.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/add_to_case.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/change_field.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/example_plugin.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/prioritization.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/remove_label.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/actions/transition.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/base.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/socket.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/action.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/analytic.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/auth.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/clue.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/configs.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/dossier.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/help.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/hit.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/notebook.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/overview.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/search.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/template.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/tool.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/user.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/utils/params.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v1/view.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v2/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v2/case.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v2/fuzzy.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/api/v2/search.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/app.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/README.md +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/classification.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/classification.yml +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/exceptions.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/loader.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/logging/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/logging/audit.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/logging/format.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/net.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/net_static.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/random_user.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/common/swagger.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/action_queue_worker.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/correlation.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/retention.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/README.md +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/bulk.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/collection.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/constants.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/exceptions.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/howler_store.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/operations.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/schemas.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/store.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/support/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/support/build.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/support/schemas.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/types.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/error.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/README.md +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/generate_mitre.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/generate_tlds.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/reindex_data.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/wipe_databases.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/gunicorn_config.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/healthz.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/azure.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/discover.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/oauth.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/search.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/helper/ws.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/README.md +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/base.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/charter.txt +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/constants.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/howler_enum.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/mixins.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/action.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/analytic.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/aws.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/azure.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/case.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/cbs.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/clue.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/config.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/dossier.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/event.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/gcp.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/hit.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/lead.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/localized_label.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/overview.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/pivot.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/record.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/template.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/user.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/view.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/randomizer.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/patched.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/plugins/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/plugins/config.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/README.md +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/events.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/set.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/security/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/security/socket.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/security/utils.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/action_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/analytic_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/auth_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/bundle_compat_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/case_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/comms_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/config_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/docs_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/dossier_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/event_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/fuzzy_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/jwt_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/lucene_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/notebook_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/overview_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/search_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/template_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/user_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/viewer_service.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/telemetry.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/__init__.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/annotations.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/chunk.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/compat.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/constants.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/dict_utils.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/isotime.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/list_utils.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/lucene.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/net_utils.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/path.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/socket_utils.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/str_utils.py +0 -0
- {howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/utils/uid.py +0 -0
|
@@ -76,7 +76,7 @@ def execute(
|
|
|
76
76
|
*hit_helper.demote_hit(escalation=escalation),
|
|
77
77
|
odm_helper.update("howler.assessment", None),
|
|
78
78
|
odm_helper.update("howler.rationale", None),
|
|
79
|
-
odm_helper.update("howler.
|
|
79
|
+
odm_helper.update("howler.triaged", None),
|
|
80
80
|
],
|
|
81
81
|
)
|
|
82
82
|
else:
|
|
@@ -94,7 +94,7 @@ def execute(
|
|
|
94
94
|
ds.hit.update_by_query(
|
|
95
95
|
query,
|
|
96
96
|
[
|
|
97
|
-
*hit_helper.assess_hit(assessment, rationale
|
|
97
|
+
*hit_helper.assess_hit(assessment, rationale),
|
|
98
98
|
odm_helper.update(
|
|
99
99
|
"howler.assignment",
|
|
100
100
|
user.get("uname", "automation") if user else "automation",
|
|
@@ -10,7 +10,6 @@ from howler.odm.models.howler_data import (
|
|
|
10
10
|
AssessmentEscalationMap,
|
|
11
11
|
Escalation,
|
|
12
12
|
)
|
|
13
|
-
from howler.odm.models.user import User
|
|
14
13
|
from howler.utils.str_utils import sanitize_lucene_query
|
|
15
14
|
|
|
16
15
|
OPERATION_ID = "promote"
|
|
@@ -27,7 +26,6 @@ def execute(
|
|
|
27
26
|
escalation: Escalation = Escalation.ALERT,
|
|
28
27
|
assessment: Optional[str] = None,
|
|
29
28
|
rationale: Optional[str] = None,
|
|
30
|
-
user: Optional[User] = None,
|
|
31
29
|
**kwargs,
|
|
32
30
|
):
|
|
33
31
|
"""Promote a hit.
|
|
@@ -75,7 +73,7 @@ def execute(
|
|
|
75
73
|
*hit_helper.promote_hit(escalation=escalation),
|
|
76
74
|
odm_helper.update("howler.assessment", None),
|
|
77
75
|
odm_helper.update("howler.rationale", None),
|
|
78
|
-
odm_helper.update("howler.
|
|
76
|
+
odm_helper.update("howler.triaged", None),
|
|
79
77
|
],
|
|
80
78
|
)
|
|
81
79
|
else:
|
|
@@ -90,9 +88,7 @@ def execute(
|
|
|
90
88
|
)
|
|
91
89
|
return report
|
|
92
90
|
|
|
93
|
-
ds.hit.update_by_query(
|
|
94
|
-
query, hit_helper.assess_hit(assessment, rationale, user=(user if user else "automation"))
|
|
95
|
-
)
|
|
91
|
+
ds.hit.update_by_query(query, hit_helper.assess_hit(assessment, rationale))
|
|
96
92
|
|
|
97
93
|
report.append(
|
|
98
94
|
{
|
|
@@ -11,7 +11,7 @@ from howler.common.exceptions import HowlerException, HowlerValueError
|
|
|
11
11
|
from howler.common.loader import datastore
|
|
12
12
|
from howler.common.logging import get_logger
|
|
13
13
|
from howler.common.swagger import generate_swagger_docs
|
|
14
|
-
from howler.config import config
|
|
14
|
+
from howler.config import CORRELATION_QUEUE_NAME, config
|
|
15
15
|
from howler.datastore.collection import ESCollection
|
|
16
16
|
from howler.datastore.exceptions import DataStoreException
|
|
17
17
|
from howler.datastore.howler_store import INDEXES
|
|
@@ -46,7 +46,7 @@ def _get_ingestion_queue() -> NamedQueue[str]:
|
|
|
46
46
|
|
|
47
47
|
if _ingestion_queue is None:
|
|
48
48
|
_ingestion_queue = NamedQueue(
|
|
49
|
-
|
|
49
|
+
CORRELATION_QUEUE_NAME,
|
|
50
50
|
host=config.core.redis.persistent.host,
|
|
51
51
|
port=config.core.redis.persistent.port,
|
|
52
52
|
private=False,
|
|
@@ -24,6 +24,7 @@ HWL_USE_WEBSOCKET_API = os.environ.get("HWL_USE_WEBSOCKET_API", "false").lower()
|
|
|
24
24
|
HWL_USE_JOB_SYSTEM = os.environ.get("HWL_USE_JOB_SYSTEM", "false").lower() == "true"
|
|
25
25
|
HWL_ENABLE_COVERAGE = os.environ.get("HWL_ENABLE_COVERAGE", "false").lower() == "true"
|
|
26
26
|
HWL_PLUGIN_DIRECTORY = os.environ.get("HWL_PLUGIN_DIRECTORY", "/etc/howler/plugins")
|
|
27
|
+
CORRELATION_QUEUE_NAME = os.environ.get("HWL_CORRELATION_QUEUE_NAME", "howler.ingestion_queue")
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
def get_version() -> str:
|
|
@@ -24,14 +24,11 @@ def assess_hit(
|
|
|
24
24
|
assessment: Optional[str] = None,
|
|
25
25
|
rationale: Optional[str] = None,
|
|
26
26
|
hit: Optional[Union[dict[str, Any], Hit]] = None,
|
|
27
|
-
*,
|
|
28
|
-
user: User | str,
|
|
29
27
|
**kwargs,
|
|
30
28
|
) -> list[OdmUpdateOperation]:
|
|
31
29
|
"""Update the assessment and esclation of a hit
|
|
32
30
|
|
|
33
31
|
Args:
|
|
34
|
-
user (User | str): The user making the assessment
|
|
35
32
|
assessment (Optional[str], optional): The assessment to set the hit to. Defaults to None.
|
|
36
33
|
hit (Optional[Union[dict[str, Any], Hit]], optional): The hit to update. Defaults to None.
|
|
37
34
|
|
|
@@ -55,6 +52,14 @@ def assess_hit(
|
|
|
55
52
|
if assessment is None and rationale:
|
|
56
53
|
rationale = None
|
|
57
54
|
|
|
55
|
+
if assessment is None:
|
|
56
|
+
# reset the timestamp and set state to in progress if removing assessment (re-assessing)
|
|
57
|
+
triaged_timestamp = None
|
|
58
|
+
status = Status.IN_PROGRESS
|
|
59
|
+
else:
|
|
60
|
+
triaged_timestamp = "NOW"
|
|
61
|
+
status = Status.RESOLVED
|
|
62
|
+
|
|
58
63
|
logger.debug(
|
|
59
64
|
"Updating assessment of %s to %s",
|
|
60
65
|
hit["howler"]["id"] if hit else "unknown",
|
|
@@ -66,16 +71,12 @@ def assess_hit(
|
|
|
66
71
|
escalation,
|
|
67
72
|
)
|
|
68
73
|
|
|
69
|
-
if assessment is None:
|
|
70
|
-
assessor_id = None
|
|
71
|
-
else:
|
|
72
|
-
assessor_id = user.get("uname", user.get("username", None)) if isinstance(user, User) else user
|
|
73
|
-
|
|
74
74
|
return [
|
|
75
75
|
odm_helper.update("howler.assessment", assessment),
|
|
76
76
|
odm_helper.update("howler.escalation", escalation),
|
|
77
77
|
odm_helper.update("howler.rationale", rationale, silent=True),
|
|
78
|
-
odm_helper.update("howler.
|
|
78
|
+
odm_helper.update("howler.triaged", triaged_timestamp),
|
|
79
|
+
odm_helper.update("howler.status", status),
|
|
79
80
|
]
|
|
80
81
|
|
|
81
82
|
|
|
@@ -86,7 +86,13 @@ class Workflow:
|
|
|
86
86
|
|
|
87
87
|
updates_dict[update.key] = update
|
|
88
88
|
|
|
89
|
-
if
|
|
89
|
+
if _transition.get("dest", False):
|
|
90
|
+
if self.status_prop in updates_dict and updates_dict[self.status_prop].value != _transition["dest"]:
|
|
91
|
+
raise WorkflowException(
|
|
92
|
+
f"Transition {transition} attempted to update the status {self.status_prop} with \
|
|
93
|
+
a different value than the transition destination."
|
|
94
|
+
)
|
|
95
|
+
|
|
90
96
|
updates_dict[self.status_prop] = OdmUpdateOperation(
|
|
91
97
|
ESCollection.UPDATE_SET,
|
|
92
98
|
self.status_prop,
|
|
@@ -178,10 +178,10 @@ def generate_useful_hit( # noqa: C901
|
|
|
178
178
|
|
|
179
179
|
hit.howler.assessment = None
|
|
180
180
|
hit.howler.rationale = None
|
|
181
|
+
hit.howler.triaged = None
|
|
181
182
|
hit.howler.status = "open"
|
|
182
183
|
hit.howler.assignment = "unassigned"
|
|
183
184
|
hit.howler.escalation = choice([Escalation.HIT, Escalation.ALERT])
|
|
184
|
-
hit.howler.assessor = None
|
|
185
185
|
|
|
186
186
|
if randint(1, 10) > 9:
|
|
187
187
|
hit.howler.expiry = datetime.now() + timedelta(days=randint(1, 60))
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# mypy: ignore-errors
|
|
2
|
+
from datetime import datetime
|
|
2
3
|
from typing import Optional
|
|
3
4
|
|
|
4
5
|
from howler import odm
|
|
@@ -180,12 +181,6 @@ class HowlerData(odm.Model):
|
|
|
180
181
|
description="Unique identifier of the assigned user.",
|
|
181
182
|
default=DEFAULT_ASSIGNMENT,
|
|
182
183
|
)
|
|
183
|
-
assessor: Optional[str] = odm.Optional(
|
|
184
|
-
odm.Keyword(
|
|
185
|
-
description="The most recent person to assess a hit",
|
|
186
|
-
default=None,
|
|
187
|
-
)
|
|
188
|
-
)
|
|
189
184
|
data: list[str] = odm.List(
|
|
190
185
|
odm.Keyword(description="Raw telemetry records associated with this hit."),
|
|
191
186
|
default=[],
|
|
@@ -248,6 +243,7 @@ class HowlerData(odm.Model):
|
|
|
248
243
|
)
|
|
249
244
|
)
|
|
250
245
|
)
|
|
246
|
+
triaged: Optional[datetime] = odm.Optional(odm.Date(description="Timestamp at which the hit was triaged."))
|
|
251
247
|
comment: list[Comment] = odm.List(
|
|
252
248
|
odm.Compound(Comment),
|
|
253
249
|
default=[],
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/correlation_service.py
RENAMED
|
@@ -16,6 +16,7 @@ from opentelemetry import trace
|
|
|
16
16
|
from howler.common.exceptions import InvalidDataException, NotFoundException
|
|
17
17
|
from howler.common.loader import datastore
|
|
18
18
|
from howler.common.logging import get_logger
|
|
19
|
+
from howler.config import CORRELATION_QUEUE_NAME
|
|
19
20
|
from howler.odm.models.case import CaseRule, RuleIndexTypes
|
|
20
21
|
from howler.odm.models.config import config
|
|
21
22
|
from howler.remote.datatypes.queues.named import NamedQueue
|
|
@@ -181,7 +182,7 @@ def process_batch(record_ids: list[str]) -> int: # noqa: C901
|
|
|
181
182
|
def _build_queue() -> NamedQueue[str]:
|
|
182
183
|
"""Create the NamedQueue backed by persistent Redis."""
|
|
183
184
|
return NamedQueue(
|
|
184
|
-
|
|
185
|
+
CORRELATION_QUEUE_NAME,
|
|
185
186
|
host=config.core.redis.persistent.host,
|
|
186
187
|
port=config.core.redis.persistent.port,
|
|
187
188
|
private=False,
|
|
@@ -210,7 +211,7 @@ def run_worker() -> None: # pragma: no cover – long-running loop, tested via
|
|
|
210
211
|
logger.debug("Processing correlation batch of %d hit(s)", len(batch))
|
|
211
212
|
try:
|
|
212
213
|
added = process_batch(batch)
|
|
213
|
-
logger.info("Correlation batch complete: %d
|
|
214
|
+
logger.info("Correlation batch complete: %d case item(s) added for %d record(s)", added, len(batch))
|
|
214
215
|
except Exception:
|
|
215
216
|
logger.exception("Error processing correlation batch")
|
|
216
217
|
finally:
|
|
@@ -111,7 +111,7 @@ def get_hit_workflow() -> Workflow:
|
|
|
111
111
|
"source": [Status.OPEN, Status.IN_PROGRESS],
|
|
112
112
|
"transition": HitStatusTransition.ASSESS,
|
|
113
113
|
"dest": Status.RESOLVED,
|
|
114
|
-
"actions": [assess_hit],
|
|
114
|
+
"actions": [assess_hit, assign_hit],
|
|
115
115
|
}
|
|
116
116
|
),
|
|
117
117
|
Transition(
|
|
@@ -152,7 +152,7 @@ suppress-none-returning = true
|
|
|
152
152
|
[tool.poetry]
|
|
153
153
|
package-mode = true
|
|
154
154
|
name = "howler-api"
|
|
155
|
-
version = "4.0.0.
|
|
155
|
+
version = "4.0.0.dev1283"
|
|
156
156
|
description = "Howler - API server"
|
|
157
157
|
authors = [
|
|
158
158
|
"Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/cronjobs/action_queue_worker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/datastore/migrations/fix_process.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/external/generate_sigma_rules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/autonomous_system.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/code_signature.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/odm/models/ecs/vulnerability.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/comms.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/multi.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/named.py
RENAMED
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/remote/datatypes/user_quota_tracker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.0.0.dev1279 → howler_api-4.0.0.dev1283}/howler/services/bundle_compat_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|