@conduction/nextcloud-vue 2.63.0 → 2.65.0
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/dist/esm/components/CnAppNav/CnAppNav.vue2.js +253 -10
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +139 -46
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +87 -0
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +26 -24
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +61 -16
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js +20 -0
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +3 -2
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js +13 -0
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js.map +1 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js +2 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +33 -2
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +55 -2
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +153 -133
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +37 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +12 -4
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +125 -14
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +87 -40
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +101 -7
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +22 -5
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +30 -0
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +2 -2
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +5 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +63 -2
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +96 -37
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/stagesModel.js +5 -2
- package/dist/esm/components/CnStagesWidget/stagesModel.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +74 -5
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +15 -8
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +14 -2
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +2 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +73 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +14 -2
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
- package/dist/esm/l10n/en.json.js +2 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +2 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +495 -81
- package/dist/esm/store/useObjectStore.js +118 -33
- package/dist/esm/store/useObjectStore.js.map +1 -1
- package/dist/esm/utils/actionsDispatcher.js +14 -0
- package/dist/esm/utils/actionsDispatcher.js.map +1 -1
- package/dist/esm/utils/schemaRefSlug.js +19 -3
- package/dist/esm/utils/schemaRefSlug.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +7388 -6021
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +495 -81
- package/l10n/en.json +2 -0
- package/l10n/nl.json +2 -0
- package/package.json +1 -1
- package/src/components/CnAppNav/CnAppNav.vue +441 -14
- package/src/components/CnAppRoot/CnAppRoot.md +4 -0
- package/src/components/CnAppRoot/CnAppRoot.vue +94 -1
- package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +61 -16
- package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +22 -1
- package/src/components/CnBreadcrumbs/CnBreadcrumbs.vue +14 -0
- package/src/components/CnCellRenderer/CnCellRenderer.vue +33 -2
- package/src/components/CnDashboardPage/CnDashboardPage.vue +72 -4
- package/src/components/CnDataTable/CnDataTable.vue +45 -1
- package/src/components/CnDetailPage/CnDetailPage.md +8 -0
- package/src/components/CnDetailPage/CnDetailPage.vue +169 -2
- package/src/components/CnHeaderWidget/CnHeaderWidget.vue +147 -9
- package/src/components/CnIndexPage/CnIndexPage.vue +32 -2
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +7 -1
- package/src/components/CnStagesWidget/CnStagesWidget.vue +189 -2
- package/src/components/CnStagesWidget/stagesModel.js +5 -2
- package/src/components/CnStatWidget/CnStatWidget.vue +89 -7
- package/src/components/CnTabsWidget/CnTabsWidget.vue +15 -2
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +4 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +107 -1
- package/src/css/detail-page.css +32 -4
- package/src/css/kpi-card.css +71 -1
- package/src/css/table.css +18 -6
- package/src/schemas/app-manifest-v2.schema.json +134 -3
- package/src/store/useObjectStore.js +118 -33
- package/src/utils/actionsDispatcher.js +14 -0
- package/src/utils/schemaRefSlug.js +19 -3
- package/src/utils/validateManifestV2.compiled.js +2 -2
|
@@ -13,10 +13,10 @@ import InformationOutline from 'vue-material-design-icons/InformationOutline.vue
|
|
|
13
13
|
import Pencil from 'vue-material-design-icons/Pencil.vue';
|
|
14
14
|
import Plus from 'vue-material-design-icons/Plus.vue';
|
|
15
15
|
import Refresh from 'vue-material-design-icons/Refresh.vue';
|
|
16
|
-
import __sfc_main$
|
|
17
|
-
import __sfc_main$
|
|
16
|
+
import __sfc_main$h from '../../dialogs/CnRelationLinkModal.vue.js';
|
|
17
|
+
import __sfc_main$g from '../../dialogs/CnWidgetStyleEditorModal.vue.js';
|
|
18
18
|
import __sfc_main$1 from '../CnActionsMenu/CnActionsMenu.vue.js';
|
|
19
|
-
import __sfc_main$
|
|
19
|
+
import __sfc_main$e from '../CnBodySections/CnBodySections.vue.js';
|
|
20
20
|
import __sfc_main$2 from '../CnBuildiqEditButton/CnBuildiqEditButton.vue.js';
|
|
21
21
|
import __sfc_main$7 from '../CnDashboardGrid/CnDashboardGrid.vue.js';
|
|
22
22
|
import __sfc_main$5 from '../CnDetailWidgetHost/CnDetailWidgetHost.vue.js';
|
|
@@ -24,9 +24,9 @@ import __sfc_main$6 from '../CnFormDialog/CnFormDialog.vue.js';
|
|
|
24
24
|
import __sfc_main$8 from '../CnLifecycleActions/CnLifecycleActions.vue.js';
|
|
25
25
|
import __sfc_main$3 from '../CnLockedBanner/CnLockedBanner.vue.js';
|
|
26
26
|
import __sfc_main$4 from '../CnNextStepCard/CnNextStepCard.vue.js';
|
|
27
|
-
import __sfc_main$
|
|
28
|
-
import __sfc_main$
|
|
29
|
-
import __sfc_main$
|
|
27
|
+
import __sfc_main$d from '../CnRelatedCollections/CnRelatedCollections.vue.js';
|
|
28
|
+
import __sfc_main$c from '../CnSummaryAggregates/CnSummaryAggregates.vue.js';
|
|
29
|
+
import __sfc_main$f from '../CnTranslatedBadge/CnTranslatedBadge.vue.js';
|
|
30
30
|
import { useIntegrationRegistry } from '../../composables/useIntegrationRegistry.js';
|
|
31
31
|
import { useObjectLock } from '../../composables/useObjectLock.js';
|
|
32
32
|
import { useObjectPresence } from '../../composables/useObjectPresence.js';
|
|
@@ -40,8 +40,9 @@ import { cnGridCellStyle, hasGridRow } from '../../utils/grid.js';
|
|
|
40
40
|
import { slotRenders } from '../../utils/slotContent.js';
|
|
41
41
|
import { isDataWidgetDef, isRelatedWidgetDef, isGeoWidgetDef, isContentOnlyWidgetDef, isCardWidgetDef, widgetContentOf, resolveRegistryRenderer, widgetTitleOf } from '../../utils/widgetDispatch.js';
|
|
42
42
|
import __sfc_main$9 from '../CnActionButtons/CnActionButtons.vue.js';
|
|
43
|
+
import __sfc_main$a from '../CnBreadcrumbs/CnBreadcrumbs.vue.js';
|
|
43
44
|
import __sfc_main from '../CnIcon/CnIcon.vue.js';
|
|
44
|
-
import __sfc_main$
|
|
45
|
+
import __sfc_main$b from '../CnStatusBadge/CnStatusBadge.vue.js';
|
|
45
46
|
import { getWidgetTypeEntry } from '../CnWidgetGrid/dashboardWidgetRegistry.js';
|
|
46
47
|
import '../CnWidgetGrid/registerDashboardWidgets.js';
|
|
47
48
|
import { useObjectStore } from '../../store/useObjectStore.js';
|
|
@@ -187,13 +188,14 @@ var script = {
|
|
|
187
188
|
CnDashboardGrid: __sfc_main$7,
|
|
188
189
|
CnLifecycleActions: __sfc_main$8,
|
|
189
190
|
CnActionButtons: __sfc_main$9,
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
191
|
+
CnBreadcrumbs: __sfc_main$a,
|
|
192
|
+
CnStatusBadge: __sfc_main$b,
|
|
193
|
+
CnSummaryAggregates: __sfc_main$c,
|
|
194
|
+
CnRelatedCollections: __sfc_main$d,
|
|
195
|
+
CnBodySections: __sfc_main$e,
|
|
196
|
+
CnTranslatedBadge: __sfc_main$f,
|
|
197
|
+
CnWidgetStyleEditorModal: __sfc_main$g,
|
|
198
|
+
CnRelationLinkModal: __sfc_main$h,
|
|
197
199
|
Cog,
|
|
198
200
|
Plus,
|
|
199
201
|
Pencil,
|
|
@@ -1093,6 +1095,37 @@ var script = {
|
|
|
1093
1095
|
default: null,
|
|
1094
1096
|
},
|
|
1095
1097
|
|
|
1098
|
+
/**
|
|
1099
|
+
* Whether the type eyebrow (the type label above the record name)
|
|
1100
|
+
* renders once the record resolves. `false` (manifest
|
|
1101
|
+
* `config.showTypeEyebrow: false`) drops it for a header that says
|
|
1102
|
+
* the type in a pill instead.
|
|
1103
|
+
*
|
|
1104
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps/specs/zuiddrecht-pixel-gaps/spec.md#requirement-a-detail-page-drops-its-eyebrow-and-shows-a-breadcrumb
|
|
1105
|
+
*/
|
|
1106
|
+
showTypeEyebrow: {
|
|
1107
|
+
type: Boolean,
|
|
1108
|
+
default: true,
|
|
1109
|
+
},
|
|
1110
|
+
|
|
1111
|
+
/**
|
|
1112
|
+
* A breadcrumb line above the header (manifest `config.breadcrumb`):
|
|
1113
|
+
* `{ label, route?, params?, href? }` names the list the record
|
|
1114
|
+
* belongs to; the record's display name follows as the current
|
|
1115
|
+
* crumb. `label` goes through the host translate function and shows
|
|
1116
|
+
* as text; `icon` (an MDI name, e.g. `Home`) draws that icon instead,
|
|
1117
|
+
* with the label as its accessible name. Null (the default) draws no
|
|
1118
|
+
* trail.
|
|
1119
|
+
*
|
|
1120
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps/specs/zuiddrecht-pixel-gaps/spec.md#requirement-a-detail-page-drops-its-eyebrow-and-shows-a-breadcrumb
|
|
1121
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-declared-breadcrumb-label-shows-as-text
|
|
1122
|
+
* @type {{label: string, route?: string, params?: object, href?: string, icon?: string}|null}
|
|
1123
|
+
*/
|
|
1124
|
+
breadcrumb: {
|
|
1125
|
+
type: Object,
|
|
1126
|
+
default: null,
|
|
1127
|
+
},
|
|
1128
|
+
|
|
1096
1129
|
/**
|
|
1097
1130
|
* A column of cards beside the body (manifest `config.sideColumn`),
|
|
1098
1131
|
* for the record's facts: deadline, requester, handler, links. Each
|
|
@@ -1108,6 +1141,33 @@ var script = {
|
|
|
1108
1141
|
default: () => [],
|
|
1109
1142
|
},
|
|
1110
1143
|
|
|
1144
|
+
/**
|
|
1145
|
+
* Draw the header as a card (manifest `config.headerCard: true`): the
|
|
1146
|
+
* pills, the title and the actions on the page's surface colour inside
|
|
1147
|
+
* a bordered, rounded box, as the board's case header. Off by default,
|
|
1148
|
+
* which keeps the header on the page ground.
|
|
1149
|
+
*
|
|
1150
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-detail-header-can-be-a-card-that-holds-a-widget
|
|
1151
|
+
*/
|
|
1152
|
+
headerCard: {
|
|
1153
|
+
type: Boolean,
|
|
1154
|
+
default: false,
|
|
1155
|
+
},
|
|
1156
|
+
|
|
1157
|
+
/**
|
|
1158
|
+
* The id of a widget declared in `widgets` to render inside the header,
|
|
1159
|
+
* on its own row under the title and the actions (manifest
|
|
1160
|
+
* `config.headerWidget`), e.g. the stages bars. It renders without a
|
|
1161
|
+
* card of its own and leaves the body grid. Empty (the default), or an
|
|
1162
|
+
* id that names no widget, renders nothing extra.
|
|
1163
|
+
*
|
|
1164
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-detail-header-can-be-a-card-that-holds-a-widget
|
|
1165
|
+
*/
|
|
1166
|
+
headerWidget: {
|
|
1167
|
+
type: String,
|
|
1168
|
+
default: '',
|
|
1169
|
+
},
|
|
1170
|
+
|
|
1111
1171
|
/**
|
|
1112
1172
|
* Whether the current user administers this instance. Shows the
|
|
1113
1173
|
* `adminOnly` header actions. `null` (the default) reads it from
|
|
@@ -1647,6 +1707,21 @@ var script = {
|
|
|
1647
1707
|
.filter(Boolean)
|
|
1648
1708
|
},
|
|
1649
1709
|
|
|
1710
|
+
/**
|
|
1711
|
+
* The widget the header holds (`headerWidget`): the definition in
|
|
1712
|
+
* `widgets` with that id, or null without the key or a match.
|
|
1713
|
+
*
|
|
1714
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-detail-header-can-be-a-card-that-holds-a-widget
|
|
1715
|
+
* @return {object|null} The widget definition, or null.
|
|
1716
|
+
*/
|
|
1717
|
+
headerWidgetDef() {
|
|
1718
|
+
if (!this.headerWidget) {
|
|
1719
|
+
return null
|
|
1720
|
+
}
|
|
1721
|
+
const declared = Array.isArray(this.widgets) ? this.widgets : [];
|
|
1722
|
+
return declared.find((widget) => widget && widget.id === this.headerWidget) || null
|
|
1723
|
+
},
|
|
1724
|
+
|
|
1650
1725
|
/**
|
|
1651
1726
|
* The side column's widget definitions. A string names a widget
|
|
1652
1727
|
* declared in `widgets`; an object is a definition of its own.
|
|
@@ -2216,6 +2291,33 @@ var script = {
|
|
|
2216
2291
|
return this.objectDisplayName || this.resolvedTitle
|
|
2217
2292
|
},
|
|
2218
2293
|
|
|
2294
|
+
/**
|
|
2295
|
+
* The breadcrumb trail: the declared crumb (a router target from
|
|
2296
|
+
* `route` + `params`, or an `href`), then the record's display name
|
|
2297
|
+
* as the current crumb. Empty without a `breadcrumb` label. The first
|
|
2298
|
+
* crumb carries `icon` only when the manifest declares one.
|
|
2299
|
+
*
|
|
2300
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps/specs/zuiddrecht-pixel-gaps/spec.md#requirement-a-detail-page-drops-its-eyebrow-and-shows-a-breadcrumb
|
|
2301
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-declared-breadcrumb-label-shows-as-text
|
|
2302
|
+
* @return {Array<{label: string, to?: object, href?: string, icon?: string}>}
|
|
2303
|
+
*/
|
|
2304
|
+
breadcrumbCrumbs() {
|
|
2305
|
+
const crumb = this.breadcrumb;
|
|
2306
|
+
if (!crumb || typeof crumb.label !== 'string' || crumb.label === '') {
|
|
2307
|
+
return []
|
|
2308
|
+
}
|
|
2309
|
+
const first = { label: this.effectiveTranslate(crumb.label) };
|
|
2310
|
+
if (typeof crumb.icon === 'string' && crumb.icon !== '') {
|
|
2311
|
+
first.icon = crumb.icon;
|
|
2312
|
+
}
|
|
2313
|
+
if (crumb.route) {
|
|
2314
|
+
first.to = { name: crumb.route, ...(crumb.params ? { params: crumb.params } : {}) };
|
|
2315
|
+
} else if (crumb.href) {
|
|
2316
|
+
first.href = crumb.href;
|
|
2317
|
+
}
|
|
2318
|
+
return [first, { label: this.displayTitle }]
|
|
2319
|
+
},
|
|
2320
|
+
|
|
2219
2321
|
/**
|
|
2220
2322
|
* Effective translate function: the injected `cnTranslate` (the host
|
|
2221
2323
|
* app's bound `t()`), identity by default.
|
|
@@ -3667,6 +3769,10 @@ var script = {
|
|
|
3667
3769
|
* it — CnPageRenderer's split pane forwards no slots, which is exactly
|
|
3668
3770
|
* that fault and wants fixing, not concealing.
|
|
3669
3771
|
*
|
|
3772
|
+
* The widget the header holds (`headerWidget`) draws nothing here
|
|
3773
|
+
* either: it is already drawn in the header.
|
|
3774
|
+
*
|
|
3775
|
+
* @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-detail-header-can-be-a-card-that-holds-a-widget
|
|
3670
3776
|
* @param {object} item A layout item.
|
|
3671
3777
|
* @return {boolean} False only when the item provably draws nothing.
|
|
3672
3778
|
*/
|
|
@@ -3677,6 +3783,11 @@ var script = {
|
|
|
3677
3783
|
if (this.editingBody) {
|
|
3678
3784
|
return true
|
|
3679
3785
|
}
|
|
3786
|
+
// The widget the header holds (`headerWidget`) is drawn there, so
|
|
3787
|
+
// its grid cell would be the same widget twice.
|
|
3788
|
+
if (this.headerWidgetDef !== null && item.widgetId === this.headerWidgetDef.id) {
|
|
3789
|
+
return false
|
|
3790
|
+
}
|
|
3680
3791
|
const widget = this.findWidget(item);
|
|
3681
3792
|
if (!widget) {
|
|
3682
3793
|
return true
|