zenml-nightly 0.82.1.dev20250527__py3-none-any.whl → 0.83.0.dev20250529__py3-none-any.whl
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.
- zenml/VERSION +1 -1
- zenml/cli/base.py +6 -1
- zenml/cli/model.py +16 -36
- zenml/cli/server.py +8 -3
- zenml/client.py +20 -4
- zenml/client_lazy_loader.py +2 -0
- zenml/config/docker_settings.py +15 -2
- zenml/enums.py +3 -0
- zenml/event_hub/event_hub.py +1 -1
- zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +1 -1
- zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +1 -1
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +3 -0
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +37 -26
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +45 -4
- zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +92 -84
- zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +207 -179
- zenml/integrations/skypilot/utils.py +273 -0
- zenml/integrations/skypilot_aws/__init__.py +1 -2
- zenml/integrations/skypilot_azure/__init__.py +1 -2
- zenml/integrations/skypilot_gcp/__init__.py +9 -1
- zenml/integrations/skypilot_kubernetes/__init__.py +2 -3
- zenml/integrations/skypilot_lambda/__init__.py +1 -2
- zenml/login/web_login.py +1 -1
- zenml/model/model.py +13 -23
- zenml/models/__init__.py +39 -2
- zenml/models/v2/base/scoped.py +34 -15
- zenml/models/v2/core/artifact.py +10 -9
- zenml/models/v2/core/artifact_version.py +16 -16
- zenml/models/v2/core/logs.py +8 -50
- zenml/models/v2/core/model.py +10 -10
- zenml/models/v2/core/model_version.py +155 -88
- zenml/models/v2/core/pipeline.py +10 -11
- zenml/models/v2/core/pipeline_deployment.py +1 -9
- zenml/models/v2/core/pipeline_run.py +10 -17
- zenml/models/v2/core/run_template.py +10 -10
- zenml/models/v2/core/step_run.py +100 -16
- zenml/models/v2/core/tag.py +5 -4
- zenml/models/v2/misc/pipeline_run_dag.py +46 -0
- zenml/orchestrators/base_orchestrator.py +8 -19
- zenml/orchestrators/cache_utils.py +48 -1
- zenml/orchestrators/input_utils.py +35 -39
- zenml/orchestrators/step_launcher.py +1 -1
- zenml/orchestrators/step_run_utils.py +26 -10
- zenml/pipelines/pipeline_definition.py +3 -3
- zenml/pipelines/run_utils.py +2 -3
- zenml/service_connectors/service_connector.py +5 -1
- zenml/stack/stack_component.py +1 -4
- zenml/steps/step_context.py +1 -1
- zenml/utils/dashboard_utils.py +3 -3
- zenml/zen_server/auth.py +6 -3
- zenml/zen_server/dashboard/assets/{404-_AtuLtaX.js → 404-DmJUgorp.js} +1 -1
- zenml/zen_server/dashboard/assets/{@radix-C7hRs6Kx.js → @radix-Cdvw4jJ8.js} +1 -1
- zenml/zen_server/dashboard/assets/{@react-router-CNP6g_RL.js → @react-router-DeDfXbUF.js} +5 -5
- zenml/zen_server/dashboard/assets/{@reactflow-CQi1Z1Wq.js → @reactflow-8OCk19Fi.js} +1 -1
- zenml/zen_server/dashboard/assets/{@tanstack-CSxjHCME.js → @tanstack-5gTMR7G2.js} +4 -4
- zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-CZW4QyWn.js +1 -0
- zenml/zen_server/dashboard/assets/ButtonGroup-DFWWFGUE.js +1 -0
- zenml/zen_server/dashboard/assets/{CodeSnippet-CvI6D0wx.js → CodeSnippet-D2HkkAGr.js} +1 -1
- zenml/zen_server/dashboard/assets/CollapsibleCard-CnS09ljw.js +1 -0
- zenml/zen_server/dashboard/assets/{ComponentBadge-DKw7Gndh.js → ComponentBadge-CDgdd0Ks.js} +1 -1
- zenml/zen_server/dashboard/assets/ComponentIcon-CbbOc7lb.js +1 -0
- zenml/zen_server/dashboard/assets/{DeleteAlertDialog-DVvXt-S6.js → DeleteAlertDialog-VIOMDLmx.js} +1 -1
- zenml/zen_server/dashboard/assets/DialogItem-ClFCqxEp.js +1 -0
- zenml/zen_server/dashboard/assets/{DisplayDate-CYVBBSgr.js → DisplayDate-8RESqe5H.js} +1 -1
- zenml/zen_server/dashboard/assets/{EmptyState-M1jafpg6.js → EmptyState-CjrgDtVk.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-BWaXP0VK.js → Error-CQzjbDcN.js} +1 -1
- zenml/zen_server/dashboard/assets/ExecutionStatus-CWreILP0.js +1 -0
- zenml/zen_server/dashboard/assets/{Helpbox-iE1xLmiZ.js → Helpbox-CiKxG5_X.js} +1 -1
- zenml/zen_server/dashboard/assets/Infobox-CGxFvqzi.js +1 -0
- zenml/zen_server/dashboard/assets/LeftSideMenu-DCsKdIjC.js +1 -0
- zenml/zen_server/dashboard/assets/{Lock-DW-0_M0o.js → Lock-CrIAdQo6.js} +1 -1
- zenml/zen_server/dashboard/assets/NestedCollapsible-3M4llYtH.js +1 -0
- zenml/zen_server/dashboard/assets/NumberBox-C0mQktmV.js +1 -0
- zenml/zen_server/dashboard/assets/Partials-DSjkttlz.js +1 -0
- zenml/zen_server/dashboard/assets/{PasswordChecker-lYTOtNom.js → PasswordChecker-B88WjuCe.js} +1 -1
- zenml/zen_server/dashboard/assets/ProCta-Dm5cWKpS.js +1 -0
- zenml/zen_server/dashboard/assets/{ProviderIcon-DLo7t1lo.js → ProviderIcon-DPwMR6nF.js} +1 -1
- zenml/zen_server/dashboard/assets/ProviderRadio-DEDNRgAb.js +1 -0
- zenml/zen_server/dashboard/assets/RunsBody-BRBn1e2O.js +1 -0
- zenml/zen_server/dashboard/assets/SearchField-DY6-UbRT.js +1 -0
- zenml/zen_server/dashboard/assets/SecretTooltip-CZTRnaCV.js +1 -0
- zenml/zen_server/dashboard/assets/{SetPassword-DR-EiLI5.js → SetPassword-BjNGDC5e.js} +1 -1
- zenml/zen_server/dashboard/assets/SheetHeader-CASpN2Lz.js +1 -0
- zenml/zen_server/dashboard/assets/StackComponentList-Be1pQt9m.js +1 -0
- zenml/zen_server/dashboard/assets/StackList-BdiR5DvR.js +1 -0
- zenml/zen_server/dashboard/assets/StackName-ojLC6xdl.js +1 -0
- zenml/zen_server/dashboard/assets/Tabs-DNSKblCM.js +1 -0
- zenml/zen_server/dashboard/assets/Tick-BPrWnNlN.js +1 -0
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DbFEaezI.js → UpdatePasswordSchemas-CNfKDo2Q.js} +1 -1
- zenml/zen_server/dashboard/assets/UsageReason-Cb-mpV8M.js +1 -0
- zenml/zen_server/dashboard/assets/{Wizard-CMI6Ksgz.js → Wizard-Dg8Pmn5A.js} +1 -1
- zenml/zen_server/dashboard/assets/WizardFooter-BcNDIvlQ.js +1 -0
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-BGASHYtF.js → all-pipeline-runs-query-DCdax7I5.js} +1 -1
- zenml/zen_server/dashboard/assets/{arrow-left-CwgF2MEM.js → arrow-left-MRXv5pAH.js} +1 -1
- zenml/zen_server/dashboard/assets/bulk-delete-C_kpIB9A.js +3 -0
- zenml/zen_server/dashboard/assets/{check-DK77doTf.js → check-B9QMTa3f.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-circle-mvyzYvIW.js → check-circle-C4tYvbtw.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-down-A-rmltmI.js → chevron-down-jbbQh82s.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-uNWbJT-C.js → chevron-right-double-Dgp_gEsp.js} +1 -1
- zenml/zen_server/dashboard/assets/{clock-CPA5cYxq.js → clock-B_mTG8PH.js} +1 -1
- zenml/zen_server/dashboard/assets/{code-browser-j2EpcxIA.js → code-browser-CiD8qkBx.js} +1 -1
- zenml/zen_server/dashboard/assets/configuration-form-B2hmKGnF.js +1 -0
- zenml/zen_server/dashboard/assets/connectivity-4UKGMYnr.webp +0 -0
- zenml/zen_server/dashboard/assets/constants-1EZZxtay.js +1 -0
- zenml/zen_server/dashboard/assets/create-stack-TKmMtrkQ.js +1 -0
- zenml/zen_server/dashboard/assets/dates-Buh6SMo7.js +1 -0
- zenml/zen_server/dashboard/assets/delete-run-CCR9md_s.js +1 -0
- zenml/zen_server/dashboard/assets/eye-CbVlAYty.js +1 -0
- zenml/zen_server/dashboard/assets/{file-text-BdxZdjP_.js → file-text-Cd8wVfq5.js} +1 -1
- zenml/zen_server/dashboard/assets/form-DFJkaFDX.js +1 -0
- zenml/zen_server/dashboard/assets/form-schemas-CrznJVzA.js +1 -0
- zenml/zen_server/dashboard/assets/{gcp-CHNvgEss.js → gcp-B1I3Qvcx.js} +1 -1
- zenml/zen_server/dashboard/assets/{help-DyMolRxD.js → help-Co6aedki.js} +1 -1
- zenml/zen_server/dashboard/assets/index-BFqbGSck.js +308 -0
- zenml/zen_server/dashboard/assets/{index-CrhdX_qG.js → index-BjUu1mP4.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-DR30v9MZ.js → index-DWpiv-Ft.js} +1 -1
- zenml/zen_server/dashboard/assets/index-DuhuqTCI.css +1 -0
- zenml/zen_server/dashboard/assets/index-U992soPJ.js +1 -0
- zenml/zen_server/dashboard/assets/index.es-C1gfATPn.js +14 -0
- zenml/zen_server/dashboard/assets/{index.esm-D7jFlf5N.js → index.esm-DhJo3mA6.js} +1 -1
- zenml/zen_server/dashboard/assets/info-QkbQz4QU.js +1 -0
- zenml/zen_server/dashboard/assets/{key-icon-DO4DPJHZ.js → key-icon-C07HKw8z.js} +1 -1
- zenml/zen_server/dashboard/assets/{layout-h3cbx8WZ.js → layout-DBbfEFBe.js} +1 -1
- zenml/zen_server/dashboard/assets/layout-Do9YI4QX.js +1 -0
- zenml/zen_server/dashboard/assets/login-mutation-D3tFP6Wm.js +1 -0
- zenml/zen_server/dashboard/assets/{logs-B5n0U7tB.js → logs-CQKlJjo0.js} +1 -1
- zenml/zen_server/dashboard/assets/{package-D1Mhqeh8.js → package-miExReQl.js} +1 -1
- zenml/zen_server/dashboard/assets/page-9RjCitFH.js +1 -0
- zenml/zen_server/dashboard/assets/page-B0PsXWiT.js +1 -0
- zenml/zen_server/dashboard/assets/page-BCrKmYIZ.js +1 -0
- zenml/zen_server/dashboard/assets/page-BcRI3-aR.js +29 -0
- zenml/zen_server/dashboard/assets/page-Be3R2uYn.js +1 -0
- zenml/zen_server/dashboard/assets/page-BgknnddT.js +1 -0
- zenml/zen_server/dashboard/assets/page-BrT0_zSJ.js +40 -0
- zenml/zen_server/dashboard/assets/page-Bs3W2FDi.js +1 -0
- zenml/zen_server/dashboard/assets/page-C210HcBA.js +1 -0
- zenml/zen_server/dashboard/assets/page-C6KaiZ_W.js +1 -0
- zenml/zen_server/dashboard/assets/page-CAJ8B0vb.js +1 -0
- zenml/zen_server/dashboard/assets/page-CAUYrfui.js +1 -0
- zenml/zen_server/dashboard/assets/page-CHxVhF3x.js +1 -0
- zenml/zen_server/dashboard/assets/{page-CSwZxZMQ.js → page-CN7lkvXr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CUaMMoPG.js +1 -0
- zenml/zen_server/dashboard/assets/page-Cal6XQ4U.js +1 -0
- zenml/zen_server/dashboard/assets/page-CdZCmszX.js +1 -0
- zenml/zen_server/dashboard/assets/page-ChGcZI_6.js +1 -0
- zenml/zen_server/dashboard/assets/page-CktmtZ8Z.js +1 -0
- zenml/zen_server/dashboard/assets/page-ClvmVesa.js +1 -0
- zenml/zen_server/dashboard/assets/page-CnbIYE80.js +1 -0
- zenml/zen_server/dashboard/assets/page-CoXzjeEY.js +1 -0
- zenml/zen_server/dashboard/assets/page-CtiuMP_r.js +1 -0
- zenml/zen_server/dashboard/assets/page-D9Hfx6GV.js +1 -0
- zenml/zen_server/dashboard/assets/page-D9iuB88h.js +1 -0
- zenml/zen_server/dashboard/assets/page-DCcuPZ8P.js +1 -0
- zenml/zen_server/dashboard/assets/page-DEohTSz6.js +1 -0
- zenml/zen_server/dashboard/assets/page-DJIGaUQ9.js +1 -0
- zenml/zen_server/dashboard/assets/page-DKK6ulgy.js +1 -0
- zenml/zen_server/dashboard/assets/page-DNjKHjnH.js +1 -0
- zenml/zen_server/dashboard/assets/page-DUK0Nd_1.js +1 -0
- zenml/zen_server/dashboard/assets/page-DUKbOhaD.js +1 -0
- zenml/zen_server/dashboard/assets/page-DYOucPtA.js +1 -0
- zenml/zen_server/dashboard/assets/page-DpqRelAy.js +1 -0
- zenml/zen_server/dashboard/assets/{page-ZfTtFicG.js → page-DwVPpCFg.js} +2 -2
- zenml/zen_server/dashboard/assets/page-XURWnYZP.js +1 -0
- zenml/zen_server/dashboard/assets/page-abw-2oeW.js +1 -0
- zenml/zen_server/dashboard/assets/page-akLcPcKw.js +1 -0
- zenml/zen_server/dashboard/assets/page-n9ejQ2V3.js +2 -0
- zenml/zen_server/dashboard/assets/page-sJjNT9xA.js +6 -0
- zenml/zen_server/dashboard/assets/{persist-UUym702q.js → persist-DWMWVP-y.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-D87V82eO.js → persist-Dec_w7aB.js} +1 -1
- zenml/zen_server/dashboard/assets/pipeline-CSUlkd50.js +1 -0
- zenml/zen_server/dashboard/assets/{plus-COjQg3AG.js → plus-Cl0_rCVF.js} +1 -1
- zenml/zen_server/dashboard/assets/{react-error-boundary.esm-fyoUBS25.js → react-error-boundary.esm-7_MuhCay.js} +1 -1
- zenml/zen_server/dashboard/assets/{refresh-CM5T3QeU.js → refresh-BcTM09NW.js} +1 -1
- zenml/zen_server/dashboard/assets/resource-tyes-list-o2LXiMay.js +1 -0
- zenml/zen_server/dashboard/assets/resource-type-tooltip-DwHrJstL.js +1 -0
- zenml/zen_server/dashboard/assets/service-connectors-DSEMwJ5A.js +1 -0
- zenml/zen_server/dashboard/assets/{service-BQ9KIhls.js → service-jxtvgks0.js} +2 -2
- zenml/zen_server/dashboard/assets/sharedSchema-BXzg0EZz.js +1 -0
- zenml/zen_server/dashboard/assets/stack-detail-query-Cm0fsgo-.js +1 -0
- zenml/zen_server/dashboard/assets/{terminal-square-DMtel8mb.js → terminal-XFL_4QN-.js} +1 -1
- zenml/zen_server/dashboard/assets/terminal-square-XFL_4QN-.js +1 -0
- zenml/zen_server/dashboard/assets/transform-CeZdrxDZ.js +1 -0
- zenml/zen_server/dashboard/assets/{trash-BWSZ7NRK.js → trash-DP6Tpp_E.js} +1 -1
- zenml/zen_server/dashboard/assets/type-guards-CNgPYg8l.js +1 -0
- zenml/zen_server/dashboard/assets/update-current-user-mutation-D5MjcQ6F.js +1 -0
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-CmnxdxiK.js +1 -0
- zenml/zen_server/dashboard/assets/{zod-C0xYeTvL.js → zod-XdS2h1ws.js} +1 -1
- zenml/zen_server/dashboard/index.html +7 -7
- zenml/zen_server/rbac/utils.py +2 -2
- zenml/zen_server/routers/auth_endpoints.py +2 -2
- zenml/zen_server/routers/devices_endpoints.py +8 -5
- zenml/zen_server/routers/pipeline_deployments_endpoints.py +1 -1
- zenml/zen_server/routers/pipelines_endpoints.py +1 -1
- zenml/zen_server/routers/run_templates_endpoints.py +3 -3
- zenml/zen_server/routers/runs_endpoints.py +35 -0
- zenml/zen_server/template_execution/utils.py +6 -6
- zenml/zen_stores/dag_generator.py +171 -0
- zenml/zen_stores/migrations/versions/0.83.0_release.py +23 -0
- zenml/zen_stores/rest_zen_store.py +17 -3
- zenml/zen_stores/schemas/action_schemas.py +40 -4
- zenml/zen_stores/schemas/api_key_schemas.py +29 -1
- zenml/zen_stores/schemas/artifact_schemas.py +168 -48
- zenml/zen_stores/schemas/base_schemas.py +26 -1
- zenml/zen_stores/schemas/code_repository_schemas.py +46 -5
- zenml/zen_stores/schemas/component_schemas.py +44 -3
- zenml/zen_stores/schemas/device_schemas.py +43 -2
- zenml/zen_stores/schemas/event_source_schemas.py +41 -5
- zenml/zen_stores/schemas/flavor_schemas.py +42 -2
- zenml/zen_stores/schemas/model_schemas.py +113 -77
- zenml/zen_stores/schemas/pipeline_build_schemas.py +53 -4
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +53 -4
- zenml/zen_stores/schemas/pipeline_run_schemas.py +111 -47
- zenml/zen_stores/schemas/pipeline_schemas.py +41 -9
- zenml/zen_stores/schemas/run_template_schemas.py +75 -11
- zenml/zen_stores/schemas/schedule_schema.py +50 -5
- zenml/zen_stores/schemas/secret_schemas.py +39 -2
- zenml/zen_stores/schemas/service_connector_schemas.py +39 -2
- zenml/zen_stores/schemas/service_schemas.py +39 -4
- zenml/zen_stores/schemas/stack_schemas.py +47 -2
- zenml/zen_stores/schemas/step_run_schemas.py +89 -26
- zenml/zen_stores/schemas/tag_schemas.py +69 -5
- zenml/zen_stores/schemas/trigger_schemas.py +44 -5
- zenml/zen_stores/schemas/utils.py +25 -4
- zenml/zen_stores/sql_zen_store.py +471 -28
- zenml/zen_stores/zen_store_interface.py +9 -1
- {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/METADATA +2 -2
- {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/RECORD +230 -222
- zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-BG7-Ki1L.js +0 -1
- zenml/zen_server/dashboard/assets/CollapsibleCard-D20FtrzC.js +0 -1
- zenml/zen_server/dashboard/assets/Commands-DGbAvMDk.js +0 -1
- zenml/zen_server/dashboard/assets/ComponentIcon-ils7uNAk.js +0 -1
- zenml/zen_server/dashboard/assets/CsvVizualization-DVN541XF.js +0 -15
- zenml/zen_server/dashboard/assets/DialogItem-BHWf3sIB.js +0 -1
- zenml/zen_server/dashboard/assets/ExecutionStatus-XrvT2r65.js +0 -1
- zenml/zen_server/dashboard/assets/Infobox-D9k5TFH4.js +0 -1
- zenml/zen_server/dashboard/assets/InlineAvatar-Cfz4WSLK.js +0 -1
- zenml/zen_server/dashboard/assets/MarkdownVisualization-URCyUPcZ.js +0 -14
- zenml/zen_server/dashboard/assets/NestedCollapsible-Dor-bi98.js +0 -1
- zenml/zen_server/dashboard/assets/NumberBox-D2A7ENHb.js +0 -1
- zenml/zen_server/dashboard/assets/Partials-DQJFw1yW.js +0 -1
- zenml/zen_server/dashboard/assets/ProBadge-Cp4hb1YT.js +0 -1
- zenml/zen_server/dashboard/assets/ProCta-EYoV9CvK.js +0 -1
- zenml/zen_server/dashboard/assets/ProviderRadio-BVDA-fAr.js +0 -1
- zenml/zen_server/dashboard/assets/RunSelector-BLuBYNJt.js +0 -1
- zenml/zen_server/dashboard/assets/RunsBody-W4WHf-sq.js +0 -1
- zenml/zen_server/dashboard/assets/SearchField-D-h6jXyg.js +0 -1
- zenml/zen_server/dashboard/assets/SecretTooltip-CePCL8kd.js +0 -1
- zenml/zen_server/dashboard/assets/StackList-CgmN5H-i.js +0 -1
- zenml/zen_server/dashboard/assets/Tabs-DxQ8PDOD.js +0 -1
- zenml/zen_server/dashboard/assets/Tick-CEsT3HPR.js +0 -1
- zenml/zen_server/dashboard/assets/UsageReason-DjI5qMje.js +0 -1
- zenml/zen_server/dashboard/assets/WizardFooter-CFBHFZas.js +0 -1
- zenml/zen_server/dashboard/assets/cloud-squares-DeRLMopf.svg +0 -43
- zenml/zen_server/dashboard/assets/configuration-form-BtI2Y4eX.js +0 -1
- zenml/zen_server/dashboard/assets/connectors-video-C9qY4syJ.svg +0 -21
- zenml/zen_server/dashboard/assets/constants-DP3ZEnXH.js +0 -1
- zenml/zen_server/dashboard/assets/create-stack-BJ6x5rzj.js +0 -1
- zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-DlSLEl5T.js +0 -1
- zenml/zen_server/dashboard/assets/docker-BuDBFEDL.js +0 -1
- zenml/zen_server/dashboard/assets/dots-horizontal-BGRJCPCs.js +0 -1
- zenml/zen_server/dashboard/assets/flavor-select-BnPxvQDN.js +0 -1
- zenml/zen_server/dashboard/assets/form-schemas-CbvoEUHr.js +0 -1
- zenml/zen_server/dashboard/assets/index-CFESYpe4.js +0 -1
- zenml/zen_server/dashboard/assets/index-CmLcvK2z.js +0 -1
- zenml/zen_server/dashboard/assets/index-CzX3ZYlI.css +0 -1
- zenml/zen_server/dashboard/assets/index-D2iSHVZq.js +0 -64
- zenml/zen_server/dashboard/assets/kubernetes-D6OUjwSK.js +0 -1
- zenml/zen_server/dashboard/assets/link-external-DUhCSKNm.js +0 -1
- zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +0 -1
- zenml/zen_server/dashboard/assets/login-mutation-CXc-Klim.js +0 -1
- zenml/zen_server/dashboard/assets/not-found-olRU3fnu.js +0 -1
- zenml/zen_server/dashboard/assets/page-7keIM1V3.js +0 -1
- zenml/zen_server/dashboard/assets/page-B31neFwG.js +0 -1
- zenml/zen_server/dashboard/assets/page-B3zo4KYS.js +0 -1
- zenml/zen_server/dashboard/assets/page-BN3MHq1a.js +0 -1
- zenml/zen_server/dashboard/assets/page-BNgVExjN.js +0 -1
- zenml/zen_server/dashboard/assets/page-BPtvu74G.js +0 -1
- zenml/zen_server/dashboard/assets/page-BTIuG0ki.js +0 -2
- zenml/zen_server/dashboard/assets/page-BcQzleH6.js +0 -1
- zenml/zen_server/dashboard/assets/page-C05Jw4M2.js +0 -1
- zenml/zen_server/dashboard/assets/page-C28a7K8h.js +0 -1
- zenml/zen_server/dashboard/assets/page-C9WLk0X-.js +0 -1
- zenml/zen_server/dashboard/assets/page-CINMx64X.js +0 -1
- zenml/zen_server/dashboard/assets/page-CYrJbk7P.js +0 -1
- zenml/zen_server/dashboard/assets/page-Ce0cqLo3.js +0 -1
- zenml/zen_server/dashboard/assets/page-CgNsEkw-.js +0 -1
- zenml/zen_server/dashboard/assets/page-Ct2FUYuR.js +0 -1
- zenml/zen_server/dashboard/assets/page-D8G2B3Bu.js +0 -1
- zenml/zen_server/dashboard/assets/page-DL8a4_lg.js +0 -3
- zenml/zen_server/dashboard/assets/page-DMhYn1cF.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dd_Yq-Uf.js +0 -6
- zenml/zen_server/dashboard/assets/page-DfSvqT8g.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dt6ANUTx.js +0 -1
- zenml/zen_server/dashboard/assets/page-DtvTleaT.js +0 -1
- zenml/zen_server/dashboard/assets/page-DwfGTiVs.js +0 -1
- zenml/zen_server/dashboard/assets/page-JgomSTDc.js +0 -1
- zenml/zen_server/dashboard/assets/page-L84ig6HB.js +0 -1
- zenml/zen_server/dashboard/assets/page-Mabsn4QJ.js +0 -1
- zenml/zen_server/dashboard/assets/page-P04L5cm9.js +0 -1
- zenml/zen_server/dashboard/assets/page-PfhAnvq4.js +0 -1
- zenml/zen_server/dashboard/assets/page-WdRrlNt_.js +0 -1
- zenml/zen_server/dashboard/assets/page-cqJDDDeK.js +0 -1
- zenml/zen_server/dashboard/assets/page-k-Wxh9L_.js +0 -1
- zenml/zen_server/dashboard/assets/page-y-zV4n0c.js +0 -1
- zenml/zen_server/dashboard/assets/rocket-Cf-B-XOR.js +0 -1
- zenml/zen_server/dashboard/assets/settings_preview-0JLrRgHP.webp +0 -0
- zenml/zen_server/dashboard/assets/sharedSchema-Bse2agAf.js +0 -14
- zenml/zen_server/dashboard/assets/stack-detail-query-BAcZJrN3.js +0 -1
- zenml/zen_server/dashboard/assets/tick-circle-m94Aa6Zt.js +0 -1
- zenml/zen_server/dashboard/assets/tour-cover-BYfeen6M.webp +0 -0
- zenml/zen_server/dashboard/assets/type-guards-CaeD8wHO.js +0 -1
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-DwMM1LJz.js +0 -1
- {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/entry_points.txt +0 -0
zenml/models/v2/base/scoped.py
CHANGED
@@ -106,9 +106,7 @@ class ProjectScopedRequest(UserScopedRequest):
|
|
106
106
|
class UserScopedResponseBody(BaseDatedResponseBody):
|
107
107
|
"""Base user-owned body."""
|
108
108
|
|
109
|
-
|
110
|
-
title="The user who created this resource.", default=None
|
111
|
-
)
|
109
|
+
user_id: Optional[UUID] = Field(title="The user id.", default=None)
|
112
110
|
|
113
111
|
|
114
112
|
class UserScopedResponseMetadata(BaseResponseMetadata):
|
@@ -118,6 +116,10 @@ class UserScopedResponseMetadata(BaseResponseMetadata):
|
|
118
116
|
class UserScopedResponseResources(BaseResponseResources):
|
119
117
|
"""Base class for all resource models associated with the user."""
|
120
118
|
|
119
|
+
user: Optional["UserResponse"] = Field(
|
120
|
+
title="The user who created this resource.", default=None
|
121
|
+
)
|
122
|
+
|
121
123
|
|
122
124
|
UserBody = TypeVar("UserBody", bound=UserScopedResponseBody)
|
123
125
|
UserMetadata = TypeVar("UserMetadata", bound=UserScopedResponseMetadata)
|
@@ -141,19 +143,28 @@ class UserScopedResponse(
|
|
141
143
|
The analytics metadata.
|
142
144
|
"""
|
143
145
|
metadata = super().get_analytics_metadata()
|
144
|
-
if self.
|
145
|
-
metadata["user_id"] =
|
146
|
+
if user_id := self.user_id:
|
147
|
+
metadata["user_id"] = user_id
|
146
148
|
return metadata
|
147
149
|
|
148
150
|
# Body and metadata properties
|
151
|
+
@property
|
152
|
+
def user_id(self) -> Optional[UUID]:
|
153
|
+
"""The user ID property.
|
154
|
+
|
155
|
+
Returns:
|
156
|
+
the value of the property.
|
157
|
+
"""
|
158
|
+
return self.get_body().user_id
|
159
|
+
|
149
160
|
@property
|
150
161
|
def user(self) -> Optional["UserResponse"]:
|
151
|
-
"""The
|
162
|
+
"""The user property.
|
152
163
|
|
153
164
|
Returns:
|
154
165
|
the value of the property.
|
155
166
|
"""
|
156
|
-
return self.
|
167
|
+
return self.get_resources().user
|
157
168
|
|
158
169
|
|
159
170
|
class UserScopedFilter(BaseFilter):
|
@@ -289,12 +300,12 @@ class UserScopedFilter(BaseFilter):
|
|
289
300
|
class ProjectScopedResponseBody(UserScopedResponseBody):
|
290
301
|
"""Base project-scoped body."""
|
291
302
|
|
303
|
+
project_id: UUID = Field(title="The project id.")
|
304
|
+
|
292
305
|
|
293
306
|
class ProjectScopedResponseMetadata(UserScopedResponseMetadata):
|
294
307
|
"""Base project-scoped metadata."""
|
295
308
|
|
296
|
-
project: "ProjectResponse" = Field(title="The project of this resource.")
|
297
|
-
|
298
309
|
|
299
310
|
class ProjectScopedResponseResources(UserScopedResponseResources):
|
300
311
|
"""Base project-scoped resources."""
|
@@ -318,8 +329,6 @@ class ProjectScopedResponse(
|
|
318
329
|
Used as a base class for all domain models that are project-scoped.
|
319
330
|
"""
|
320
331
|
|
321
|
-
project_id: UUID = Field(title="The project id.")
|
322
|
-
|
323
332
|
# Analytics
|
324
333
|
def get_analytics_metadata(self) -> Dict[str, Any]:
|
325
334
|
"""Fetches the analytics metadata for project scoped models.
|
@@ -328,11 +337,19 @@ class ProjectScopedResponse(
|
|
328
337
|
The analytics metadata.
|
329
338
|
"""
|
330
339
|
metadata = super().get_analytics_metadata()
|
331
|
-
|
332
|
-
metadata["project_id"] = self.project.id
|
340
|
+
metadata["project_id"] = self.project_id
|
333
341
|
return metadata
|
334
342
|
|
335
|
-
|
343
|
+
@property
|
344
|
+
def project_id(self) -> UUID:
|
345
|
+
"""The project ID property.
|
346
|
+
|
347
|
+
Returns:
|
348
|
+
the value of the property.
|
349
|
+
"""
|
350
|
+
return self.get_body().project_id
|
351
|
+
|
352
|
+
# Helper
|
336
353
|
@property
|
337
354
|
def project(self) -> "ProjectResponse":
|
338
355
|
"""The project property.
|
@@ -340,7 +357,9 @@ class ProjectScopedResponse(
|
|
340
357
|
Returns:
|
341
358
|
the value of the property.
|
342
359
|
"""
|
343
|
-
|
360
|
+
from zenml.client import Client
|
361
|
+
|
362
|
+
return Client().get_project(self.project_id)
|
344
363
|
|
345
364
|
|
346
365
|
# ---------------------- Filter Models ----------------------
|
zenml/models/v2/core/artifact.py
CHANGED
@@ -87,12 +87,6 @@ class ArtifactUpdate(BaseUpdate):
|
|
87
87
|
class ArtifactResponseBody(ProjectScopedResponseBody):
|
88
88
|
"""Response body for artifacts."""
|
89
89
|
|
90
|
-
tags: List[TagResponse] = Field(
|
91
|
-
title="Tags associated with the model",
|
92
|
-
)
|
93
|
-
latest_version_name: Optional[str] = None
|
94
|
-
latest_version_id: Optional[UUID] = None
|
95
|
-
|
96
90
|
|
97
91
|
class ArtifactResponseMetadata(ProjectScopedResponseMetadata):
|
98
92
|
"""Response metadata for artifacts."""
|
@@ -106,6 +100,13 @@ class ArtifactResponseMetadata(ProjectScopedResponseMetadata):
|
|
106
100
|
class ArtifactResponseResources(ProjectScopedResponseResources):
|
107
101
|
"""Class for all resource models associated with the Artifact Entity."""
|
108
102
|
|
103
|
+
tags: List[TagResponse] = Field(
|
104
|
+
title="Tags associated with the artifact.",
|
105
|
+
)
|
106
|
+
# TODO: maybe move these back to body or figure out a better solution
|
107
|
+
latest_version_name: Optional[str] = None
|
108
|
+
latest_version_id: Optional[UUID] = None
|
109
|
+
|
109
110
|
|
110
111
|
class ArtifactResponse(
|
111
112
|
ProjectScopedResponse[
|
@@ -139,7 +140,7 @@ class ArtifactResponse(
|
|
139
140
|
Returns:
|
140
141
|
the value of the property.
|
141
142
|
"""
|
142
|
-
return self.
|
143
|
+
return self.get_resources().tags
|
143
144
|
|
144
145
|
@property
|
145
146
|
def latest_version_name(self) -> Optional[str]:
|
@@ -148,7 +149,7 @@ class ArtifactResponse(
|
|
148
149
|
Returns:
|
149
150
|
the value of the property.
|
150
151
|
"""
|
151
|
-
return self.
|
152
|
+
return self.get_resources().latest_version_name
|
152
153
|
|
153
154
|
@property
|
154
155
|
def latest_version_id(self) -> Optional[UUID]:
|
@@ -157,7 +158,7 @@ class ArtifactResponse(
|
|
157
158
|
Returns:
|
158
159
|
the value of the property.
|
159
160
|
"""
|
160
|
-
return self.
|
161
|
+
return self.get_resources().latest_version_id
|
161
162
|
|
162
163
|
@property
|
163
164
|
def has_custom_name(self) -> bool:
|
@@ -194,13 +194,6 @@ class ArtifactVersionResponseBody(ProjectScopedResponseBody):
|
|
194
194
|
data_type: SourceWithValidator = Field(
|
195
195
|
title="Data type of the artifact.",
|
196
196
|
)
|
197
|
-
tags: List[TagResponse] = Field(
|
198
|
-
title="Tags associated with the model",
|
199
|
-
)
|
200
|
-
producer_pipeline_run_id: Optional[UUID] = Field(
|
201
|
-
title="The ID of the pipeline run that generated this artifact version.",
|
202
|
-
default=None,
|
203
|
-
)
|
204
197
|
save_type: ArtifactSaveType = Field(
|
205
198
|
title="The save type of the artifact version.",
|
206
199
|
)
|
@@ -234,10 +227,6 @@ class ArtifactVersionResponseBody(ProjectScopedResponseBody):
|
|
234
227
|
class ArtifactVersionResponseMetadata(ProjectScopedResponseMetadata):
|
235
228
|
"""Response metadata for artifact versions."""
|
236
229
|
|
237
|
-
producer_step_run_id: Optional[UUID] = Field(
|
238
|
-
title="ID of the step run that produced this artifact.",
|
239
|
-
default=None,
|
240
|
-
)
|
241
230
|
visualizations: Optional[List["ArtifactVisualizationResponse"]] = Field(
|
242
231
|
default=None, title="Visualizations of the artifact."
|
243
232
|
)
|
@@ -249,6 +238,18 @@ class ArtifactVersionResponseMetadata(ProjectScopedResponseMetadata):
|
|
249
238
|
class ArtifactVersionResponseResources(ProjectScopedResponseResources):
|
250
239
|
"""Class for all resource models associated with the artifact version entity."""
|
251
240
|
|
241
|
+
tags: List[TagResponse] = Field(
|
242
|
+
title="Tags associated with the artifact version.",
|
243
|
+
)
|
244
|
+
producer_step_run_id: Optional[UUID] = Field(
|
245
|
+
title="ID of the step run that produced this artifact.",
|
246
|
+
default=None,
|
247
|
+
)
|
248
|
+
producer_pipeline_run_id: Optional[UUID] = Field(
|
249
|
+
title="The ID of the pipeline run that generated this artifact version.",
|
250
|
+
default=None,
|
251
|
+
)
|
252
|
+
|
252
253
|
|
253
254
|
class ArtifactVersionResponse(
|
254
255
|
ProjectScopedResponse[
|
@@ -280,7 +281,7 @@ class ArtifactVersionResponse(
|
|
280
281
|
return self.get_body().artifact
|
281
282
|
|
282
283
|
@property
|
283
|
-
def version(self) ->
|
284
|
+
def version(self) -> str:
|
284
285
|
"""The `version` property.
|
285
286
|
|
286
287
|
Returns:
|
@@ -313,7 +314,7 @@ class ArtifactVersionResponse(
|
|
313
314
|
Returns:
|
314
315
|
the value of the property.
|
315
316
|
"""
|
316
|
-
return self.
|
317
|
+
return self.get_resources().tags
|
317
318
|
|
318
319
|
@property
|
319
320
|
def producer_pipeline_run_id(self) -> Optional[UUID]:
|
@@ -322,7 +323,7 @@ class ArtifactVersionResponse(
|
|
322
323
|
Returns:
|
323
324
|
the value of the property.
|
324
325
|
"""
|
325
|
-
return self.
|
326
|
+
return self.get_resources().producer_pipeline_run_id
|
326
327
|
|
327
328
|
@property
|
328
329
|
def save_type(self) -> ArtifactSaveType:
|
@@ -349,7 +350,7 @@ class ArtifactVersionResponse(
|
|
349
350
|
Returns:
|
350
351
|
the value of the property.
|
351
352
|
"""
|
352
|
-
return self.
|
353
|
+
return self.get_resources().producer_step_run_id
|
353
354
|
|
354
355
|
@property
|
355
356
|
def visualizations(
|
@@ -710,7 +711,6 @@ class LazyArtifactVersionResponse(ArtifactVersionResponse):
|
|
710
711
|
"""
|
711
712
|
|
712
713
|
id: Optional[UUID] = None # type: ignore[assignment]
|
713
|
-
project_id: Optional[UUID] = None # type: ignore[assignment]
|
714
714
|
lazy_load_name: Optional[str] = None
|
715
715
|
lazy_load_version: Optional[str] = None
|
716
716
|
lazy_load_model_name: str
|
zenml/models/v2/core/logs.py
CHANGED
@@ -13,12 +13,12 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Models representing logs."""
|
15
15
|
|
16
|
-
from typing import Any, Optional
|
16
|
+
from typing import Any, Optional
|
17
17
|
from uuid import UUID
|
18
18
|
|
19
19
|
from pydantic import Field, field_validator
|
20
20
|
|
21
|
-
from zenml.constants import
|
21
|
+
from zenml.constants import TEXT_FIELD_MAX_LENGTH
|
22
22
|
from zenml.models.v2.base.base import (
|
23
23
|
BaseDatedResponseBody,
|
24
24
|
BaseIdentifiedResponse,
|
@@ -60,27 +60,6 @@ class LogsRequest(BaseRequest):
|
|
60
60
|
)
|
61
61
|
return value
|
62
62
|
|
63
|
-
@field_validator("artifact_store_id")
|
64
|
-
@classmethod
|
65
|
-
def str_field_max_length_check(cls, value: Any) -> Any:
|
66
|
-
"""Checks if the length of the value exceeds the maximum text length.
|
67
|
-
|
68
|
-
Args:
|
69
|
-
value: the value set in the field
|
70
|
-
|
71
|
-
Returns:
|
72
|
-
the value itself.
|
73
|
-
|
74
|
-
Raises:
|
75
|
-
AssertionError: if the length of the field is longer than the
|
76
|
-
maximum threshold.
|
77
|
-
"""
|
78
|
-
assert len(str(value)) < STR_FIELD_MAX_LENGTH, (
|
79
|
-
"The length of the value for this field can not "
|
80
|
-
f"exceed {STR_FIELD_MAX_LENGTH}"
|
81
|
-
)
|
82
|
-
return value
|
83
|
-
|
84
63
|
|
85
64
|
# ------------------ Update Model ------------------
|
86
65
|
|
@@ -101,41 +80,20 @@ class LogsResponseBody(BaseDatedResponseBody):
|
|
101
80
|
class LogsResponseMetadata(BaseResponseMetadata):
|
102
81
|
"""Response metadata for logs."""
|
103
82
|
|
104
|
-
step_run_id: Optional[
|
83
|
+
step_run_id: Optional[UUID] = Field(
|
105
84
|
title="Step ID to associate the logs with.",
|
106
85
|
default=None,
|
107
86
|
description="When this is set, pipeline_run_id should be set to None.",
|
108
|
-
union_mode="left_to_right",
|
109
87
|
)
|
110
|
-
pipeline_run_id: Optional[
|
88
|
+
pipeline_run_id: Optional[UUID] = Field(
|
111
89
|
title="Pipeline run ID to associate the logs with.",
|
112
90
|
default=None,
|
113
91
|
description="When this is set, step_run_id should be set to None.",
|
114
|
-
union_mode="left_to_right",
|
115
92
|
)
|
116
|
-
artifact_store_id:
|
93
|
+
artifact_store_id: UUID = Field(
|
117
94
|
title="The artifact store ID to associate the logs with.",
|
118
|
-
union_mode="left_to_right",
|
119
95
|
)
|
120
96
|
|
121
|
-
@field_validator("artifact_store_id")
|
122
|
-
@classmethod
|
123
|
-
def str_field_max_length_check(cls, value: Any) -> Any:
|
124
|
-
"""Checks if the length of the value exceeds the maximum text length.
|
125
|
-
|
126
|
-
Args:
|
127
|
-
value: the value set in the field
|
128
|
-
|
129
|
-
Returns:
|
130
|
-
the value itself.
|
131
|
-
|
132
|
-
Raises:
|
133
|
-
AssertionError: if the length of the field is longer than the
|
134
|
-
maximum threshold.
|
135
|
-
"""
|
136
|
-
assert len(str(value)) < STR_FIELD_MAX_LENGTH
|
137
|
-
return value
|
138
|
-
|
139
97
|
|
140
98
|
class LogsResponseResources(BaseResponseResources):
|
141
99
|
"""Class for all resource models associated with the Logs entity."""
|
@@ -169,7 +127,7 @@ class LogsResponse(
|
|
169
127
|
return self.get_body().uri
|
170
128
|
|
171
129
|
@property
|
172
|
-
def step_run_id(self) -> Optional[
|
130
|
+
def step_run_id(self) -> Optional[UUID]:
|
173
131
|
"""The `step_run_id` property.
|
174
132
|
|
175
133
|
Returns:
|
@@ -178,7 +136,7 @@ class LogsResponse(
|
|
178
136
|
return self.get_metadata().step_run_id
|
179
137
|
|
180
138
|
@property
|
181
|
-
def pipeline_run_id(self) -> Optional[
|
139
|
+
def pipeline_run_id(self) -> Optional[UUID]:
|
182
140
|
"""The `pipeline_run_id` property.
|
183
141
|
|
184
142
|
Returns:
|
@@ -187,7 +145,7 @@ class LogsResponse(
|
|
187
145
|
return self.get_metadata().pipeline_run_id
|
188
146
|
|
189
147
|
@property
|
190
|
-
def artifact_store_id(self) ->
|
148
|
+
def artifact_store_id(self) -> UUID:
|
191
149
|
"""The `artifact_store_id` property.
|
192
150
|
|
193
151
|
Returns:
|
zenml/models/v2/core/model.py
CHANGED
@@ -132,12 +132,6 @@ class ModelUpdate(BaseUpdate):
|
|
132
132
|
class ModelResponseBody(ProjectScopedResponseBody):
|
133
133
|
"""Response body for models."""
|
134
134
|
|
135
|
-
tags: List["TagResponse"] = Field(
|
136
|
-
title="Tags associated with the model",
|
137
|
-
)
|
138
|
-
latest_version_name: Optional[str] = None
|
139
|
-
latest_version_id: Optional[UUID] = None
|
140
|
-
|
141
135
|
|
142
136
|
class ModelResponseMetadata(ProjectScopedResponseMetadata):
|
143
137
|
"""Response metadata for models."""
|
@@ -186,6 +180,12 @@ class ModelResponseMetadata(ProjectScopedResponseMetadata):
|
|
186
180
|
class ModelResponseResources(ProjectScopedResponseResources):
|
187
181
|
"""Class for all resource models associated with the model entity."""
|
188
182
|
|
183
|
+
tags: List["TagResponse"] = Field(
|
184
|
+
title="Tags associated with the model",
|
185
|
+
)
|
186
|
+
latest_version_name: Optional[str] = None
|
187
|
+
latest_version_id: Optional[UUID] = None
|
188
|
+
|
189
189
|
|
190
190
|
class ModelResponse(
|
191
191
|
ProjectScopedResponse[
|
@@ -217,7 +217,7 @@ class ModelResponse(
|
|
217
217
|
Returns:
|
218
218
|
the value of the property.
|
219
219
|
"""
|
220
|
-
return self.
|
220
|
+
return self.get_resources().tags
|
221
221
|
|
222
222
|
@property
|
223
223
|
def latest_version_name(self) -> Optional[str]:
|
@@ -226,7 +226,7 @@ class ModelResponse(
|
|
226
226
|
Returns:
|
227
227
|
the value of the property.
|
228
228
|
"""
|
229
|
-
return self.
|
229
|
+
return self.get_resources().latest_version_name
|
230
230
|
|
231
231
|
@property
|
232
232
|
def latest_version_id(self) -> Optional[UUID]:
|
@@ -235,7 +235,7 @@ class ModelResponse(
|
|
235
235
|
Returns:
|
236
236
|
the value of the property.
|
237
237
|
"""
|
238
|
-
return self.
|
238
|
+
return self.get_resources().latest_version_id
|
239
239
|
|
240
240
|
@property
|
241
241
|
def license(self) -> Optional[str]:
|
@@ -323,7 +323,7 @@ class ModelResponse(
|
|
323
323
|
model_versions = depaginate(
|
324
324
|
client.list_model_versions,
|
325
325
|
model_name_or_id=self.id,
|
326
|
-
project=self.
|
326
|
+
project=self.project_id,
|
327
327
|
)
|
328
328
|
return [
|
329
329
|
mv.to_model_class(suppress_class_validation_warnings=True)
|