pycarlo 0.12.330__tar.gz → 0.12.332__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.
- {pycarlo-0.12.330 → pycarlo-0.12.332}/PKG-INFO +1 -1
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/lib/schema.json +199 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/lib/schema.py +104 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo.egg-info/PKG-INFO +1 -1
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/data/schema_original.py +104 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/.circleci/README.md +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/.circleci/config.yml +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/.circleci/scripts/clean-generated-types-prs.sh +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/.coveragerc +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/.github/workflows/release.yml +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/.gitignore +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/.pre-commit-config.yaml +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/CONTRIBUTING.md +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/LICENSE +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/Makefile +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/README.md +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/examples/sample_agent_ci_build_script.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/examples/sample_circuit_breaker.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/examples/sample_ingest_lineage.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/examples/sample_ingest_metadata.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/examples/sample_ingest_query_logs.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/examples/sample_insight_upload.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/common/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/common/errors.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/common/files.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/common/http.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/common/mcon.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/common/retries.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/common/settings.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/common/utils.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/core/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/core/client.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/core/endpoint.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/core/operations.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/core/session.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/agent/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/agent/models.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/agent/queries.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/agent/service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/circuit_breakers/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/circuit_breakers/exceptions.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/circuit_breakers/service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/dbt/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/dbt/dbt_importer.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/dbt/queries.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/exceptions.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/ingestion/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/ingestion/exceptions.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/ingestion/models.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/ingestion/service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/metadata/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/metadata/asset_allow_block_list.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/metadata/asset_filters_container.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/metadata/base_allow_block_list.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/metadata/metadata_allow_block_list.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/metadata/metadata_filters_container.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/monitor/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/monitor/models.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/monitor/queries.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/monitor/service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/pii/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/pii/constants.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/pii/pii_filterer.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/pii/queries.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/pii/service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/user/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/user/exceptions.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/user/models.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/user/queries.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/user/service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/lib/README.md +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/lib/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/lib/types.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo.egg-info/SOURCES.txt +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo.egg-info/dependency_links.txt +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo.egg-info/requires.txt +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo.egg-info/top_level.txt +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/pyproject.toml +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/requirements-ci.txt +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/requirements-dev.txt +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/requirements.txt +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/setup.cfg +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/setup.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/test_agent_spans.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/common/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/common/data.json +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/common/test_files.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/common/test_http.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/common/test_mcon.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/common/test_retries.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/common/test_utils.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/data/README.md +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/agent/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/agent/test_service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/circuit_breakers/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/circuit_breakers/test_service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/dbt/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/dbt/sample_logs.txt +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/dbt/sample_manifest.json +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/dbt/sample_run_results.json +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/dbt/test_dbt_importer.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/ingestion/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/ingestion/test_models.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/ingestion/test_service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/metadata/test_asset_filtering.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/metadata/test_dataset_filtering.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/monitor/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/monitor/test_service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/pii/sample_events/sample_md_events_01.json +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/pii/sample_events/sample_md_events_02.json +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/pii/test_pii_filtering.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/user/__init__.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/user/test_user_service.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/lib/test_enum.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/lib/test_enum_integration.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/lib/test_schema_generation.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/test_client.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/test_forgiving_enums_published.sh +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/test_operations.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/test_retry_decorator.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/test_session.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/tests/verify_forgiving_enums_published.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/utils/env.sh +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/utils/generate.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/utils/sample.env +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/utils/sanity.py +0 -0
- {pycarlo-0.12.330 → pycarlo-0.12.332}/utils/vars.py +0 -0
|
@@ -6449,6 +6449,67 @@
|
|
|
6449
6449
|
"ofType": null
|
|
6450
6450
|
}
|
|
6451
6451
|
},
|
|
6452
|
+
{
|
|
6453
|
+
"args": [
|
|
6454
|
+
{
|
|
6455
|
+
"defaultValue": null,
|
|
6456
|
+
"description": "SQL query to parse",
|
|
6457
|
+
"name": "query",
|
|
6458
|
+
"type": {
|
|
6459
|
+
"kind": "NON_NULL",
|
|
6460
|
+
"name": null,
|
|
6461
|
+
"ofType": {
|
|
6462
|
+
"kind": "SCALAR",
|
|
6463
|
+
"name": "String",
|
|
6464
|
+
"ofType": null
|
|
6465
|
+
}
|
|
6466
|
+
}
|
|
6467
|
+
},
|
|
6468
|
+
{
|
|
6469
|
+
"defaultValue": null,
|
|
6470
|
+
"description": "Candidate log_types (push resource_type values) to try, 1..15 entries.",
|
|
6471
|
+
"name": "logTypes",
|
|
6472
|
+
"type": {
|
|
6473
|
+
"kind": "NON_NULL",
|
|
6474
|
+
"name": null,
|
|
6475
|
+
"ofType": {
|
|
6476
|
+
"kind": "LIST",
|
|
6477
|
+
"name": null,
|
|
6478
|
+
"ofType": {
|
|
6479
|
+
"kind": "NON_NULL",
|
|
6480
|
+
"name": null,
|
|
6481
|
+
"ofType": {
|
|
6482
|
+
"kind": "SCALAR",
|
|
6483
|
+
"name": "String",
|
|
6484
|
+
"ofType": null
|
|
6485
|
+
}
|
|
6486
|
+
}
|
|
6487
|
+
}
|
|
6488
|
+
}
|
|
6489
|
+
}
|
|
6490
|
+
],
|
|
6491
|
+
"deprecationReason": null,
|
|
6492
|
+
"description": "(experimental) For each candidate log_type, returns the sources and destination Monte Carlo's SQL parser would extract from the query. Useful for push-ingestion customers comparing extraction across log_types before committing to one for POST /ingest/v1/querylogs \u2014 pick the one whose lineage matches your real data flow. The alias 'generic' maps to the transactional-db dialect for warehouses that do not have a dedicated parser. Parser behavior mirrors production push ingestion: Rust SQL parser first, Java Presto parser fallback on Rust error or timeout. So the lineage shown here is a faithful preview of what downstream OpenSearch will index for the same payload \u2014 not a dialect-strictness check. If every log_type returns the same lineage for a query, that's genuine 'any of these will work' news; if they diverge, you pick the one whose extraction matches your intent. Scope note: this is a pre-decision discovery tool. It does not perform MCON resolution \u2014 use ``parseQuery`` with a chosen ``resourceId`` for that, once a log_type has been picked.",
|
|
6493
|
+
"isDeprecated": false,
|
|
6494
|
+
"name": "parseQueryForLogTypes",
|
|
6495
|
+
"type": {
|
|
6496
|
+
"kind": "NON_NULL",
|
|
6497
|
+
"name": null,
|
|
6498
|
+
"ofType": {
|
|
6499
|
+
"kind": "LIST",
|
|
6500
|
+
"name": null,
|
|
6501
|
+
"ofType": {
|
|
6502
|
+
"kind": "NON_NULL",
|
|
6503
|
+
"name": null,
|
|
6504
|
+
"ofType": {
|
|
6505
|
+
"kind": "OBJECT",
|
|
6506
|
+
"name": "LogTypeParseResult",
|
|
6507
|
+
"ofType": null
|
|
6508
|
+
}
|
|
6509
|
+
}
|
|
6510
|
+
}
|
|
6511
|
+
}
|
|
6512
|
+
},
|
|
6452
6513
|
{
|
|
6453
6514
|
"args": [
|
|
6454
6515
|
{
|
|
@@ -127672,6 +127733,101 @@
|
|
|
127672
127733
|
"name": "SqlParsedTable",
|
|
127673
127734
|
"possibleTypes": null
|
|
127674
127735
|
},
|
|
127736
|
+
{
|
|
127737
|
+
"description": null,
|
|
127738
|
+
"enumValues": null,
|
|
127739
|
+
"fields": [
|
|
127740
|
+
{
|
|
127741
|
+
"args": [],
|
|
127742
|
+
"deprecationReason": null,
|
|
127743
|
+
"description": "The candidate log_type this result corresponds to, echoed from the input (e.g. 'snowflake', 'bigquery', 'generic').",
|
|
127744
|
+
"isDeprecated": false,
|
|
127745
|
+
"name": "logType",
|
|
127746
|
+
"type": {
|
|
127747
|
+
"kind": "NON_NULL",
|
|
127748
|
+
"name": null,
|
|
127749
|
+
"ofType": {
|
|
127750
|
+
"kind": "SCALAR",
|
|
127751
|
+
"name": "String",
|
|
127752
|
+
"ofType": null
|
|
127753
|
+
}
|
|
127754
|
+
}
|
|
127755
|
+
},
|
|
127756
|
+
{
|
|
127757
|
+
"args": [],
|
|
127758
|
+
"deprecationReason": null,
|
|
127759
|
+
"description": "Parsed query sources for this log_type. ``mcon`` is always null here \u2014 this API does not perform table resolution. Call ``parseQuery`` with a chosen ``resourceId`` once the right dialect has been identified to get MCONs.",
|
|
127760
|
+
"isDeprecated": false,
|
|
127761
|
+
"name": "sources",
|
|
127762
|
+
"type": {
|
|
127763
|
+
"kind": "LIST",
|
|
127764
|
+
"name": null,
|
|
127765
|
+
"ofType": {
|
|
127766
|
+
"kind": "NON_NULL",
|
|
127767
|
+
"name": null,
|
|
127768
|
+
"ofType": {
|
|
127769
|
+
"kind": "OBJECT",
|
|
127770
|
+
"name": "SqlParsedTable",
|
|
127771
|
+
"ofType": null
|
|
127772
|
+
}
|
|
127773
|
+
}
|
|
127774
|
+
}
|
|
127775
|
+
},
|
|
127776
|
+
{
|
|
127777
|
+
"args": [],
|
|
127778
|
+
"deprecationReason": null,
|
|
127779
|
+
"description": "Parsed query destination for this log_type. ``mcon`` is always null here \u2014 see the note on ``sources``.",
|
|
127780
|
+
"isDeprecated": false,
|
|
127781
|
+
"name": "destination",
|
|
127782
|
+
"type": {
|
|
127783
|
+
"kind": "OBJECT",
|
|
127784
|
+
"name": "SqlParsedTable",
|
|
127785
|
+
"ofType": null
|
|
127786
|
+
}
|
|
127787
|
+
},
|
|
127788
|
+
{
|
|
127789
|
+
"args": [],
|
|
127790
|
+
"deprecationReason": null,
|
|
127791
|
+
"description": "SQL parser errors for this log_type",
|
|
127792
|
+
"isDeprecated": false,
|
|
127793
|
+
"name": "errors",
|
|
127794
|
+
"type": {
|
|
127795
|
+
"kind": "LIST",
|
|
127796
|
+
"name": null,
|
|
127797
|
+
"ofType": {
|
|
127798
|
+
"kind": "NON_NULL",
|
|
127799
|
+
"name": null,
|
|
127800
|
+
"ofType": {
|
|
127801
|
+
"kind": "SCALAR",
|
|
127802
|
+
"name": "String",
|
|
127803
|
+
"ofType": null
|
|
127804
|
+
}
|
|
127805
|
+
}
|
|
127806
|
+
}
|
|
127807
|
+
},
|
|
127808
|
+
{
|
|
127809
|
+
"args": [],
|
|
127810
|
+
"deprecationReason": null,
|
|
127811
|
+
"description": "True when the parser returned no errors and at least one source or a destination was parsed for this log_type.",
|
|
127812
|
+
"isDeprecated": false,
|
|
127813
|
+
"name": "success",
|
|
127814
|
+
"type": {
|
|
127815
|
+
"kind": "NON_NULL",
|
|
127816
|
+
"name": null,
|
|
127817
|
+
"ofType": {
|
|
127818
|
+
"kind": "SCALAR",
|
|
127819
|
+
"name": "Boolean",
|
|
127820
|
+
"ofType": null
|
|
127821
|
+
}
|
|
127822
|
+
}
|
|
127823
|
+
}
|
|
127824
|
+
],
|
|
127825
|
+
"inputFields": null,
|
|
127826
|
+
"interfaces": [],
|
|
127827
|
+
"kind": "OBJECT",
|
|
127828
|
+
"name": "LogTypeParseResult",
|
|
127829
|
+
"possibleTypes": null
|
|
127830
|
+
},
|
|
127675
127831
|
{
|
|
127676
127832
|
"description": "Describes the result of pinging a data collector.",
|
|
127677
127833
|
"enumValues": null,
|
|
@@ -155950,6 +156106,16 @@
|
|
|
155950
156106
|
"ofType": null
|
|
155951
156107
|
}
|
|
155952
156108
|
},
|
|
156109
|
+
{
|
|
156110
|
+
"defaultValue": null,
|
|
156111
|
+
"description": "Return only findings whose parent finding has this UUID.",
|
|
156112
|
+
"name": "parentFindingUuid",
|
|
156113
|
+
"type": {
|
|
156114
|
+
"kind": "SCALAR",
|
|
156115
|
+
"name": "UUID",
|
|
156116
|
+
"ofType": null
|
|
156117
|
+
}
|
|
156118
|
+
},
|
|
155953
156119
|
{
|
|
155954
156120
|
"defaultValue": null,
|
|
155955
156121
|
"description": null,
|
|
@@ -155989,6 +156155,16 @@
|
|
|
155989
156155
|
"name": "DateTime",
|
|
155990
156156
|
"ofType": null
|
|
155991
156157
|
}
|
|
156158
|
+
},
|
|
156159
|
+
{
|
|
156160
|
+
"defaultValue": null,
|
|
156161
|
+
"description": "Order of results by detection_time. Defaults to DESC (newest first).",
|
|
156162
|
+
"name": "detectionTimeOrder",
|
|
156163
|
+
"type": {
|
|
156164
|
+
"kind": "ENUM",
|
|
156165
|
+
"name": "FindingSortDirection",
|
|
156166
|
+
"ofType": null
|
|
156167
|
+
}
|
|
155992
156168
|
}
|
|
155993
156169
|
],
|
|
155994
156170
|
"interfaces": null,
|
|
@@ -155996,6 +156172,29 @@
|
|
|
155996
156172
|
"name": "FindingFilterInput",
|
|
155997
156173
|
"possibleTypes": null
|
|
155998
156174
|
},
|
|
156175
|
+
{
|
|
156176
|
+
"description": null,
|
|
156177
|
+
"enumValues": [
|
|
156178
|
+
{
|
|
156179
|
+
"deprecationReason": null,
|
|
156180
|
+
"description": null,
|
|
156181
|
+
"isDeprecated": false,
|
|
156182
|
+
"name": "ASC"
|
|
156183
|
+
},
|
|
156184
|
+
{
|
|
156185
|
+
"deprecationReason": null,
|
|
156186
|
+
"description": null,
|
|
156187
|
+
"isDeprecated": false,
|
|
156188
|
+
"name": "DESC"
|
|
156189
|
+
}
|
|
156190
|
+
],
|
|
156191
|
+
"fields": null,
|
|
156192
|
+
"inputFields": null,
|
|
156193
|
+
"interfaces": null,
|
|
156194
|
+
"kind": "ENUM",
|
|
156195
|
+
"name": "FindingSortDirection",
|
|
156196
|
+
"possibleTypes": null
|
|
156197
|
+
},
|
|
155999
156198
|
{
|
|
156000
156199
|
"description": null,
|
|
156001
156200
|
"enumValues": null,
|
|
@@ -3487,6 +3487,17 @@ class FindingSeverity(pycarlo.lib.types.Enum):
|
|
|
3487
3487
|
__choices__ = ("CRITICAL", "INFO", "WARNING")
|
|
3488
3488
|
|
|
3489
3489
|
|
|
3490
|
+
class FindingSortDirection(pycarlo.lib.types.Enum):
|
|
3491
|
+
"""Enumeration Choices:
|
|
3492
|
+
|
|
3493
|
+
* `ASC`None
|
|
3494
|
+
* `DESC`None
|
|
3495
|
+
"""
|
|
3496
|
+
|
|
3497
|
+
__schema__ = schema
|
|
3498
|
+
__choices__ = ("ASC", "DESC")
|
|
3499
|
+
|
|
3500
|
+
|
|
3490
3501
|
class FindingStatus(pycarlo.lib.types.Enum):
|
|
3491
3502
|
"""Enumeration Choices:
|
|
3492
3503
|
|
|
@@ -9619,10 +9630,12 @@ class FindingFilterInput(sgqlc.types.Input):
|
|
|
9619
9630
|
"agentic_scope_uuids",
|
|
9620
9631
|
"use_cases",
|
|
9621
9632
|
"asset_mcon",
|
|
9633
|
+
"parent_finding_uuid",
|
|
9622
9634
|
"search_query",
|
|
9623
9635
|
"needs_attention",
|
|
9624
9636
|
"detection_time_start",
|
|
9625
9637
|
"detection_time_end",
|
|
9638
|
+
"detection_time_order",
|
|
9626
9639
|
)
|
|
9627
9640
|
finding_types = sgqlc.types.Field(
|
|
9628
9641
|
sgqlc.types.list_of(sgqlc.types.non_null(FindingType)), graphql_name="findingTypes"
|
|
@@ -9650,6 +9663,9 @@ class FindingFilterInput(sgqlc.types.Input):
|
|
|
9650
9663
|
|
|
9651
9664
|
asset_mcon = sgqlc.types.Field(String, graphql_name="assetMcon")
|
|
9652
9665
|
|
|
9666
|
+
parent_finding_uuid = sgqlc.types.Field(UUID, graphql_name="parentFindingUuid")
|
|
9667
|
+
"""Return only findings whose parent finding has this UUID."""
|
|
9668
|
+
|
|
9653
9669
|
search_query = sgqlc.types.Field(String, graphql_name="searchQuery")
|
|
9654
9670
|
|
|
9655
9671
|
needs_attention = sgqlc.types.Field(Boolean, graphql_name="needsAttention")
|
|
@@ -9658,6 +9674,13 @@ class FindingFilterInput(sgqlc.types.Input):
|
|
|
9658
9674
|
|
|
9659
9675
|
detection_time_end = sgqlc.types.Field(DateTime, graphql_name="detectionTimeEnd")
|
|
9660
9676
|
|
|
9677
|
+
detection_time_order = sgqlc.types.Field(
|
|
9678
|
+
FindingSortDirection, graphql_name="detectionTimeOrder"
|
|
9679
|
+
)
|
|
9680
|
+
"""Order of results by detection_time. Defaults to DESC (newest
|
|
9681
|
+
first).
|
|
9682
|
+
"""
|
|
9683
|
+
|
|
9661
9684
|
|
|
9662
9685
|
class FreshnessAutomatedAlertConditionInput(sgqlc.types.Input):
|
|
9663
9686
|
__schema__ = schema
|
|
@@ -31203,6 +31226,39 @@ class ListTagsOutput(sgqlc.types.Type):
|
|
|
31203
31226
|
"""Tags list."""
|
|
31204
31227
|
|
|
31205
31228
|
|
|
31229
|
+
class LogTypeParseResult(sgqlc.types.Type):
|
|
31230
|
+
__schema__ = schema
|
|
31231
|
+
__field_names__ = ("log_type", "sources", "destination", "errors", "success")
|
|
31232
|
+
log_type = sgqlc.types.Field(sgqlc.types.non_null(String), graphql_name="logType")
|
|
31233
|
+
"""The candidate log_type this result corresponds to, echoed from the
|
|
31234
|
+
input (e.g. 'snowflake', 'bigquery', 'generic').
|
|
31235
|
+
"""
|
|
31236
|
+
|
|
31237
|
+
sources = sgqlc.types.Field(
|
|
31238
|
+
sgqlc.types.list_of(sgqlc.types.non_null("SqlParsedTable")), graphql_name="sources"
|
|
31239
|
+
)
|
|
31240
|
+
"""Parsed query sources for this log_type. ``mcon`` is always null
|
|
31241
|
+
here — this API does not perform table resolution. Call
|
|
31242
|
+
``parseQuery`` with a chosen ``resourceId`` once the right dialect
|
|
31243
|
+
has been identified to get MCONs.
|
|
31244
|
+
"""
|
|
31245
|
+
|
|
31246
|
+
destination = sgqlc.types.Field("SqlParsedTable", graphql_name="destination")
|
|
31247
|
+
"""Parsed query destination for this log_type. ``mcon`` is always
|
|
31248
|
+
null here — see the note on ``sources``.
|
|
31249
|
+
"""
|
|
31250
|
+
|
|
31251
|
+
errors = sgqlc.types.Field(
|
|
31252
|
+
sgqlc.types.list_of(sgqlc.types.non_null(String)), graphql_name="errors"
|
|
31253
|
+
)
|
|
31254
|
+
"""SQL parser errors for this log_type"""
|
|
31255
|
+
|
|
31256
|
+
success = sgqlc.types.Field(sgqlc.types.non_null(Boolean), graphql_name="success")
|
|
31257
|
+
"""True when the parser returned no errors and at least one source or
|
|
31258
|
+
a destination was parsed for this log_type.
|
|
31259
|
+
"""
|
|
31260
|
+
|
|
31261
|
+
|
|
31206
31262
|
class LoginDetails(sgqlc.types.Type):
|
|
31207
31263
|
"""Login information"""
|
|
31208
31264
|
|
|
@@ -56328,6 +56384,7 @@ class Query(sgqlc.types.Type):
|
|
|
56328
56384
|
"get_domains_for_mcons",
|
|
56329
56385
|
"get_data_product_dry_run_counts",
|
|
56330
56386
|
"parse_query",
|
|
56387
|
+
"parse_query_for_log_types",
|
|
56331
56388
|
"ping_data_collector",
|
|
56332
56389
|
"get_notebook",
|
|
56333
56390
|
"get_notebooks",
|
|
@@ -60420,6 +60477,53 @@ class Query(sgqlc.types.Type):
|
|
|
60420
60477
|
* `schema` (`String`): Name of schema to use for table resolution
|
|
60421
60478
|
"""
|
|
60422
60479
|
|
|
60480
|
+
parse_query_for_log_types = sgqlc.types.Field(
|
|
60481
|
+
sgqlc.types.non_null(sgqlc.types.list_of(sgqlc.types.non_null(LogTypeParseResult))),
|
|
60482
|
+
graphql_name="parseQueryForLogTypes",
|
|
60483
|
+
args=sgqlc.types.ArgDict(
|
|
60484
|
+
(
|
|
60485
|
+
(
|
|
60486
|
+
"query",
|
|
60487
|
+
sgqlc.types.Arg(
|
|
60488
|
+
sgqlc.types.non_null(String), graphql_name="query", default=None
|
|
60489
|
+
),
|
|
60490
|
+
),
|
|
60491
|
+
(
|
|
60492
|
+
"log_types",
|
|
60493
|
+
sgqlc.types.Arg(
|
|
60494
|
+
sgqlc.types.non_null(sgqlc.types.list_of(sgqlc.types.non_null(String))),
|
|
60495
|
+
graphql_name="logTypes",
|
|
60496
|
+
default=None,
|
|
60497
|
+
),
|
|
60498
|
+
),
|
|
60499
|
+
)
|
|
60500
|
+
),
|
|
60501
|
+
)
|
|
60502
|
+
"""(experimental) For each candidate log_type, returns the sources
|
|
60503
|
+
and destination Monte Carlo's SQL parser would extract from the
|
|
60504
|
+
query. Useful for push-ingestion customers comparing extraction
|
|
60505
|
+
across log_types before committing to one for POST
|
|
60506
|
+
/ingest/v1/querylogs — pick the one whose lineage matches your
|
|
60507
|
+
real data flow. The alias 'generic' maps to the transactional-db
|
|
60508
|
+
dialect for warehouses that do not have a dedicated parser. Parser
|
|
60509
|
+
behavior mirrors production push ingestion: Rust SQL parser first,
|
|
60510
|
+
Java Presto parser fallback on Rust error or timeout. So the
|
|
60511
|
+
lineage shown here is a faithful preview of what downstream
|
|
60512
|
+
OpenSearch will index for the same payload — not a dialect-
|
|
60513
|
+
strictness check. If every log_type returns the same lineage for a
|
|
60514
|
+
query, that's genuine 'any of these will work' news; if they
|
|
60515
|
+
diverge, you pick the one whose extraction matches your intent.
|
|
60516
|
+
Scope note: this is a pre-decision discovery tool. It does not
|
|
60517
|
+
perform MCON resolution — use ``parseQuery`` with a chosen
|
|
60518
|
+
``resourceId`` for that, once a log_type has been picked.
|
|
60519
|
+
|
|
60520
|
+
Arguments:
|
|
60521
|
+
|
|
60522
|
+
* `query` (`String!`): SQL query to parse
|
|
60523
|
+
* `log_types` (`[String!]!`): Candidate log_types (push
|
|
60524
|
+
resource_type values) to try, 1..15 entries.
|
|
60525
|
+
"""
|
|
60526
|
+
|
|
60423
60527
|
ping_data_collector = sgqlc.types.Field(
|
|
60424
60528
|
DcPingResponse,
|
|
60425
60529
|
graphql_name="pingDataCollector",
|
|
@@ -3486,6 +3486,17 @@ class FindingSeverity(sgqlc.types.Enum):
|
|
|
3486
3486
|
__choices__ = ("CRITICAL", "INFO", "WARNING")
|
|
3487
3487
|
|
|
3488
3488
|
|
|
3489
|
+
class FindingSortDirection(sgqlc.types.Enum):
|
|
3490
|
+
"""Enumeration Choices:
|
|
3491
|
+
|
|
3492
|
+
* `ASC`None
|
|
3493
|
+
* `DESC`None
|
|
3494
|
+
"""
|
|
3495
|
+
|
|
3496
|
+
__schema__ = schema
|
|
3497
|
+
__choices__ = ("ASC", "DESC")
|
|
3498
|
+
|
|
3499
|
+
|
|
3489
3500
|
class FindingStatus(sgqlc.types.Enum):
|
|
3490
3501
|
"""Enumeration Choices:
|
|
3491
3502
|
|
|
@@ -9618,10 +9629,12 @@ class FindingFilterInput(sgqlc.types.Input):
|
|
|
9618
9629
|
"agentic_scope_uuids",
|
|
9619
9630
|
"use_cases",
|
|
9620
9631
|
"asset_mcon",
|
|
9632
|
+
"parent_finding_uuid",
|
|
9621
9633
|
"search_query",
|
|
9622
9634
|
"needs_attention",
|
|
9623
9635
|
"detection_time_start",
|
|
9624
9636
|
"detection_time_end",
|
|
9637
|
+
"detection_time_order",
|
|
9625
9638
|
)
|
|
9626
9639
|
finding_types = sgqlc.types.Field(
|
|
9627
9640
|
sgqlc.types.list_of(sgqlc.types.non_null(FindingType)), graphql_name="findingTypes"
|
|
@@ -9649,6 +9662,9 @@ class FindingFilterInput(sgqlc.types.Input):
|
|
|
9649
9662
|
|
|
9650
9663
|
asset_mcon = sgqlc.types.Field(String, graphql_name="assetMcon")
|
|
9651
9664
|
|
|
9665
|
+
parent_finding_uuid = sgqlc.types.Field(UUID, graphql_name="parentFindingUuid")
|
|
9666
|
+
"""Return only findings whose parent finding has this UUID."""
|
|
9667
|
+
|
|
9652
9668
|
search_query = sgqlc.types.Field(String, graphql_name="searchQuery")
|
|
9653
9669
|
|
|
9654
9670
|
needs_attention = sgqlc.types.Field(Boolean, graphql_name="needsAttention")
|
|
@@ -9657,6 +9673,13 @@ class FindingFilterInput(sgqlc.types.Input):
|
|
|
9657
9673
|
|
|
9658
9674
|
detection_time_end = sgqlc.types.Field(DateTime, graphql_name="detectionTimeEnd")
|
|
9659
9675
|
|
|
9676
|
+
detection_time_order = sgqlc.types.Field(
|
|
9677
|
+
FindingSortDirection, graphql_name="detectionTimeOrder"
|
|
9678
|
+
)
|
|
9679
|
+
"""Order of results by detection_time. Defaults to DESC (newest
|
|
9680
|
+
first).
|
|
9681
|
+
"""
|
|
9682
|
+
|
|
9660
9683
|
|
|
9661
9684
|
class FreshnessAutomatedAlertConditionInput(sgqlc.types.Input):
|
|
9662
9685
|
__schema__ = schema
|
|
@@ -31202,6 +31225,39 @@ class ListTagsOutput(sgqlc.types.Type):
|
|
|
31202
31225
|
"""Tags list."""
|
|
31203
31226
|
|
|
31204
31227
|
|
|
31228
|
+
class LogTypeParseResult(sgqlc.types.Type):
|
|
31229
|
+
__schema__ = schema
|
|
31230
|
+
__field_names__ = ("log_type", "sources", "destination", "errors", "success")
|
|
31231
|
+
log_type = sgqlc.types.Field(sgqlc.types.non_null(String), graphql_name="logType")
|
|
31232
|
+
"""The candidate log_type this result corresponds to, echoed from the
|
|
31233
|
+
input (e.g. 'snowflake', 'bigquery', 'generic').
|
|
31234
|
+
"""
|
|
31235
|
+
|
|
31236
|
+
sources = sgqlc.types.Field(
|
|
31237
|
+
sgqlc.types.list_of(sgqlc.types.non_null("SqlParsedTable")), graphql_name="sources"
|
|
31238
|
+
)
|
|
31239
|
+
"""Parsed query sources for this log_type. ``mcon`` is always null
|
|
31240
|
+
here — this API does not perform table resolution. Call
|
|
31241
|
+
``parseQuery`` with a chosen ``resourceId`` once the right dialect
|
|
31242
|
+
has been identified to get MCONs.
|
|
31243
|
+
"""
|
|
31244
|
+
|
|
31245
|
+
destination = sgqlc.types.Field("SqlParsedTable", graphql_name="destination")
|
|
31246
|
+
"""Parsed query destination for this log_type. ``mcon`` is always
|
|
31247
|
+
null here — see the note on ``sources``.
|
|
31248
|
+
"""
|
|
31249
|
+
|
|
31250
|
+
errors = sgqlc.types.Field(
|
|
31251
|
+
sgqlc.types.list_of(sgqlc.types.non_null(String)), graphql_name="errors"
|
|
31252
|
+
)
|
|
31253
|
+
"""SQL parser errors for this log_type"""
|
|
31254
|
+
|
|
31255
|
+
success = sgqlc.types.Field(sgqlc.types.non_null(Boolean), graphql_name="success")
|
|
31256
|
+
"""True when the parser returned no errors and at least one source or
|
|
31257
|
+
a destination was parsed for this log_type.
|
|
31258
|
+
"""
|
|
31259
|
+
|
|
31260
|
+
|
|
31205
31261
|
class LoginDetails(sgqlc.types.Type):
|
|
31206
31262
|
"""Login information"""
|
|
31207
31263
|
|
|
@@ -56327,6 +56383,7 @@ class Query(sgqlc.types.Type):
|
|
|
56327
56383
|
"get_domains_for_mcons",
|
|
56328
56384
|
"get_data_product_dry_run_counts",
|
|
56329
56385
|
"parse_query",
|
|
56386
|
+
"parse_query_for_log_types",
|
|
56330
56387
|
"ping_data_collector",
|
|
56331
56388
|
"get_notebook",
|
|
56332
56389
|
"get_notebooks",
|
|
@@ -60419,6 +60476,53 @@ class Query(sgqlc.types.Type):
|
|
|
60419
60476
|
* `schema` (`String`): Name of schema to use for table resolution
|
|
60420
60477
|
"""
|
|
60421
60478
|
|
|
60479
|
+
parse_query_for_log_types = sgqlc.types.Field(
|
|
60480
|
+
sgqlc.types.non_null(sgqlc.types.list_of(sgqlc.types.non_null(LogTypeParseResult))),
|
|
60481
|
+
graphql_name="parseQueryForLogTypes",
|
|
60482
|
+
args=sgqlc.types.ArgDict(
|
|
60483
|
+
(
|
|
60484
|
+
(
|
|
60485
|
+
"query",
|
|
60486
|
+
sgqlc.types.Arg(
|
|
60487
|
+
sgqlc.types.non_null(String), graphql_name="query", default=None
|
|
60488
|
+
),
|
|
60489
|
+
),
|
|
60490
|
+
(
|
|
60491
|
+
"log_types",
|
|
60492
|
+
sgqlc.types.Arg(
|
|
60493
|
+
sgqlc.types.non_null(sgqlc.types.list_of(sgqlc.types.non_null(String))),
|
|
60494
|
+
graphql_name="logTypes",
|
|
60495
|
+
default=None,
|
|
60496
|
+
),
|
|
60497
|
+
),
|
|
60498
|
+
)
|
|
60499
|
+
),
|
|
60500
|
+
)
|
|
60501
|
+
"""(experimental) For each candidate log_type, returns the sources
|
|
60502
|
+
and destination Monte Carlo's SQL parser would extract from the
|
|
60503
|
+
query. Useful for push-ingestion customers comparing extraction
|
|
60504
|
+
across log_types before committing to one for POST
|
|
60505
|
+
/ingest/v1/querylogs — pick the one whose lineage matches your
|
|
60506
|
+
real data flow. The alias 'generic' maps to the transactional-db
|
|
60507
|
+
dialect for warehouses that do not have a dedicated parser. Parser
|
|
60508
|
+
behavior mirrors production push ingestion: Rust SQL parser first,
|
|
60509
|
+
Java Presto parser fallback on Rust error or timeout. So the
|
|
60510
|
+
lineage shown here is a faithful preview of what downstream
|
|
60511
|
+
OpenSearch will index for the same payload — not a dialect-
|
|
60512
|
+
strictness check. If every log_type returns the same lineage for a
|
|
60513
|
+
query, that's genuine 'any of these will work' news; if they
|
|
60514
|
+
diverge, you pick the one whose extraction matches your intent.
|
|
60515
|
+
Scope note: this is a pre-decision discovery tool. It does not
|
|
60516
|
+
perform MCON resolution — use ``parseQuery`` with a chosen
|
|
60517
|
+
``resourceId`` for that, once a log_type has been picked.
|
|
60518
|
+
|
|
60519
|
+
Arguments:
|
|
60520
|
+
|
|
60521
|
+
* `query` (`String!`): SQL query to parse
|
|
60522
|
+
* `log_types` (`[String!]!`): Candidate log_types (push
|
|
60523
|
+
resource_type values) to try, 1..15 entries.
|
|
60524
|
+
"""
|
|
60525
|
+
|
|
60422
60526
|
ping_data_collector = sgqlc.types.Field(
|
|
60423
60527
|
DcPingResponse,
|
|
60424
60528
|
graphql_name="pingDataCollector",
|
|
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
|
{pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/metadata/metadata_allow_block_list.py
RENAMED
|
File without changes
|
{pycarlo-0.12.330 → pycarlo-0.12.332}/pycarlo/features/metadata/metadata_filters_container.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
|
|
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
|
{pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/pii/sample_events/sample_md_events_01.json
RENAMED
|
File without changes
|
{pycarlo-0.12.330 → pycarlo-0.12.332}/tests/features/pii/sample_events/sample_md_events_02.json
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
|