@praxisui/dynamic-form 8.0.0-beta.26 → 8.0.0-beta.27
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.
- package/README.md +6 -0
- package/fesm2022/{praxisui-dynamic-form-dynamic-form-agentic-authoring-turn-flow-DuH1ad7h.mjs → praxisui-dynamic-form-dynamic-form-agentic-authoring-turn-flow-DOn1s9oR.mjs} +2 -22
- package/fesm2022/praxisui-dynamic-form.mjs +272 -15
- package/index.d.ts +24 -2
- package/package.json +8 -8
- package/src/lib/praxis-dynamic-form.json-api.md +3 -0
package/index.d.ts
CHANGED
|
@@ -478,8 +478,19 @@ declare class FormAiAdapter extends BaseAiAdapter<FormConfig> {
|
|
|
478
478
|
private applyConfig;
|
|
479
479
|
private smartMergeFormConfig;
|
|
480
480
|
private extractIncomingRules;
|
|
481
|
+
private extractComponentEditOperationPatch;
|
|
482
|
+
private applyComponentEditOperation;
|
|
483
|
+
private applyLocalFieldAdd;
|
|
484
|
+
private applyFieldMetadataPatch;
|
|
485
|
+
private appendFieldToLayout;
|
|
486
|
+
private resolveFieldName;
|
|
487
|
+
private matchesText;
|
|
488
|
+
private normalizeSearchText;
|
|
489
|
+
private toBoolean;
|
|
490
|
+
private toSubmitPolicy;
|
|
481
491
|
private extractVisualBlockGuidanceOperationRule;
|
|
482
492
|
private coerceSingleOperationResponse;
|
|
493
|
+
private coerceOperationResponses;
|
|
483
494
|
private operationInputRecord;
|
|
484
495
|
private normalizeVisualBlockGuidanceOperationInput;
|
|
485
496
|
private visualBlockGuidanceParamsToRule;
|
|
@@ -588,6 +599,11 @@ interface DynamicFormApplyPlan {
|
|
|
588
599
|
diagnostics: EditorDiagnostic[];
|
|
589
600
|
}
|
|
590
601
|
|
|
602
|
+
interface DynamicFormConfigPatchChangeEvent {
|
|
603
|
+
inputPatch: {
|
|
604
|
+
config: FormConfig;
|
|
605
|
+
};
|
|
606
|
+
}
|
|
591
607
|
interface PraxisDynamicFormDomainRulesOptions {
|
|
592
608
|
enabled?: boolean;
|
|
593
609
|
targetArtifactKey?: string | null;
|
|
@@ -732,6 +748,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
732
748
|
/** Identifier for persisting layouts */
|
|
733
749
|
formId?: string;
|
|
734
750
|
componentInstanceId?: string;
|
|
751
|
+
configPersistenceStrategy: 'local-first' | 'input-first';
|
|
735
752
|
/** Optional layout to use instead of generated one */
|
|
736
753
|
layout?: FormLayout;
|
|
737
754
|
/** Optional navigation back config (from CRUD host) */
|
|
@@ -771,6 +788,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
771
788
|
formCancel: EventEmitter<void>;
|
|
772
789
|
formReset: EventEmitter<void>;
|
|
773
790
|
configChange: EventEmitter<FormConfig>;
|
|
791
|
+
configPatchChange: EventEmitter<DynamicFormConfigPatchChangeEvent>;
|
|
774
792
|
formReady: EventEmitter<FormReadyEvent>;
|
|
775
793
|
valueChange: EventEmitter<FormValueChangeEvent>;
|
|
776
794
|
syncCompleted: EventEmitter<SyncResult>;
|
|
@@ -942,6 +960,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
942
960
|
private hasSchemaBackedRuntime;
|
|
943
961
|
private hasRenderableConfig;
|
|
944
962
|
private initializeStandaloneConfig;
|
|
963
|
+
private initializeDisconnectedEmptyState;
|
|
945
964
|
private reloadForModeChange;
|
|
946
965
|
ngOnInit(): void;
|
|
947
966
|
ngOnChanges(changes: SimpleChanges): void;
|
|
@@ -955,6 +974,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
955
974
|
private createDefaultConfig;
|
|
956
975
|
private createConfigFromHostConfig;
|
|
957
976
|
private reconcileLoadedConfigWithServerSchema;
|
|
977
|
+
private hostConfigHasAuthoredLocalFieldsNotInLocalConfig;
|
|
958
978
|
private syncWithServer;
|
|
959
979
|
private loadEntity;
|
|
960
980
|
private buildFormFromConfig;
|
|
@@ -1279,6 +1299,8 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
1279
1299
|
private captureCurrentSchemaPrefsSnapshot;
|
|
1280
1300
|
private executeDynamicFormEditorApplyPlan;
|
|
1281
1301
|
private attachRuntimeMetadataToDynamicFormConfig;
|
|
1302
|
+
private emitConfigPatchChange;
|
|
1303
|
+
private cloneFormConfigForPatch;
|
|
1282
1304
|
private parsePresentationCssNumber;
|
|
1283
1305
|
private clearDynamicFormEditorPersistence;
|
|
1284
1306
|
private clearStoredPresentationSnapshots;
|
|
@@ -1298,7 +1320,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
1298
1320
|
private applyPresentationVars;
|
|
1299
1321
|
private applyPresentationConfig;
|
|
1300
1322
|
static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDynamicForm, [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
1301
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicForm, "praxis-dynamic-form", never, { "resourcePath": { "alias": "resourcePath"; "required": false; }; "resourceId": { "alias": "resourceId"; "required": false; }; "initialValue": { "alias": "initialValue"; "required": false; }; "editorialContext": { "alias": "editorialContext"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "config": { "alias": "config"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "schemaSource": { "alias": "schemaSource"; "required": false; }; "schemaUrl": { "alias": "schemaUrl"; "required": false; }; "submitUrl": { "alias": "submitUrl"; "required": false; }; "submitMethod": { "alias": "submitMethod"; "required": false; }; "responseSchemaUrl": { "alias": "responseSchemaUrl"; "required": false; }; "apiEndpointKey": { "alias": "apiEndpointKey"; "required": false; }; "apiUrlEntry": { "alias": "apiUrlEntry"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "backConfig": { "alias": "backConfig"; "required": false; }; "hooks": { "alias": "hooks"; "required": false; }; "removeEmptyContainersOnSave": { "alias": "removeEmptyContainersOnSave"; "required": false; }; "reactiveValidation": { "alias": "reactiveValidation"; "required": false; }; "reactiveValidationDebounceMs": { "alias": "reactiveValidationDebounceMs"; "required": false; }; "notifyIfOutdated": { "alias": "notifyIfOutdated"; "required": false; }; "snoozeMs": { "alias": "snoozeMs"; "required": false; }; "autoOpenSettingsOnOutdated": { "alias": "autoOpenSettingsOnOutdated"; "required": false; }; "readonlyModeGlobal": { "alias": "readonlyModeGlobal"; "required": false; }; "disabledModeGlobal": { "alias": "disabledModeGlobal"; "required": false; }; "presentationModeGlobal": { "alias": "presentationModeGlobal"; "required": false; }; "visibleGlobal": { "alias": "visibleGlobal"; "required": false; }; "domainRules": { "alias": "domainRules"; "required": false; }; "customEndpoints": { "alias": "customEndpoints"; "required": false; }; }, { "formSubmit": "formSubmit"; "formCancel": "formCancel"; "formReset": "formReset"; "configChange": "configChange"; "formReady": "formReady"; "valueChange": "valueChange"; "syncCompleted": "syncCompleted"; "initializationError": "initializationError"; "loadingStateChange": "loadingStateChange"; "enableCustomizationChange": "enableCustomizationChange"; "customAction": "customAction"; "actionConfirmation": "actionConfirmation"; "schemaStatusChange": "schemaStatusChange"; "fieldRenderError": "fieldRenderError"; "ruleDiagnosticsChange": "ruleDiagnosticsChange"; }, never, never, true, never>;
|
|
1323
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicForm, "praxis-dynamic-form", never, { "resourcePath": { "alias": "resourcePath"; "required": false; }; "resourceId": { "alias": "resourceId"; "required": false; }; "initialValue": { "alias": "initialValue"; "required": false; }; "editorialContext": { "alias": "editorialContext"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "config": { "alias": "config"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "schemaSource": { "alias": "schemaSource"; "required": false; }; "schemaUrl": { "alias": "schemaUrl"; "required": false; }; "submitUrl": { "alias": "submitUrl"; "required": false; }; "submitMethod": { "alias": "submitMethod"; "required": false; }; "responseSchemaUrl": { "alias": "responseSchemaUrl"; "required": false; }; "apiEndpointKey": { "alias": "apiEndpointKey"; "required": false; }; "apiUrlEntry": { "alias": "apiUrlEntry"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "configPersistenceStrategy": { "alias": "configPersistenceStrategy"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "backConfig": { "alias": "backConfig"; "required": false; }; "hooks": { "alias": "hooks"; "required": false; }; "removeEmptyContainersOnSave": { "alias": "removeEmptyContainersOnSave"; "required": false; }; "reactiveValidation": { "alias": "reactiveValidation"; "required": false; }; "reactiveValidationDebounceMs": { "alias": "reactiveValidationDebounceMs"; "required": false; }; "notifyIfOutdated": { "alias": "notifyIfOutdated"; "required": false; }; "snoozeMs": { "alias": "snoozeMs"; "required": false; }; "autoOpenSettingsOnOutdated": { "alias": "autoOpenSettingsOnOutdated"; "required": false; }; "readonlyModeGlobal": { "alias": "readonlyModeGlobal"; "required": false; }; "disabledModeGlobal": { "alias": "disabledModeGlobal"; "required": false; }; "presentationModeGlobal": { "alias": "presentationModeGlobal"; "required": false; }; "visibleGlobal": { "alias": "visibleGlobal"; "required": false; }; "domainRules": { "alias": "domainRules"; "required": false; }; "customEndpoints": { "alias": "customEndpoints"; "required": false; }; }, { "formSubmit": "formSubmit"; "formCancel": "formCancel"; "formReset": "formReset"; "configChange": "configChange"; "configPatchChange": "configPatchChange"; "formReady": "formReady"; "valueChange": "valueChange"; "syncCompleted": "syncCompleted"; "initializationError": "initializationError"; "loadingStateChange": "loadingStateChange"; "enableCustomizationChange": "enableCustomizationChange"; "customAction": "customAction"; "actionConfirmation": "actionConfirmation"; "schemaStatusChange": "schemaStatusChange"; "fieldRenderError": "fieldRenderError"; "ruleDiagnosticsChange": "ruleDiagnosticsChange"; }, never, never, true, never>;
|
|
1302
1324
|
}
|
|
1303
1325
|
|
|
1304
1326
|
declare class FormConfigService {
|
|
@@ -2595,4 +2617,4 @@ declare function buildDynamicFormRuleAuthoringContext(config: Pick<FormConfig, '
|
|
|
2595
2617
|
declare const PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST: ComponentAuthoringManifest;
|
|
2596
2618
|
|
|
2597
2619
|
export { ActionsEditorComponent, CanvasStateService, CanvasToolbarComponent, ColumnEditorComponent, DomainRuleFormRulesService, DynamicFormLayoutService, FORM_AI_CAPABILITIES, FORM_COMPONENT_AI_CAPABILITIES, FieldConfiguratorComponent, FieldEditorComponent, FormConfigService, FormContextService, FormLayoutService, FormRulesService, JsonConfigEditorComponent, LayoutColorToken, LayoutEditorComponent, LayoutPrefsService, PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST, PRAXIS_DYNAMIC_FORM_COMPONENT_METADATA, PRAXIS_FILTER_FORM_COMPONENT_METADATA, PraxisDynamicForm, PraxisDynamicFormConfigEditor, PraxisDynamicFormWidgetConfigEditor, PraxisFilterForm, PraxisFilterFormWidgetConfigEditor, PraxisFormActionsComponent, RowConfiguratorComponent, RowEditorComponent, SETTINGS_PANEL_DYNAMIC_FORM_PROVIDER, SectionEditorComponent, TASK_PRESETS, applyVisibilityRules, buildDynamicFormApplyPlan, buildDynamicFormRuleAuthoringContext, createDynamicFormAuthoringDocument, formLayoutRulesToBuilderState, getFormAiCatalog, getFormCapabilities, getFormEnum, isRuleSatisfied, normalizeDateArrays, normalizeDynamicFormAuthoringDocument, parseLegacyOrDynamicFormDocument, providePraxisDynamicFormMetadata, providePraxisFilterFormMetadata, provideSettingsPanelDynamicForm, ruleBuilderStateToFormLayoutRules, serializeDynamicFormAuthoringDocument, stripLegacyFieldMetadata, toCanonicalDynamicFormConfig, validateDynamicFormAuthoringDocument, validateDynamicFormAuthoringInput };
|
|
2598
|
-
export type { CanvasElement, CanvasElementType, CanvasPathPart, Capability$1 as Capability, CapabilityCatalog$1 as CapabilityCatalog, CapabilityCategory$1 as CapabilityCategory, DomainRuleFormRulesRequestOptions, DomainRuleMaterializedFormLayoutRule, DynamicFieldRenderErrorEvent, DynamicFormAllowedRuleProperties, DynamicFormApplyPlan, DynamicFormAuthoringDocument, DynamicFormBindings, DynamicFormContextSnapshot, DynamicFormMode, DynamicFormPresentationSnapshot, DynamicFormProjectionContext, DynamicFormResolvedRuntimeContract, DynamicFormRuleAuthoringContext, DynamicFormRuleAuthoringField, DynamicFormRuleAuthoringTarget, DynamicFormRuleAuthoringTargetDetails, DynamicFormRuleAuthoringTargets, DynamicFormRuleAuthoringVisualBlockNode, DynamicFormRuleTargetType, DynamicFormRuntimeContext, DynamicFormRuntimeValueSource, DynamicFormSchemaPrefsSnapshot, DynamicFormValidationContext, EditorDiagnostic, EditorDocument, FieldPath, FieldPathContainer, FieldPathWithIndex, Capability as FormComponentCapability, CapabilityCatalog as FormComponentCapabilityCatalog, CapabilityCategory as FormComponentCapabilityCategory, ValueKind as FormComponentValueKind, FormConfigLike, IdPath, InsertLocalFieldOptions, InsertLocalFieldResult, JsonEditorEvent, JsonValidationResult, LayoutChange, LayoutResult, LocalFieldInsertionDiagnostic, LocalFieldInsertionDiagnosticCode, Operation, Path, PathWithIndex, PraxisDynamicFormDomainRulesOptions, PraxisDynamicFormWidgetEditorInputs, PraxisDynamicFormWidgetEditorValue, PraxisFilterFormWidgetEditorInputs, PraxisFilterFormWidgetEditorValue, PraxisFormActionEvent, RemovePolicy, RuleApplicationContext, RuleApplicationDiagnostic, RuleApplicationDiagnosticCode, RuleApplicationResult, RuleApplicationTargetIndex, RuleApplicationTargetType, ValidationReport, ValueKind$1 as ValueKind };
|
|
2620
|
+
export type { CanvasElement, CanvasElementType, CanvasPathPart, Capability$1 as Capability, CapabilityCatalog$1 as CapabilityCatalog, CapabilityCategory$1 as CapabilityCategory, DomainRuleFormRulesRequestOptions, DomainRuleMaterializedFormLayoutRule, DynamicFieldRenderErrorEvent, DynamicFormAllowedRuleProperties, DynamicFormApplyPlan, DynamicFormAuthoringDocument, DynamicFormBindings, DynamicFormConfigPatchChangeEvent, DynamicFormContextSnapshot, DynamicFormMode, DynamicFormPresentationSnapshot, DynamicFormProjectionContext, DynamicFormResolvedRuntimeContract, DynamicFormRuleAuthoringContext, DynamicFormRuleAuthoringField, DynamicFormRuleAuthoringTarget, DynamicFormRuleAuthoringTargetDetails, DynamicFormRuleAuthoringTargets, DynamicFormRuleAuthoringVisualBlockNode, DynamicFormRuleTargetType, DynamicFormRuntimeContext, DynamicFormRuntimeValueSource, DynamicFormSchemaPrefsSnapshot, DynamicFormValidationContext, EditorDiagnostic, EditorDocument, FieldPath, FieldPathContainer, FieldPathWithIndex, Capability as FormComponentCapability, CapabilityCatalog as FormComponentCapabilityCatalog, CapabilityCategory as FormComponentCapabilityCategory, ValueKind as FormComponentValueKind, FormConfigLike, IdPath, InsertLocalFieldOptions, InsertLocalFieldResult, JsonEditorEvent, JsonValidationResult, LayoutChange, LayoutResult, LocalFieldInsertionDiagnostic, LocalFieldInsertionDiagnosticCode, Operation, Path, PathWithIndex, PraxisDynamicFormDomainRulesOptions, PraxisDynamicFormWidgetEditorInputs, PraxisDynamicFormWidgetEditorValue, PraxisFilterFormWidgetEditorInputs, PraxisFilterFormWidgetEditorValue, PraxisFormActionEvent, RemovePolicy, RuleApplicationContext, RuleApplicationDiagnostic, RuleApplicationDiagnosticCode, RuleApplicationResult, RuleApplicationTargetIndex, RuleApplicationTargetType, ValidationReport, ValueKind$1 as ValueKind };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/dynamic-form",
|
|
3
|
-
"version": "8.0.0-beta.
|
|
3
|
+
"version": "8.0.0-beta.27",
|
|
4
4
|
"description": "Angular dynamic form engine for Praxis UI: metadata-driven forms, hooks, and services integrating @praxisui/* packages.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^20.0.0",
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
"@angular/forms": "^20.0.0",
|
|
10
10
|
"@angular/material": "^20.0.0",
|
|
11
11
|
"@angular/router": "^20.0.0",
|
|
12
|
-
"@praxisui/ai": "^8.0.0-beta.
|
|
13
|
-
"@praxisui/dynamic-fields": "^8.0.0-beta.
|
|
14
|
-
"@praxisui/metadata-editor": "^8.0.0-beta.
|
|
15
|
-
"@praxisui/rich-content": "^8.0.0-beta.
|
|
16
|
-
"@praxisui/settings-panel": "^8.0.0-beta.
|
|
17
|
-
"@praxisui/visual-builder": "^8.0.0-beta.
|
|
18
|
-
"@praxisui/core": "^8.0.0-beta.
|
|
12
|
+
"@praxisui/ai": "^8.0.0-beta.27",
|
|
13
|
+
"@praxisui/dynamic-fields": "^8.0.0-beta.27",
|
|
14
|
+
"@praxisui/metadata-editor": "^8.0.0-beta.27",
|
|
15
|
+
"@praxisui/rich-content": "^8.0.0-beta.27",
|
|
16
|
+
"@praxisui/settings-panel": "^8.0.0-beta.27",
|
|
17
|
+
"@praxisui/visual-builder": "^8.0.0-beta.27",
|
|
18
|
+
"@praxisui/core": "^8.0.0-beta.27",
|
|
19
19
|
"rxjs": "^7.8.0"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
@@ -379,6 +379,7 @@ Limites de segurança:
|
|
|
379
379
|
| `formCancel` | `void` | Acao cancelar. | Partial | Preservado da documentação anterior. |
|
|
380
380
|
| `formReset` | `void` | Acao reset. | Partial | Preservado da documentação anterior. |
|
|
381
381
|
| `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. | Partial | Preservado da documentação anterior. |
|
|
382
|
+
| `configPatchChange` | `{ inputPatch: { config: FormConfig } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. | Partial | Contrato aditivo para hosts genericos sem alterar o payload legado de `configChange`. |
|
|
382
383
|
| `formReady` | `FormReadyEvent` | Form pronto para interacao. | Partial | Preservado da documentação anterior. |
|
|
383
384
|
| `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. | Partial | Preservado da documentação anterior. |
|
|
384
385
|
| `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. | Partial | Preservado da documentação anterior. |
|
|
@@ -646,6 +647,7 @@ Validado em 2026-04-23 contra `praxis-api-quickstart` publicado no Render com
|
|
|
646
647
|
| `formCancel` | `void` | Acao cancelar. |
|
|
647
648
|
| `formReset` | `void` | Acao reset. |
|
|
648
649
|
| `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. |
|
|
650
|
+
| `configPatchChange` | `{ inputPatch: { config: FormConfig } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. |
|
|
649
651
|
| `formReady` | `FormReadyEvent` | Form pronto para interacao. |
|
|
650
652
|
| `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. |
|
|
651
653
|
| `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. |
|
|
@@ -871,6 +873,7 @@ O runtime emite `target-not-found` quando uma regra aponta para `section`, `row`
|
|
|
871
873
|
| `formCancel` | `void` | Acao cancelar. | Partial | Preservado da documentação anterior. |
|
|
872
874
|
| `formReset` | `void` | Acao reset. | Partial | Preservado da documentação anterior. |
|
|
873
875
|
| `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. | Partial | Preservado da documentação anterior. |
|
|
876
|
+
| `configPatchChange` | `{ inputPatch: { config: FormConfig } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. | Partial | Contrato aditivo para hosts genericos sem alterar o payload legado de `configChange`. |
|
|
874
877
|
| `formReady` | `FormReadyEvent` | Form pronto para interacao. | Partial | Preservado da documentação anterior. |
|
|
875
878
|
| `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. | Partial | Preservado da documentação anterior. |
|
|
876
879
|
| `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. | Partial | Preservado da documentação anterior. |
|