@nuxtseo/protocol 0.1.4 → 0.2.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/v1/account.d.ts +708 -0
- package/dist/v1/account.js +120 -1
- package/dist/v1/actions.d.ts +348 -0
- package/dist/v1/actions.js +76 -0
- package/dist/v1/audit.d.ts +32 -0
- package/dist/v1/audit.js +8 -0
- package/dist/v1/backlinks.d.ts +2838 -199
- package/dist/v1/backlinks.js +417 -8
- package/dist/v1/core.d.ts +18 -1
- package/dist/v1/core.js +28 -0
- package/dist/v1/gsc.d.ts +2793 -1421
- package/dist/v1/gsc.js +233 -14
- package/dist/v1/pages.d.ts +1085 -0
- package/dist/v1/pages.js +241 -2
- package/dist/v1/performance.d.ts +3868 -245
- package/dist/v1/performance.js +643 -1
- package/dist/v1/research.d.ts +1803 -489
- package/dist/v1/research.js +173 -0
- package/dist/v1/sites.d.ts +1025 -0
- package/dist/v1/sites.js +230 -0
- package/dist/v1/timeline.d.ts +1540 -70
- package/dist/v1/timeline.js +244 -0
- package/generated/openapi.v1.json +1 -1
- package/package.json +4 -4
package/dist/v1/gsc.js
CHANGED
|
@@ -15,6 +15,31 @@ export const searchAnalyticsViewSchema = schema.enum([
|
|
|
15
15
|
'analysis',
|
|
16
16
|
]);
|
|
17
17
|
const periodSchema = schema.enum(['7d', '28d', '3m', '6m', '12m']);
|
|
18
|
+
/**
|
|
19
|
+
* Legacy response discriminator alias. This operation shipped in 1.0.0 with
|
|
20
|
+
* its response objects discriminating on `type`; v1 clients generated from
|
|
21
|
+
* that contract still key on it. Producers keep emitting `type` alongside the
|
|
22
|
+
* canonical `view` for one deprecation window instead of breaking them
|
|
23
|
+
* implicitly within the same major version.
|
|
24
|
+
*/
|
|
25
|
+
function legacyViewDiscriminator(view) {
|
|
26
|
+
return schema.literal(view).default(view);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Accept envelopes keyed by either spelling: a payload carrying only the
|
|
30
|
+
* legacy `type` gains the canonical `view` before the discriminated union
|
|
31
|
+
* parses it.
|
|
32
|
+
*/
|
|
33
|
+
function acceptLegacyViewDiscriminator(union) {
|
|
34
|
+
return schema.preprocess((value) => {
|
|
35
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
36
|
+
return value;
|
|
37
|
+
const candidate = value;
|
|
38
|
+
if (!('view' in candidate) && typeof candidate.type === 'string')
|
|
39
|
+
return { ...candidate, view: candidate.type };
|
|
40
|
+
return value;
|
|
41
|
+
}, union);
|
|
42
|
+
}
|
|
18
43
|
const pageUrlSchema = schema.string().refine(value => value.startsWith('/') || URL.canParse(value), 'Expected an absolute URL or a site-relative path starting with /.');
|
|
19
44
|
export const searchAnalyticsQuerySchema = schema.strictObject({
|
|
20
45
|
view: searchAnalyticsViewSchema,
|
|
@@ -92,7 +117,8 @@ const deviceRowSchema = defineResponseObject({
|
|
|
92
117
|
function breakdownSchema(view, row) {
|
|
93
118
|
return defineResponseObject({
|
|
94
119
|
site: schema.string().min(1),
|
|
95
|
-
|
|
120
|
+
view: schema.literal(view),
|
|
121
|
+
type: legacyViewDiscriminator(view),
|
|
96
122
|
period: periodSchema,
|
|
97
123
|
total: schema.number().int().nonnegative(),
|
|
98
124
|
totals: totalsSchema.producer.nullable(),
|
|
@@ -102,7 +128,7 @@ function breakdownSchema(view, row) {
|
|
|
102
128
|
rows: schema.array(row.producer),
|
|
103
129
|
}, {
|
|
104
130
|
site: schema.string().min(1),
|
|
105
|
-
|
|
131
|
+
view: schema.literal(view),
|
|
106
132
|
period: periodSchema,
|
|
107
133
|
total: schema.number().int().nonnegative(),
|
|
108
134
|
totals: totalsSchema.client.nullable(),
|
|
@@ -125,14 +151,15 @@ const dailyRowSchema = defineResponseObject({
|
|
|
125
151
|
});
|
|
126
152
|
const timeseriesDataSchema = defineResponseObject({
|
|
127
153
|
site: schema.string().min(1),
|
|
128
|
-
|
|
154
|
+
view: schema.literal('timeseries'),
|
|
155
|
+
type: legacyViewDiscriminator('timeseries'),
|
|
129
156
|
period: periodSchema,
|
|
130
157
|
totals: totalsSchema.producer.nullable(),
|
|
131
158
|
prevTotals: totalsSchema.producer.nullable(),
|
|
132
159
|
daily: schema.array(dailyRowSchema.producer),
|
|
133
160
|
}, {
|
|
134
161
|
site: schema.string().min(1),
|
|
135
|
-
|
|
162
|
+
view: schema.literal('timeseries'),
|
|
136
163
|
period: periodSchema,
|
|
137
164
|
totals: totalsSchema.client.nullable(),
|
|
138
165
|
prevTotals: totalsSchema.client.nullable(),
|
|
@@ -149,14 +176,15 @@ const pageDetailRowSchema = defineResponseObject({
|
|
|
149
176
|
});
|
|
150
177
|
const pageDetailDataSchema = defineResponseObject({
|
|
151
178
|
site: schema.string().min(1),
|
|
152
|
-
|
|
179
|
+
view: schema.literal('page-detail'),
|
|
180
|
+
type: legacyViewDiscriminator('page-detail'),
|
|
153
181
|
pageUrl: pageUrlSchema,
|
|
154
182
|
period: periodSchema,
|
|
155
183
|
totals: totalsSchema.producer.nullable(),
|
|
156
184
|
rows: schema.array(pageDetailRowSchema.producer),
|
|
157
185
|
}, {
|
|
158
186
|
site: schema.string().min(1),
|
|
159
|
-
|
|
187
|
+
view: schema.literal('page-detail'),
|
|
160
188
|
pageUrl: pageUrlSchema,
|
|
161
189
|
period: periodSchema,
|
|
162
190
|
totals: totalsSchema.client.nullable(),
|
|
@@ -173,14 +201,15 @@ const keywordDetailRowSchema = defineResponseObject({
|
|
|
173
201
|
});
|
|
174
202
|
const keywordDetailDataSchema = defineResponseObject({
|
|
175
203
|
site: schema.string().min(1),
|
|
176
|
-
|
|
204
|
+
view: schema.literal('keyword-detail'),
|
|
205
|
+
type: legacyViewDiscriminator('keyword-detail'),
|
|
177
206
|
keyword: schema.string().min(1),
|
|
178
207
|
period: periodSchema,
|
|
179
208
|
totals: totalsSchema.producer.nullable(),
|
|
180
209
|
rows: schema.array(keywordDetailRowSchema.producer),
|
|
181
210
|
}, {
|
|
182
211
|
site: schema.string().min(1),
|
|
183
|
-
|
|
212
|
+
view: schema.literal('keyword-detail'),
|
|
184
213
|
keyword: schema.string().min(1),
|
|
185
214
|
period: periodSchema,
|
|
186
215
|
totals: totalsSchema.client.nullable(),
|
|
@@ -205,7 +234,8 @@ const analysisRowSchema = defineResponseObject({
|
|
|
205
234
|
});
|
|
206
235
|
const analysisDataSchema = defineResponseObject({
|
|
207
236
|
site: schema.string().min(1),
|
|
208
|
-
|
|
237
|
+
view: schema.literal('analysis'),
|
|
238
|
+
type: legacyViewDiscriminator('analysis'),
|
|
209
239
|
preset: gscdumpAnalysisPresetSchema,
|
|
210
240
|
description: schema.string().min(1),
|
|
211
241
|
criteria: schema.record(schema.string(), schema.union([schema.string(), schema.number(), schema.null()])),
|
|
@@ -215,7 +245,7 @@ const analysisDataSchema = defineResponseObject({
|
|
|
215
245
|
rows: schema.array(analysisRowSchema.producer),
|
|
216
246
|
}, {
|
|
217
247
|
site: schema.string().min(1),
|
|
218
|
-
|
|
248
|
+
view: schema.literal('analysis'),
|
|
219
249
|
preset: gscdumpAnalysisPresetSchema,
|
|
220
250
|
description: schema.string().min(1),
|
|
221
251
|
criteria: schema.record(schema.string(), schema.union([schema.string(), schema.number(), schema.null()])),
|
|
@@ -225,7 +255,7 @@ const analysisDataSchema = defineResponseObject({
|
|
|
225
255
|
rows: schema.array(analysisRowSchema.client),
|
|
226
256
|
});
|
|
227
257
|
export const searchAnalyticsDataSchema = {
|
|
228
|
-
producer: schema.discriminatedUnion('
|
|
258
|
+
producer: schema.discriminatedUnion('view', [
|
|
229
259
|
pagesDataSchema.producer,
|
|
230
260
|
keywordsDataSchema.producer,
|
|
231
261
|
countriesDataSchema.producer,
|
|
@@ -235,7 +265,7 @@ export const searchAnalyticsDataSchema = {
|
|
|
235
265
|
keywordDetailDataSchema.producer,
|
|
236
266
|
analysisDataSchema.producer,
|
|
237
267
|
]),
|
|
238
|
-
client: schema.discriminatedUnion('
|
|
268
|
+
client: acceptLegacyViewDiscriminator(schema.discriminatedUnion('view', [
|
|
239
269
|
pagesDataSchema.client,
|
|
240
270
|
keywordsDataSchema.client,
|
|
241
271
|
countriesDataSchema.client,
|
|
@@ -244,7 +274,7 @@ export const searchAnalyticsDataSchema = {
|
|
|
244
274
|
pageDetailDataSchema.client,
|
|
245
275
|
keywordDetailDataSchema.client,
|
|
246
276
|
analysisDataSchema.client,
|
|
247
|
-
]),
|
|
277
|
+
])),
|
|
248
278
|
};
|
|
249
279
|
export const searchAnalyticsResponseSchema = defineSuccessEnvelope(searchAnalyticsDataSchema);
|
|
250
280
|
export const searchStatusDataSchema = {
|
|
@@ -480,7 +510,7 @@ export const searchAnalyticsQueryOperation = defineOperation({
|
|
|
480
510
|
tags: ['Sites', 'Search'],
|
|
481
511
|
examples: [{
|
|
482
512
|
request: { params: { siteId: 'site_01JXYZ' }, query: { view: 'keywords' } },
|
|
483
|
-
response: { status: 200, body: { data: { site: 'https://example.com',
|
|
513
|
+
response: { status: 200, body: { data: { site: 'https://example.com', view: 'keywords', period: '28d', total: 1, totals: { clicks: 12, impressions: 100, ctr: 0.12, position: 4 }, totalsScope: 'full upstream query population', representedTotals: { clicks: 12, impressions: 100 }, representedTotalsScope: 'returned rows', rows: [{ keyword: 'nuxt seo', clicks: 12, impressions: 100, ctr: 0.12, pos: 4, topPage: 'https://example.com/docs', change: 2 }] }, meta: { requestId: 'req_01JXYZ', version: '1.0' } } },
|
|
484
514
|
}],
|
|
485
515
|
},
|
|
486
516
|
});
|
|
@@ -544,6 +574,194 @@ export const urlInspectionReadOperation = defineOperation({
|
|
|
544
574
|
examples: [{ request: { params: { siteId: 'site_01JXYZ' }, query: { url: '/docs' } }, response: { status: 200, body: { data: { _tag: 'no-inspection-data', requestedUrl: 'https://example.com/docs' }, meta: { requestId: 'req_01JXYZ', version: '1.0' } } } }],
|
|
545
575
|
},
|
|
546
576
|
});
|
|
577
|
+
export const indexCohortsQuerySchema = schema.strictObject({
|
|
578
|
+
limit: schema.coerce.number().int().min(1).max(50).default(12),
|
|
579
|
+
minSectionPages: schema.coerce.number().int().min(1).max(500).default(5),
|
|
580
|
+
});
|
|
581
|
+
export const establishedCohortSchema = defineResponseObject({
|
|
582
|
+
family: schema.string(),
|
|
583
|
+
dimension: schema.string(),
|
|
584
|
+
/**
|
|
585
|
+
* Null when the cohort is not expressible as one path prefix. Every
|
|
586
|
+
* `lifecycle` cohort is: version-pinned pages span the whole Site, so a
|
|
587
|
+
* drill-through must fall back to the unfiltered not-indexed list.
|
|
588
|
+
*/
|
|
589
|
+
pathPrefix: schema.string().nullable(),
|
|
590
|
+
pages: schema.number().int().nonnegative(),
|
|
591
|
+
notIndexed: schema.number().int().nonnegative(),
|
|
592
|
+
notIndexedPercent: schema.number(),
|
|
593
|
+
restOfSitePercent: schema.number(),
|
|
594
|
+
restOfSitePages: schema.number().int().nonnegative(),
|
|
595
|
+
confidenceIntervalLower: schema.number(),
|
|
596
|
+
confidenceIntervalUpper: schema.number(),
|
|
597
|
+
/** Families nest, so subtract this before summing notIndexed down the list. */
|
|
598
|
+
alreadyCountedAbove: schema.number().int().nonnegative(),
|
|
599
|
+
}, {
|
|
600
|
+
family: schema.string(),
|
|
601
|
+
dimension: schema.string(),
|
|
602
|
+
pathPrefix: schema.string().nullable(),
|
|
603
|
+
pages: schema.number().int().nonnegative(),
|
|
604
|
+
notIndexed: schema.number().int().nonnegative(),
|
|
605
|
+
notIndexedPercent: schema.number(),
|
|
606
|
+
restOfSitePercent: schema.number(),
|
|
607
|
+
restOfSitePages: schema.number().int().nonnegative(),
|
|
608
|
+
confidenceIntervalLower: schema.number(),
|
|
609
|
+
confidenceIntervalUpper: schema.number(),
|
|
610
|
+
alreadyCountedAbove: schema.number().int().nonnegative(),
|
|
611
|
+
});
|
|
612
|
+
export const rankedCohortSchema = defineResponseObject({
|
|
613
|
+
family: schema.string(),
|
|
614
|
+
pages: schema.number().int().nonnegative(),
|
|
615
|
+
notIndexed: schema.number().int().nonnegative(),
|
|
616
|
+
notIndexedPercent: schema.number(),
|
|
617
|
+
/** False means this family has NOT been shown to differ from the rest of the Site. */
|
|
618
|
+
statisticallyEstablished: schema.boolean(),
|
|
619
|
+
belowMinimumSample: schema.boolean(),
|
|
620
|
+
}, {
|
|
621
|
+
family: schema.string(),
|
|
622
|
+
pages: schema.number().int().nonnegative(),
|
|
623
|
+
notIndexed: schema.number().int().nonnegative(),
|
|
624
|
+
notIndexedPercent: schema.number(),
|
|
625
|
+
statisticallyEstablished: schema.boolean(),
|
|
626
|
+
belowMinimumSample: schema.boolean(),
|
|
627
|
+
});
|
|
628
|
+
const cohortBaselineShape = {
|
|
629
|
+
pages: schema.number().int().nonnegative(),
|
|
630
|
+
notIndexed: schema.number().int().nonnegative(),
|
|
631
|
+
notIndexedPercent: schema.number(),
|
|
632
|
+
};
|
|
633
|
+
const cohortCoverageShape = {
|
|
634
|
+
analysed: schema.number().int().nonnegative(),
|
|
635
|
+
notIndexedButNeverCrawled: schema.number().int().nonnegative(),
|
|
636
|
+
excludedFragments: schema.number().int().nonnegative(),
|
|
637
|
+
};
|
|
638
|
+
/**
|
|
639
|
+
* Two lists that mean different things and must never be merged.
|
|
640
|
+
* `established` holds only families whose Wilson score interval clears the
|
|
641
|
+
* not-indexed rate of their own complement after a Bonferroni correction; those
|
|
642
|
+
* are the only rows that may be reported as a finding. `ranked` orders every
|
|
643
|
+
* family by raw rate with no test applied, so it always answers "where is
|
|
644
|
+
* indexing worst" — a high rate there is a lead to verify, never a conclusion.
|
|
645
|
+
*/
|
|
646
|
+
export const indexCohortsDataSchema = defineResponseObject({
|
|
647
|
+
analysed: schema.boolean(),
|
|
648
|
+
reason: schema.string().nullable(),
|
|
649
|
+
message: schema.string().nullable(),
|
|
650
|
+
asOf: schema.string().nullable(),
|
|
651
|
+
baseline: schema.strictObject(cohortBaselineShape).nullable(),
|
|
652
|
+
coverage: schema.strictObject(cohortCoverageShape).nullable(),
|
|
653
|
+
method: schema.string().nullable(),
|
|
654
|
+
familiesTested: schema.number().int().nonnegative(),
|
|
655
|
+
established: schema.array(establishedCohortSchema.producer),
|
|
656
|
+
establishedNote: schema.string().nullable(),
|
|
657
|
+
ranked: schema.array(rankedCohortSchema.producer),
|
|
658
|
+
rankedTotal: schema.number().int().nonnegative(),
|
|
659
|
+
minSectionPages: schema.number().int().positive(),
|
|
660
|
+
}, {
|
|
661
|
+
analysed: schema.boolean(),
|
|
662
|
+
reason: schema.string().nullable(),
|
|
663
|
+
message: schema.string().nullable(),
|
|
664
|
+
asOf: schema.string().nullable(),
|
|
665
|
+
baseline: schema.looseObject(cohortBaselineShape).nullable(),
|
|
666
|
+
coverage: schema.looseObject(cohortCoverageShape).nullable(),
|
|
667
|
+
method: schema.string().nullable(),
|
|
668
|
+
familiesTested: schema.number().int().nonnegative(),
|
|
669
|
+
established: schema.array(establishedCohortSchema.client),
|
|
670
|
+
establishedNote: schema.string().nullable(),
|
|
671
|
+
ranked: schema.array(rankedCohortSchema.client),
|
|
672
|
+
rankedTotal: schema.number().int().nonnegative(),
|
|
673
|
+
minSectionPages: schema.number().int().positive(),
|
|
674
|
+
});
|
|
675
|
+
export const indexCohortsResponseEnvelopeSchema = defineSuccessEnvelope(indexCohortsDataSchema);
|
|
676
|
+
export const indexCohortsReadOperation = defineOperation({
|
|
677
|
+
id: 'sites.search.indexing.cohorts.read',
|
|
678
|
+
method: 'GET',
|
|
679
|
+
path: '/api/v1/sites/{siteId}/search/indexing/cohorts',
|
|
680
|
+
visibility: 'public',
|
|
681
|
+
semantics: { kind: 'query', sideEffects: 'none', retry: 'idempotent', readConsistency: 'primary' },
|
|
682
|
+
auth: {
|
|
683
|
+
credentials: ['session', 'api_token'],
|
|
684
|
+
scopes: ['sites:read'],
|
|
685
|
+
minimumRole: 'viewer',
|
|
686
|
+
ownership: 'site',
|
|
687
|
+
},
|
|
688
|
+
request: { params: searchConsoleSiteParamsSchema, query: indexCohortsQuerySchema, headers: null, body: null },
|
|
689
|
+
responses: { 200: indexCohortsResponseEnvelopeSchema },
|
|
690
|
+
// The same list every other Search read declares: this operation enforces the
|
|
691
|
+
// `search.collect_interactive` monitoring fence, whose denials present as
|
|
692
|
+
// `entitlement_required` and `conflict`.
|
|
693
|
+
// A pure D1 read: it cannot fail on a provider or on stale evidence, so it
|
|
694
|
+
// does not inherit this feature's shared read errors.
|
|
695
|
+
errors: [
|
|
696
|
+
'invalid_request',
|
|
697
|
+
'unauthorized',
|
|
698
|
+
'auth_expired',
|
|
699
|
+
'forbidden',
|
|
700
|
+
'not_found',
|
|
701
|
+
'entitlement_required',
|
|
702
|
+
'conflict',
|
|
703
|
+
'rate_limited',
|
|
704
|
+
'contract_violation',
|
|
705
|
+
'internal_error',
|
|
706
|
+
],
|
|
707
|
+
errorResponse: publicV1ErrorEnvelope,
|
|
708
|
+
resources: { reads: [{ type: 'site.collection', idFrom: 'params.siteId' }], changes: [] },
|
|
709
|
+
policy: {
|
|
710
|
+
rate: publicV1StandardRatePolicy,
|
|
711
|
+
idempotency: { _tag: 'none' },
|
|
712
|
+
entitlement: null,
|
|
713
|
+
meter: null,
|
|
714
|
+
},
|
|
715
|
+
lifecycle: { introduced: '1.2.0' },
|
|
716
|
+
docs: {
|
|
717
|
+
summary: 'Read indexing by route family',
|
|
718
|
+
description: 'Returns the not-indexed rate per route family, joined from the Site crawl to Google per-URL index state, so an indexing failure that clusters in one template surfaces as one finding instead of many page-level ones. Read it before listing individual not-indexed URLs. `established` holds only families proven worse than the rest of the Site after a Bonferroni correction; `ranked` orders every family by raw rate with no test applied and is leads only. `analysed: false` means there is no completed crawl or no index state to join, which is not the same as healthy indexing.',
|
|
719
|
+
tags: ['Search Console'],
|
|
720
|
+
examples: [{
|
|
721
|
+
request: { params: { siteId: 'site_01JXYZ' }, query: { limit: 12, minSectionPages: 5 } },
|
|
722
|
+
response: {
|
|
723
|
+
status: 200,
|
|
724
|
+
body: {
|
|
725
|
+
data: {
|
|
726
|
+
analysed: true,
|
|
727
|
+
reason: null,
|
|
728
|
+
message: null,
|
|
729
|
+
asOf: '2026-09-01T00:00:00.000Z',
|
|
730
|
+
baseline: { pages: 1200, notIndexed: 180, notIndexedPercent: 15 },
|
|
731
|
+
coverage: { analysed: 1200, notIndexedButNeverCrawled: 40, excludedFragments: 2 },
|
|
732
|
+
method: 'Wilson score interval per family against its own complement, Bonferroni-corrected across 9 tested families (critical value z=2.77).',
|
|
733
|
+
familiesTested: 9,
|
|
734
|
+
established: [{
|
|
735
|
+
family: '/docs',
|
|
736
|
+
dimension: 'depth-1',
|
|
737
|
+
pathPrefix: '/docs',
|
|
738
|
+
pages: 420,
|
|
739
|
+
notIndexed: 150,
|
|
740
|
+
notIndexedPercent: 35.7,
|
|
741
|
+
restOfSitePercent: 3.8,
|
|
742
|
+
restOfSitePages: 780,
|
|
743
|
+
confidenceIntervalLower: 31.2,
|
|
744
|
+
confidenceIntervalUpper: 40.4,
|
|
745
|
+
alreadyCountedAbove: 0,
|
|
746
|
+
}],
|
|
747
|
+
establishedNote: null,
|
|
748
|
+
ranked: [{
|
|
749
|
+
family: '/docs',
|
|
750
|
+
pages: 420,
|
|
751
|
+
notIndexed: 150,
|
|
752
|
+
notIndexedPercent: 35.7,
|
|
753
|
+
statisticallyEstablished: true,
|
|
754
|
+
belowMinimumSample: false,
|
|
755
|
+
}],
|
|
756
|
+
rankedTotal: 9,
|
|
757
|
+
minSectionPages: 5,
|
|
758
|
+
},
|
|
759
|
+
meta: { requestId: 'req_01JXYZ', version: '1.0' },
|
|
760
|
+
},
|
|
761
|
+
},
|
|
762
|
+
}],
|
|
763
|
+
},
|
|
764
|
+
});
|
|
547
765
|
export const searchV1Registry = defineRegistry({
|
|
548
766
|
feature: 'sites',
|
|
549
767
|
operations: {
|
|
@@ -552,5 +770,6 @@ export const searchV1Registry = defineRegistry({
|
|
|
552
770
|
readIndexingDiagnostics: indexingDiagnosticsReadOperation,
|
|
553
771
|
readIndexingHistory: indexingHistoryReadOperation,
|
|
554
772
|
readUrlInspection: urlInspectionReadOperation,
|
|
773
|
+
readIndexingCohorts: indexCohortsReadOperation,
|
|
555
774
|
},
|
|
556
775
|
});
|