@archont561/qgis-sdk-bridge 0.1.1 → 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/README.md +35 -23
- package/dist/bridge.d.ts +205 -0
- package/dist/bridge.js +32 -0
- package/dist/host.d.ts +157 -0
- package/dist/host.js +433 -0
- package/dist/index.d.ts +22 -1
- package/dist/index.js +28 -160
- package/dist/react.d.ts +217 -0
- package/dist/react.js +196 -0
- package/dist/shared/chunk-0fknax6w.js +207 -0
- package/dist/shared/chunk-a7bjgeve.js +422 -0
- package/dist/testing.d.ts +109 -0
- package/dist/testing.js +323 -0
- package/package.json +29 -1
package/dist/host.js
ADDED
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
// src/generated/host.ts
|
|
2
|
+
var HOST_ID = "qgis.host";
|
|
3
|
+
var HOST_FINGERPRINT = "sha256:f96bdf1046434de3c5eae01efb34c8ad2bcd1cf241a3dc42f6c4b613dc7d7d6f";
|
|
4
|
+
var HOST_SCHEMA_VERSION = 1;
|
|
5
|
+
var HOST_OPERATIONS = [
|
|
6
|
+
"files.export",
|
|
7
|
+
"layers.get",
|
|
8
|
+
"layers.list",
|
|
9
|
+
"layers.open_vector",
|
|
10
|
+
"network.fetch",
|
|
11
|
+
"notifications.info",
|
|
12
|
+
"project.layer_ids",
|
|
13
|
+
"settings.get",
|
|
14
|
+
"styles.apply"
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
class HostContractError extends Error {
|
|
18
|
+
operation;
|
|
19
|
+
constructor(operation, message) {
|
|
20
|
+
super(`operation "${operation}": ${message}`);
|
|
21
|
+
this.name = "HostContractError";
|
|
22
|
+
this.operation = operation;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function isRecord(value) {
|
|
26
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
function hasOnly(value, keys) {
|
|
29
|
+
return Object.keys(value).every((key) => keys.includes(key));
|
|
30
|
+
}
|
|
31
|
+
function isSafeInteger(value) {
|
|
32
|
+
return typeof value === "number" && Number.isSafeInteger(value);
|
|
33
|
+
}
|
|
34
|
+
function ExportRequest(value, strict = false) {
|
|
35
|
+
if (!isRecord(value))
|
|
36
|
+
return false;
|
|
37
|
+
if (!("file" in value))
|
|
38
|
+
return false;
|
|
39
|
+
if (!("content" in value))
|
|
40
|
+
return false;
|
|
41
|
+
if (value["content"] !== undefined && !(typeof value["content"] === "string")) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (value["file"] !== undefined && !FileRef(value["file"], strict)) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
if (strict && !hasOnly(value, ["content", "file"]))
|
|
48
|
+
return false;
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
function ExportResult(value, strict = false) {
|
|
52
|
+
if (!isRecord(value))
|
|
53
|
+
return false;
|
|
54
|
+
if (!("bytes_written" in value))
|
|
55
|
+
return false;
|
|
56
|
+
if (!("name" in value))
|
|
57
|
+
return false;
|
|
58
|
+
if (value["bytes_written"] !== undefined && !isSafeInteger(value["bytes_written"])) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (strict && !hasOnly(value, ["bytes_written", "name"]))
|
|
65
|
+
return false;
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
function FetchRequest(value, strict = false) {
|
|
69
|
+
if (!isRecord(value))
|
|
70
|
+
return false;
|
|
71
|
+
if (!("url" in value))
|
|
72
|
+
return false;
|
|
73
|
+
if (value["auth_config"] !== undefined && !(typeof value["auth_config"] === "string")) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if (value["body"] !== undefined && !(typeof value["body"] === "string")) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
if (value["headers"] !== undefined && !(Array.isArray(value["headers"]) && value["headers"].every((item) => HttpHeader(item, strict)))) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
if (value["method"] !== undefined && !(value["method"] === "GET" || value["method"] === "HEAD" || value["method"] === "POST" || value["method"] === "PUT" || value["method"] === "PATCH" || value["method"] === "DELETE" || value["method"] === "OPTIONS")) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
if (value["timeout_seconds"] !== undefined && !(typeof value["timeout_seconds"] === "number" && Number.isFinite(value["timeout_seconds"]) && value["timeout_seconds"] >= 0.1 && value["timeout_seconds"] <= 300)) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
if (value["url"] !== undefined && !(typeof value["url"] === "string")) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (strict && !hasOnly(value, ["auth_config", "body", "headers", "method", "timeout_seconds", "url"]))
|
|
92
|
+
return false;
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
function FileRef(value, strict = false) {
|
|
96
|
+
if (!isRecord(value))
|
|
97
|
+
return false;
|
|
98
|
+
if (!("kind" in value))
|
|
99
|
+
return false;
|
|
100
|
+
if (!("id" in value))
|
|
101
|
+
return false;
|
|
102
|
+
if (value["id"] !== undefined && !(typeof value["id"] === "string" && new RegExp("^(?:[a-f0-9]{16,64})$").test(value["id"]))) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
if (value["kind"] !== undefined && !(value["kind"] === "file")) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
if (value["operations"] !== undefined && !(Array.isArray(value["operations"]) && value["operations"].every((item) => item === "read" || item === "write"))) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
if (strict && !hasOnly(value, ["id", "kind", "name", "operations"]))
|
|
115
|
+
return false;
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
function HttpHeader(value, strict = false) {
|
|
119
|
+
if (!isRecord(value))
|
|
120
|
+
return false;
|
|
121
|
+
if (!("name" in value))
|
|
122
|
+
return false;
|
|
123
|
+
if (!("value" in value))
|
|
124
|
+
return false;
|
|
125
|
+
if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
if (value["value"] !== undefined && !(typeof value["value"] === "string")) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
if (strict && !hasOnly(value, ["name", "value"]))
|
|
132
|
+
return false;
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
function IdPage(value, strict = false) {
|
|
136
|
+
if (!isRecord(value))
|
|
137
|
+
return false;
|
|
138
|
+
if (!("items" in value))
|
|
139
|
+
return false;
|
|
140
|
+
if (!("truncated" in value))
|
|
141
|
+
return false;
|
|
142
|
+
if (value["items"] !== undefined && !(Array.isArray(value["items"]) && value["items"].every((item) => typeof item === "string"))) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
if (value["next_cursor"] !== undefined && !(typeof value["next_cursor"] === "string")) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
if (value["truncated"] !== undefined && !(typeof value["truncated"] === "boolean")) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
if (strict && !hasOnly(value, ["items", "next_cursor", "truncated"]))
|
|
152
|
+
return false;
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
function LayerPage(value, strict = false) {
|
|
156
|
+
if (!isRecord(value))
|
|
157
|
+
return false;
|
|
158
|
+
if (!("items" in value))
|
|
159
|
+
return false;
|
|
160
|
+
if (!("truncated" in value))
|
|
161
|
+
return false;
|
|
162
|
+
if (value["items"] !== undefined && !(Array.isArray(value["items"]) && value["items"].every((item) => VectorLayerInfo(item, strict)))) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
if (value["next_cursor"] !== undefined && !(typeof value["next_cursor"] === "string")) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
if (value["truncated"] !== undefined && !(typeof value["truncated"] === "boolean")) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
if (strict && !hasOnly(value, ["items", "next_cursor", "truncated"]))
|
|
172
|
+
return false;
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
function LayerRequest(value, strict = false) {
|
|
176
|
+
if (!isRecord(value))
|
|
177
|
+
return false;
|
|
178
|
+
if (!("layer_id" in value))
|
|
179
|
+
return false;
|
|
180
|
+
if (value["layer_id"] !== undefined && !(typeof value["layer_id"] === "string")) {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
if (strict && !hasOnly(value, ["layer_id"]))
|
|
184
|
+
return false;
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
function NetworkFetchData(value, strict = false) {
|
|
188
|
+
if (!isRecord(value))
|
|
189
|
+
return false;
|
|
190
|
+
if (!("url" in value))
|
|
191
|
+
return false;
|
|
192
|
+
if (!("status_code" in value))
|
|
193
|
+
return false;
|
|
194
|
+
if (!("reason" in value))
|
|
195
|
+
return false;
|
|
196
|
+
if (!("headers" in value))
|
|
197
|
+
return false;
|
|
198
|
+
if (!("text" in value))
|
|
199
|
+
return false;
|
|
200
|
+
if (!("base64" in value))
|
|
201
|
+
return false;
|
|
202
|
+
if (value["base64"] !== undefined && !(typeof value["base64"] === "string" || value["base64"] === null)) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
if (value["headers"] !== undefined && !(Array.isArray(value["headers"]) && value["headers"].every((item) => HttpHeader(item, strict)))) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
if (value["reason"] !== undefined && !(typeof value["reason"] === "string")) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
if (value["status_code"] !== undefined && !isSafeInteger(value["status_code"])) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
if (value["text"] !== undefined && !(typeof value["text"] === "string" || value["text"] === null)) {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
if (value["url"] !== undefined && !(typeof value["url"] === "string")) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
if (strict && !hasOnly(value, ["base64", "headers", "reason", "status_code", "text", "url"]))
|
|
221
|
+
return false;
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
function NotificationsInfoRequest(value, strict = false) {
|
|
225
|
+
if (!isRecord(value))
|
|
226
|
+
return false;
|
|
227
|
+
if (!("message" in value))
|
|
228
|
+
return false;
|
|
229
|
+
if (value["message"] !== undefined && !(typeof value["message"] === "string")) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
if (strict && !hasOnly(value, ["message"]))
|
|
233
|
+
return false;
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
function OpenVectorRequest(value, strict = false) {
|
|
237
|
+
if (!isRecord(value))
|
|
238
|
+
return false;
|
|
239
|
+
if (!("file" in value))
|
|
240
|
+
return false;
|
|
241
|
+
if (value["file"] !== undefined && !FileRef(value["file"], strict)) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
if (strict && !hasOnly(value, ["file"]))
|
|
245
|
+
return false;
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
function PageRequest(value, strict = false) {
|
|
249
|
+
if (!isRecord(value))
|
|
250
|
+
return false;
|
|
251
|
+
if (value["cursor"] !== undefined && !(typeof value["cursor"] === "string" && new RegExp("^(?:[0-9]+)$").test(value["cursor"]))) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
if (value["limit"] !== undefined && !(isSafeInteger(value["limit"]) && value["limit"] >= 1 && value["limit"] <= 200)) {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
if (strict && !hasOnly(value, ["cursor", "limit"]))
|
|
258
|
+
return false;
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
function SettingsGetRequest(value, strict = false) {
|
|
262
|
+
if (!isRecord(value))
|
|
263
|
+
return false;
|
|
264
|
+
if (!("key" in value))
|
|
265
|
+
return false;
|
|
266
|
+
if (value["default"] !== undefined && !(typeof value["default"] === "string" || value["default"] === null)) {
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
if (value["key"] !== undefined && !(typeof value["key"] === "string")) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
if (strict && !hasOnly(value, ["default", "key"]))
|
|
273
|
+
return false;
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
function StylesApplyRequest(value, strict = false) {
|
|
277
|
+
if (!isRecord(value))
|
|
278
|
+
return false;
|
|
279
|
+
if (!("layer_id" in value))
|
|
280
|
+
return false;
|
|
281
|
+
if (!("style" in value))
|
|
282
|
+
return false;
|
|
283
|
+
if (value["layer_id"] !== undefined && !(typeof value["layer_id"] === "string")) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
if (value["style"] !== undefined && !(typeof value["style"] === "string")) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
if (strict && !hasOnly(value, ["layer_id", "style"]))
|
|
290
|
+
return false;
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
function VectorLayerInfo(value, strict = false) {
|
|
294
|
+
if (!isRecord(value))
|
|
295
|
+
return false;
|
|
296
|
+
if (!("id" in value))
|
|
297
|
+
return false;
|
|
298
|
+
if (!("name" in value))
|
|
299
|
+
return false;
|
|
300
|
+
if (!("geometry_type" in value))
|
|
301
|
+
return false;
|
|
302
|
+
if (!("field_names" in value))
|
|
303
|
+
return false;
|
|
304
|
+
if (!("crs" in value))
|
|
305
|
+
return false;
|
|
306
|
+
if (value["crs"] !== undefined && !(typeof value["crs"] === "string" || value["crs"] === null)) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
if (value["field_names"] !== undefined && !(Array.isArray(value["field_names"]) && value["field_names"].every((item) => typeof item === "string"))) {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
if (value["geometry_type"] !== undefined && !(value["geometry_type"] === "point" || value["geometry_type"] === "line" || value["geometry_type"] === "polygon" || value["geometry_type"] === "none")) {
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
if (value["id"] !== undefined && !(typeof value["id"] === "string")) {
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
if (strict && !hasOnly(value, ["crs", "field_names", "geometry_type", "id", "name"]))
|
|
322
|
+
return false;
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
function NetworkFetchEvent(value, strict = false) {
|
|
326
|
+
if (!isRecord(value))
|
|
327
|
+
return false;
|
|
328
|
+
if (value.kind === "data")
|
|
329
|
+
return NetworkFetchData(value.payload, strict);
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
function createHost(client) {
|
|
333
|
+
return {
|
|
334
|
+
files: {
|
|
335
|
+
export: (input, options) => call(client, "files.export", input, options, ExportRequest, ExportResult)
|
|
336
|
+
},
|
|
337
|
+
layers: {
|
|
338
|
+
get: (input, options) => call(client, "layers.get", input, options, LayerRequest, VectorLayerInfo),
|
|
339
|
+
list: (input, options) => call(client, "layers.list", input, options, PageRequest, LayerPage),
|
|
340
|
+
open_vector: (input, options) => call(client, "layers.open_vector", input, options, OpenVectorRequest, VectorLayerInfo)
|
|
341
|
+
},
|
|
342
|
+
network: {
|
|
343
|
+
fetch: (input, handlers, options) => open(client, "network.fetch", input, handlers, options, FetchRequest, NetworkFetchEvent)
|
|
344
|
+
},
|
|
345
|
+
notifications: {
|
|
346
|
+
info: (input, options) => call(client, "notifications.info", input, options, NotificationsInfoRequest, (candidate) => candidate === null)
|
|
347
|
+
},
|
|
348
|
+
project: {
|
|
349
|
+
layer_ids: (input, options) => call(client, "project.layer_ids", input, options, PageRequest, IdPage)
|
|
350
|
+
},
|
|
351
|
+
settings: {
|
|
352
|
+
get: (input, options) => call(client, "settings.get", input, options, SettingsGetRequest, (candidate) => typeof candidate === "string" || candidate === null)
|
|
353
|
+
},
|
|
354
|
+
styles: {
|
|
355
|
+
apply: (input, options) => call(client, "styles.apply", input, options, StylesApplyRequest, (candidate) => candidate === null)
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
async function call(client, operation, input, options, acceptInput, acceptOutput) {
|
|
360
|
+
if (input !== undefined && !acceptInput(input, true)) {
|
|
361
|
+
throw new HostContractError(operation, "the arguments do not match the declared request");
|
|
362
|
+
}
|
|
363
|
+
const value = await client.invoke(operation, input ?? {}, options);
|
|
364
|
+
if (!acceptOutput(value)) {
|
|
365
|
+
throw new HostContractError(operation, "the response does not match the declared result");
|
|
366
|
+
}
|
|
367
|
+
return value;
|
|
368
|
+
}
|
|
369
|
+
async function open(client, operation, input, handlers, options, acceptInput, acceptEvent) {
|
|
370
|
+
if (!acceptInput(input, true)) {
|
|
371
|
+
throw new HostContractError(operation, "the arguments do not match the declared request");
|
|
372
|
+
}
|
|
373
|
+
let ended = false;
|
|
374
|
+
let violated = false;
|
|
375
|
+
let handle = null;
|
|
376
|
+
const end = (terminal) => {
|
|
377
|
+
if (ended)
|
|
378
|
+
return;
|
|
379
|
+
ended = true;
|
|
380
|
+
handlers.onTerminal?.(terminal);
|
|
381
|
+
};
|
|
382
|
+
handle = await client.subscribe(operation, input, {
|
|
383
|
+
onEvent: (event) => {
|
|
384
|
+
if (ended)
|
|
385
|
+
return;
|
|
386
|
+
if (acceptEvent(event)) {
|
|
387
|
+
handlers.onEvent?.(event);
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
end({
|
|
391
|
+
kind: "error",
|
|
392
|
+
message: new HostContractError(operation, "an event does not match the declared events").message
|
|
393
|
+
});
|
|
394
|
+
if (handle === null) {
|
|
395
|
+
violated = true;
|
|
396
|
+
} else {
|
|
397
|
+
handle.close();
|
|
398
|
+
}
|
|
399
|
+
},
|
|
400
|
+
onTerminal: end
|
|
401
|
+
}, options);
|
|
402
|
+
if (violated) {
|
|
403
|
+
handle.close();
|
|
404
|
+
}
|
|
405
|
+
return handle;
|
|
406
|
+
}
|
|
407
|
+
export {
|
|
408
|
+
ExportRequest,
|
|
409
|
+
ExportResult,
|
|
410
|
+
FetchRequest,
|
|
411
|
+
FileRef,
|
|
412
|
+
HOST_FINGERPRINT,
|
|
413
|
+
HOST_ID,
|
|
414
|
+
HOST_OPERATIONS,
|
|
415
|
+
HOST_SCHEMA_VERSION,
|
|
416
|
+
HostContractError,
|
|
417
|
+
HttpHeader,
|
|
418
|
+
IdPage,
|
|
419
|
+
LayerPage,
|
|
420
|
+
LayerRequest,
|
|
421
|
+
NetworkFetchData,
|
|
422
|
+
NetworkFetchEvent,
|
|
423
|
+
NotificationsInfoRequest,
|
|
424
|
+
OpenVectorRequest,
|
|
425
|
+
PageRequest,
|
|
426
|
+
SettingsGetRequest,
|
|
427
|
+
StylesApplyRequest,
|
|
428
|
+
VectorLayerInfo,
|
|
429
|
+
createHost
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
//# debugId=EF165F591C75829964756E2164756E21
|
|
433
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2dlbmVyYXRlZC9ob3N0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8vIEdlbmVyYXRlZCBieSBxZ2lzLXNkay4gRG8gbm90IGVkaXQuXG4vLyBTb3VyY2U6IHRoZSBjdXJhdGVkIGhvc3QgbWFuaWZlc3QgaW4gcWdpc19zZGsuYnJpZGdlLmhvc3QuXG4vLyBSZWdlbmVyYXRlIHdpdGggYHFnaXMtc2RrIGJyaWRnZSBnZW5lcmF0ZSAtLWhvc3RgOyBDSSBmYWlscyBvbiBkcmlmdC5cblxuZXhwb3J0IGNvbnN0IEhPU1RfSUQgPSBcInFnaXMuaG9zdFwiO1xuZXhwb3J0IGNvbnN0IEhPU1RfRklOR0VSUFJJTlQgPSBcInNoYTI1NjpmOTZiZGYxMDQ2NDM0ZGUzYzVlYWUwMWVmYjM0YzhhZDJiY2QxY2YyNDFhM2RjNDJmNmM0YjYxM2RjN2Q3ZDZmXCI7XG5leHBvcnQgY29uc3QgSE9TVF9TQ0hFTUFfVkVSU0lPTiA9IDE7XG5cbi8qKiBFdmVyeSBkZWNsYXJlZCBvcGVyYXRpb24gaWQsIHNvIGEgbmFtZSBjYW4gYmUgY2hlY2tlZCwgbm90IGd1ZXNzZWQuICovXG5leHBvcnQgY29uc3QgSE9TVF9PUEVSQVRJT05TID0gW1xuXHRcImZpbGVzLmV4cG9ydFwiLFxuXHRcImxheWVycy5nZXRcIixcblx0XCJsYXllcnMubGlzdFwiLFxuXHRcImxheWVycy5vcGVuX3ZlY3RvclwiLFxuXHRcIm5ldHdvcmsuZmV0Y2hcIixcblx0XCJub3RpZmljYXRpb25zLmluZm9cIixcblx0XCJwcm9qZWN0LmxheWVyX2lkc1wiLFxuXHRcInNldHRpbmdzLmdldFwiLFxuXHRcInN0eWxlcy5hcHBseVwiLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgSG9zdE9wZXJhdGlvbklkID0gKHR5cGVvZiBIT1NUX09QRVJBVElPTlMpW251bWJlcl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdEludm9rZU9wdGlvbnMge1xuXHRyZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIFRoZSBjbGllbnQgdGhpcyBtb2R1bGUgd3JhcHM6IGFueXRoaW5nIHdpdGggYSBjb3JyZWxhdGVkIGludm9rZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdENsaWVudExpa2Uge1xuXHRpbnZva2UoXG5cdFx0b3BlcmF0aW9uOiBzdHJpbmcsXG5cdFx0cGF5bG9hZD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcblx0XHRvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMsXG5cdCk6IFByb21pc2U8dW5rbm93bj47XG5cdHN1YnNjcmliZShcblx0XHRvcGVyYXRpb246IHN0cmluZyxcblx0XHRwYXlsb2FkPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdGhhbmRsZXJzPzogSG9zdFN0cmVhbUhhbmRsZXJzPHtcblx0XHRcdHJlYWRvbmx5IGtpbmQ6IFwiZGF0YVwiIHwgXCJwcm9ncmVzc1wiIHwgXCJzdGF0ZVwiO1xuXHRcdFx0cmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcblx0XHR9Pixcblx0XHRvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMsXG5cdCk6IFByb21pc2U8SG9zdFN0cmVhbUhhbmRsZT47XG59XG5cbi8qKiBIb3cgYSBzdHJlYW0gZW5kZWQ7IGBkcm9wcGVkYCBpcyBvbmx5IHByZXNlbnQgZm9yIGEgZ2FwLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0U3RyZWFtVGVybWluYWwge1xuXHRyZWFkb25seSBraW5kOiBcImNvbXBsZXRlXCIgfCBcImVycm9yXCIgfCBcImNhbmNlbGxlZFwiIHwgXCJnYXBcIiB8IFwiZGlzcG9zZWRcIjtcblx0cmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblx0cmVhZG9ubHkgZHJvcHBlZD86IG51bWJlcjtcbn1cblxuLyoqIFdoYXQgYSBzdHJlYW0gcmVwb3J0czogdHlwZWQgZXZlbnRzLCB0aGVuIGV4YWN0bHkgb25lIGVuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdFN0cmVhbUhhbmRsZXJzPEU+IHtcblx0cmVhZG9ubHkgb25FdmVudD86IChldmVudDogRSkgPT4gdm9pZDtcblx0cmVhZG9ubHkgb25UZXJtaW5hbD86ICh0ZXJtaW5hbDogSG9zdFN0cmVhbVRlcm1pbmFsKSA9PiB2b2lkO1xufVxuXG4vKiogQSBsaXZlIHN0cmVhbSwgYXMgdGhlIGNhbGxlciBob2xkcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdFN0cmVhbUhhbmRsZSB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGNsb3NlZDogYm9vbGVhbjtcblx0Y2xvc2UoKTogdm9pZDtcbn1cblxuLyoqIEFuIGFyZ3VtZW50IG9yIGEgcmVzcG9uc2UgdGhhdCBkb2VzIG5vdCBtYXRjaCBpdHMgZGVjbGFyZWQgc2NoZW1hLiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RDb250cmFjdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvcGVyYXRpb246IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIoYG9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiOiAke21lc3NhZ2V9YCk7XG5cdFx0dGhpcy5uYW1lID0gXCJIb3N0Q29udHJhY3RFcnJvclwiO1xuXHRcdHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaGFzT25seShcblx0dmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRrZXlzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmV2ZXJ5KChrZXkpID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRSZXF1ZXN0IHtcblx0cmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXHRyZWFkb25seSBmaWxlOiBGaWxlUmVmO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFJlc3VsdCB7XG5cdHJlYWRvbmx5IGJ5dGVzX3dyaXR0ZW46IG51bWJlcjtcblx0cmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoUmVxdWVzdCB7XG5cdHJlYWRvbmx5IGF1dGhfY29uZmlnPzogc3RyaW5nO1xuXHRyZWFkb25seSBib2R5Pzogc3RyaW5nO1xuXHRyZWFkb25seSBoZWFkZXJzPzogcmVhZG9ubHkgSHR0cEhlYWRlcltdO1xuXHRyZWFkb25seSBtZXRob2Q/OiBcIkdFVFwiIHwgXCJIRUFEXCIgfCBcIlBPU1RcIiB8IFwiUFVUXCIgfCBcIlBBVENIXCIgfCBcIkRFTEVURVwiIHwgXCJPUFRJT05TXCI7XG5cdHJlYWRvbmx5IHRpbWVvdXRfc2Vjb25kcz86IG51bWJlcjtcblx0cmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlZiB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGtpbmQ6IFwiZmlsZVwiO1xuXHRyZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXHRyZWFkb25seSBvcGVyYXRpb25zPzogcmVhZG9ubHkgKFwicmVhZFwiIHwgXCJ3cml0ZVwiKVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBIZWFkZXIge1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRQYWdlIHtcblx0cmVhZG9ubHkgaXRlbXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHRyZWFkb25seSBuZXh0X2N1cnNvcj86IHN0cmluZztcblx0cmVhZG9ubHkgdHJ1bmNhdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheWVyUGFnZSB7XG5cdHJlYWRvbmx5IGl0ZW1zOiByZWFkb25seSBWZWN0b3JMYXllckluZm9bXTtcblx0cmVhZG9ubHkgbmV4dF9jdXJzb3I/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IHRydW5jYXRlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXllclJlcXVlc3Qge1xuXHRyZWFkb25seSBsYXllcl9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtGZXRjaERhdGEge1xuXHRyZWFkb25seSBiYXNlNjQ6IHN0cmluZyB8IG51bGw7XG5cdHJlYWRvbmx5IGhlYWRlcnM6IHJlYWRvbmx5IEh0dHBIZWFkZXJbXTtcblx0cmVhZG9ubHkgcmVhc29uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHN0YXR1c19jb2RlOiBudW1iZXI7XG5cdHJlYWRvbmx5IHRleHQ6IHN0cmluZyB8IG51bGw7XG5cdHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCB7XG5cdHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuVmVjdG9yUmVxdWVzdCB7XG5cdHJlYWRvbmx5IGZpbGU6IEZpbGVSZWY7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVJlcXVlc3Qge1xuXHRyZWFkb25seSBjdXJzb3I/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzR2V0UmVxdWVzdCB7XG5cdHJlYWRvbmx5IGRlZmF1bHQ/OiBzdHJpbmcgfCBudWxsO1xuXHRyZWFkb25seSBrZXk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHlsZXNBcHBseVJlcXVlc3Qge1xuXHRyZWFkb25seSBsYXllcl9pZDogc3RyaW5nO1xuXHRyZWFkb25seSBzdHlsZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvckxheWVySW5mbyB7XG5cdHJlYWRvbmx5IGNyczogc3RyaW5nIHwgbnVsbDtcblx0cmVhZG9ubHkgZmllbGRfbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHRyZWFkb25seSBnZW9tZXRyeV90eXBlOiBcInBvaW50XCIgfCBcImxpbmVcIiB8IFwicG9seWdvblwiIHwgXCJub25lXCI7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV4cG9ydFJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgRXhwb3J0UmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiZmlsZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImNvbnRlbnRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiY29udGVudFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wiY29udGVudFwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiZmlsZVwiXSAhPT0gdW5kZWZpbmVkICYmICEoRmlsZVJlZih2YWx1ZVtcImZpbGVcIl0sIHN0cmljdCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImNvbnRlbnRcIiwgXCJmaWxlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV4cG9ydFJlc3VsdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBFeHBvcnRSZXN1bHQge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImJ5dGVzX3dyaXR0ZW5cIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJuYW1lXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImJ5dGVzX3dyaXR0ZW5cIl0gIT09IHVuZGVmaW5lZCAmJiAhKGlzU2FmZUludGVnZXIodmFsdWVbXCJieXRlc193cml0dGVuXCJdKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiYnl0ZXNfd3JpdHRlblwiLCBcIm5hbWVcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRmV0Y2hSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIEZldGNoUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidXJsXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImF1dGhfY29uZmlnXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJhdXRoX2NvbmZpZ1wiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wiYm9keVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiaGVhZGVyc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJoZWFkZXJzXCJdKSAmJiB2YWx1ZVtcImhlYWRlcnNcIl0uZXZlcnkoKGl0ZW0pID0+IEh0dHBIZWFkZXIoaXRlbSwgc3RyaWN0KSkpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJtZXRob2RcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJHRVRcIiB8fCB2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJIRUFEXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiUE9TVFwiIHx8IHZhbHVlW1wibWV0aG9kXCJdID09PSBcIlBVVFwiIHx8IHZhbHVlW1wibWV0aG9kXCJdID09PSBcIlBBVENIXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiREVMRVRFXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiT1BUSU9OU1wiKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZVtcInRpbWVvdXRfc2Vjb25kc1wiXSkgJiYgdmFsdWVbXCJ0aW1lb3V0X3NlY29uZHNcIl0gPj0gMC4xICYmIHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdIDw9IDMwMCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInVybFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widXJsXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJhdXRoX2NvbmZpZ1wiLCBcImJvZHlcIiwgXCJoZWFkZXJzXCIsIFwibWV0aG9kXCIsIFwidGltZW91dF9zZWNvbmRzXCIsIFwidXJsXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZpbGVSZWYodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgRmlsZVJlZiB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwia2luZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImlkXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImlkXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJpZFwiXSA9PT0gXCJzdHJpbmdcIiAmJiBuZXcgUmVnRXhwKFwiXig/OlthLWYwLTldezE2LDY0fSkkXCIpLnRlc3QodmFsdWVbXCJpZFwiXSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImtpbmRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh2YWx1ZVtcImtpbmRcIl0gPT09IFwiZmlsZVwiKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wib3BlcmF0aW9uc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJvcGVyYXRpb25zXCJdKSAmJiB2YWx1ZVtcIm9wZXJhdGlvbnNcIl0uZXZlcnkoKGl0ZW0pID0+IChpdGVtID09PSBcInJlYWRcIiB8fCBpdGVtID09PSBcIndyaXRlXCIpKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImlkXCIsIFwia2luZFwiLCBcIm5hbWVcIiwgXCJvcGVyYXRpb25zXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEh0dHBIZWFkZXIodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgSHR0cEhlYWRlciB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibmFtZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInZhbHVlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcIm5hbWVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcIm5hbWVcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInZhbHVlXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJ2YWx1ZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wibmFtZVwiLCBcInZhbHVlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElkUGFnZSh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBJZFBhZ2Uge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIml0ZW1zXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidHJ1bmNhdGVkXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcIml0ZW1zXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcIml0ZW1zXCJdKSAmJiB2YWx1ZVtcIml0ZW1zXCJdLmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuZXh0X2N1cnNvclwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmV4dF9jdXJzb3JcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInRydW5jYXRlZFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widHJ1bmNhdGVkXCJdID09PSBcImJvb2xlYW5cIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiaXRlbXNcIiwgXCJuZXh0X2N1cnNvclwiLCBcInRydW5jYXRlZFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMYXllclBhZ2UodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgTGF5ZXJQYWdlIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJpdGVtc1wiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInRydW5jYXRlZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJpdGVtc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJpdGVtc1wiXSkgJiYgdmFsdWVbXCJpdGVtc1wiXS5ldmVyeSgoaXRlbSkgPT4gVmVjdG9yTGF5ZXJJbmZvKGl0ZW0sIHN0cmljdCkpKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmV4dF9jdXJzb3JcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcIm5leHRfY3Vyc29yXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJ0cnVuY2F0ZWRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcInRydW5jYXRlZFwiXSA9PT0gXCJib29sZWFuXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcIml0ZW1zXCIsIFwibmV4dF9jdXJzb3JcIiwgXCJ0cnVuY2F0ZWRcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTGF5ZXJSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIExheWVyUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibGF5ZXJfaWRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wibGF5ZXJfaWRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImxheWVyX2lkXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJsYXllcl9pZFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBOZXR3b3JrRmV0Y2hEYXRhKHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIE5ldHdvcmtGZXRjaERhdGEge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInVybFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInN0YXR1c19jb2RlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwicmVhc29uXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiaGVhZGVyc1wiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInRleHRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJiYXNlNjRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiYmFzZTY0XCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1wiYmFzZTY0XCJdID09PSBcInN0cmluZ1wiIHx8IHZhbHVlW1wiYmFzZTY0XCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiaGVhZGVyc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJoZWFkZXJzXCJdKSAmJiB2YWx1ZVtcImhlYWRlcnNcIl0uZXZlcnkoKGl0ZW0pID0+IEh0dHBIZWFkZXIoaXRlbSwgc3RyaWN0KSkpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJyZWFzb25cIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcInJlYXNvblwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wic3RhdHVzX2NvZGVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKGlzU2FmZUludGVnZXIodmFsdWVbXCJzdGF0dXNfY29kZVwiXSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInRleHRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh0eXBlb2YgdmFsdWVbXCJ0ZXh0XCJdID09PSBcInN0cmluZ1wiIHx8IHZhbHVlW1widGV4dFwiXSA9PT0gbnVsbCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInVybFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widXJsXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJiYXNlNjRcIiwgXCJoZWFkZXJzXCIsIFwicmVhc29uXCIsIFwic3RhdHVzX2NvZGVcIiwgXCJ0ZXh0XCIsIFwidXJsXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBOb3RpZmljYXRpb25zSW5mb1JlcXVlc3Qge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIm1lc3NhZ2VcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wibWVzc2FnZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibWVzc2FnZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wibWVzc2FnZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBPcGVuVmVjdG9yUmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBPcGVuVmVjdG9yUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiZmlsZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJmaWxlXCJdICE9PSB1bmRlZmluZWQgJiYgIShGaWxlUmVmKHZhbHVlW1wiZmlsZVwiXSwgc3RyaWN0KSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiZmlsZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQYWdlUmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBQYWdlUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImN1cnNvclwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wiY3Vyc29yXCJdID09PSBcInN0cmluZ1wiICYmIG5ldyBSZWdFeHAoXCJeKD86WzAtOV0rKSRcIikudGVzdCh2YWx1ZVtcImN1cnNvclwiXSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImxpbWl0XCJdICE9PSB1bmRlZmluZWQgJiYgISgoaXNTYWZlSW50ZWdlcih2YWx1ZVtcImxpbWl0XCJdKSAmJiB2YWx1ZVtcImxpbWl0XCJdID49IDEgJiYgdmFsdWVbXCJsaW1pdFwiXSA8PSAyMDApKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJjdXJzb3JcIiwgXCJsaW1pdFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTZXR0aW5nc0dldFJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgU2V0dGluZ3NHZXRSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJrZXlcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiZGVmYXVsdFwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHR5cGVvZiB2YWx1ZVtcImRlZmF1bHRcIl0gPT09IFwic3RyaW5nXCIgfHwgdmFsdWVbXCJkZWZhdWx0XCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wia2V5XCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJrZXlcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImRlZmF1bHRcIiwgXCJrZXlcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gU3R5bGVzQXBwbHlSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIFN0eWxlc0FwcGx5UmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibGF5ZXJfaWRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJzdHlsZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJsYXllcl9pZFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibGF5ZXJfaWRcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInN0eWxlXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJzdHlsZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wibGF5ZXJfaWRcIiwgXCJzdHlsZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBWZWN0b3JMYXllckluZm8odmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgVmVjdG9yTGF5ZXJJbmZvIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJpZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIm5hbWVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJnZW9tZXRyeV90eXBlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiZmllbGRfbmFtZXNcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJjcnNcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiY3JzXCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1wiY3JzXCJdID09PSBcInN0cmluZ1wiIHx8IHZhbHVlW1wiY3JzXCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiZmllbGRfbmFtZXNcIl0gIT09IHVuZGVmaW5lZCAmJiAhKChBcnJheS5pc0FycmF5KHZhbHVlW1wiZmllbGRfbmFtZXNcIl0pICYmIHZhbHVlW1wiZmllbGRfbmFtZXNcIl0uZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gPT09IFwicG9pbnRcIiB8fCB2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gPT09IFwibGluZVwiIHx8IHZhbHVlW1wiZ2VvbWV0cnlfdHlwZVwiXSA9PT0gXCJwb2x5Z29uXCIgfHwgdmFsdWVbXCJnZW9tZXRyeV90eXBlXCJdID09PSBcIm5vbmVcIikpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImlkXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJpZFwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiY3JzXCIsIFwiZmllbGRfbmFtZXNcIiwgXCJnZW9tZXRyeV90eXBlXCIsIFwiaWRcIiwgXCJuYW1lXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIE9uZSBldmVudCBvZiBgbmV0d29yay5mZXRjaGAsIG5hcnJvd2VkIGJ5IGl0cyBraW5kLiAqL1xuZXhwb3J0IHR5cGUgTmV0d29ya0ZldGNoRXZlbnQgPVxuXHR8IHsgcmVhZG9ubHkga2luZDogXCJkYXRhXCI7IHJlYWRvbmx5IHBheWxvYWQ6IE5ldHdvcmtGZXRjaERhdGEgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5ldHdvcmtGZXRjaEV2ZW50KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIE5ldHdvcmtGZXRjaEV2ZW50IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlLmtpbmQgPT09IFwiZGF0YVwiKSByZXR1cm4gTmV0d29ya0ZldGNoRGF0YSh2YWx1ZS5wYXlsb2FkLCBzdHJpY3QpO1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBFdmVyeSBvcGVyYXRpb24gdGhpcyBzdXJmYWNlIGRlY2xhcmVzLCBhcyBjYWxsYWJsZSBtZXRob2RzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0T3BlcmF0aW9ucyB7XG5cdHJlYWRvbmx5IGZpbGVzOiB7XG5cdFx0cmVhZG9ubHkgZXhwb3J0OiAoaW5wdXQ6IEV4cG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxFeHBvcnRSZXN1bHQ+O1xuXHR9O1xuXHRyZWFkb25seSBsYXllcnM6IHtcblx0XHRyZWFkb25seSBnZXQ6IChpbnB1dDogTGF5ZXJSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8VmVjdG9yTGF5ZXJJbmZvPjtcblx0XHRyZWFkb25seSBsaXN0OiAoaW5wdXQ/OiBQYWdlUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPExheWVyUGFnZT47XG5cdFx0cmVhZG9ubHkgb3Blbl92ZWN0b3I6IChpbnB1dDogT3BlblZlY3RvclJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxWZWN0b3JMYXllckluZm8+O1xuXHR9O1xuXHRyZWFkb25seSBuZXR3b3JrOiB7XG5cdFx0cmVhZG9ubHkgZmV0Y2g6IChpbnB1dDogRmV0Y2hSZXF1ZXN0LCBoYW5kbGVyczogSG9zdFN0cmVhbUhhbmRsZXJzPE5ldHdvcmtGZXRjaEV2ZW50Piwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPEhvc3RTdHJlYW1IYW5kbGU+O1xuXHR9O1xuXHRyZWFkb25seSBub3RpZmljYXRpb25zOiB7XG5cdFx0cmVhZG9ubHkgaW5mbzogKGlucHV0OiBOb3RpZmljYXRpb25zSW5mb1JlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxudWxsPjtcblx0fTtcblx0cmVhZG9ubHkgcHJvamVjdDoge1xuXHRcdHJlYWRvbmx5IGxheWVyX2lkczogKGlucHV0PzogUGFnZVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxJZFBhZ2U+O1xuXHR9O1xuXHRyZWFkb25seSBzZXR0aW5nczoge1xuXHRcdHJlYWRvbmx5IGdldDogKGlucHV0OiBTZXR0aW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcblx0fTtcblx0cmVhZG9ubHkgc3R5bGVzOiB7XG5cdFx0cmVhZG9ubHkgYXBwbHk6IChpbnB1dDogU3R5bGVzQXBwbHlSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8bnVsbD47XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIb3N0KGNsaWVudDogSG9zdENsaWVudExpa2UpOiBIb3N0T3BlcmF0aW9ucyB7XG5cdHJldHVybiB7XG5cdFx0ZmlsZXM6IHtcblx0XHRcdGV4cG9ydDogKGlucHV0OiBFeHBvcnRSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8RXhwb3J0UmVzdWx0Pihcblx0XHRcdFx0XHRjbGllbnQsIFwiZmlsZXMuZXhwb3J0XCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdEV4cG9ydFJlcXVlc3QsXG5cdFx0XHRcdFx0RXhwb3J0UmVzdWx0LFxuXHRcdFx0XHQpLFxuXHRcdH0sXG5cdFx0bGF5ZXJzOiB7XG5cdFx0XHRnZXQ6IChpbnB1dDogTGF5ZXJSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8VmVjdG9yTGF5ZXJJbmZvPihcblx0XHRcdFx0XHRjbGllbnQsIFwibGF5ZXJzLmdldFwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRMYXllclJlcXVlc3QsXG5cdFx0XHRcdFx0VmVjdG9yTGF5ZXJJbmZvLFxuXHRcdFx0XHQpLFxuXHRcdFx0bGlzdDogKGlucHV0PzogUGFnZVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0Y2FsbDxMYXllclBhZ2U+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJsYXllcnMubGlzdFwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRQYWdlUmVxdWVzdCxcblx0XHRcdFx0XHRMYXllclBhZ2UsXG5cdFx0XHRcdCksXG5cdFx0XHRvcGVuX3ZlY3RvcjogKGlucHV0OiBPcGVuVmVjdG9yUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPFZlY3RvckxheWVySW5mbz4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcImxheWVycy5vcGVuX3ZlY3RvclwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRPcGVuVmVjdG9yUmVxdWVzdCxcblx0XHRcdFx0XHRWZWN0b3JMYXllckluZm8sXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRuZXR3b3JrOiB7XG5cdFx0XHRmZXRjaDogKGlucHV0OiBGZXRjaFJlcXVlc3QsIGhhbmRsZXJzOiBIb3N0U3RyZWFtSGFuZGxlcnM8TmV0d29ya0ZldGNoRXZlbnQ+LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdG9wZW48TmV0d29ya0ZldGNoRXZlbnQ+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJuZXR3b3JrLmZldGNoXCIsIGlucHV0LCBoYW5kbGVycywgb3B0aW9ucyxcblx0XHRcdFx0XHRGZXRjaFJlcXVlc3QsXG5cdFx0XHRcdFx0TmV0d29ya0ZldGNoRXZlbnQsXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRub3RpZmljYXRpb25zOiB7XG5cdFx0XHRpbmZvOiAoaW5wdXQ6IE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPG51bGw+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJub3RpZmljYXRpb25zLmluZm9cIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0Tm90aWZpY2F0aW9uc0luZm9SZXF1ZXN0LFxuXHRcdFx0XHRcdChjYW5kaWRhdGU6IHVua25vd24pID0+IGNhbmRpZGF0ZSA9PT0gbnVsbCxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdHByb2plY3Q6IHtcblx0XHRcdGxheWVyX2lkczogKGlucHV0PzogUGFnZVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0Y2FsbDxJZFBhZ2U+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJwcm9qZWN0LmxheWVyX2lkc1wiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRQYWdlUmVxdWVzdCxcblx0XHRcdFx0XHRJZFBhZ2UsXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRzZXR0aW5nczoge1xuXHRcdFx0Z2V0OiAoaW5wdXQ6IFNldHRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPHN0cmluZyB8IG51bGw+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJzZXR0aW5ncy5nZXRcIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0U2V0dGluZ3NHZXRSZXF1ZXN0LFxuXHRcdFx0XHRcdChjYW5kaWRhdGU6IHVua25vd24pID0+ICh0eXBlb2YgY2FuZGlkYXRlID09PSBcInN0cmluZ1wiIHx8IGNhbmRpZGF0ZSA9PT0gbnVsbCksXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRzdHlsZXM6IHtcblx0XHRcdGFwcGx5OiAoaW5wdXQ6IFN0eWxlc0FwcGx5UmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPG51bGw+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJzdHlsZXMuYXBwbHlcIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0U3R5bGVzQXBwbHlSZXF1ZXN0LFxuXHRcdFx0XHRcdChjYW5kaWRhdGU6IHVua25vd24pID0+IGNhbmRpZGF0ZSA9PT0gbnVsbCxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHR9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjYWxsPFQ+KFxuXHRjbGllbnQ6IEhvc3RDbGllbnRMaWtlLFxuXHRvcGVyYXRpb246IHN0cmluZyxcblx0aW5wdXQ6IHVua25vd24sXG5cdG9wdGlvbnM6IEhvc3RJbnZva2VPcHRpb25zIHwgdW5kZWZpbmVkLFxuXHRhY2NlcHRJbnB1dDogKHZhbHVlOiB1bmtub3duLCBzdHJpY3Q/OiBib29sZWFuKSA9PiBib29sZWFuLFxuXHRhY2NlcHRPdXRwdXQ6ICh2YWx1ZTogdW5rbm93bikgPT4gYm9vbGVhbixcbik6IFByb21pc2U8VD4ge1xuXHRpZiAoaW5wdXQgIT09IHVuZGVmaW5lZCAmJiAhYWNjZXB0SW5wdXQoaW5wdXQsIHRydWUpKSB7XG5cdFx0dGhyb3cgbmV3IEhvc3RDb250cmFjdEVycm9yKG9wZXJhdGlvbiwgXCJ0aGUgYXJndW1lbnRzIGRvIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgcmVxdWVzdFwiKTtcblx0fVxuXHRjb25zdCB2YWx1ZSA9IGF3YWl0IGNsaWVudC5pbnZva2UoXG5cdFx0b3BlcmF0aW9uLFxuXHRcdChpbnB1dCA/PyB7fSkgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdGlmICghYWNjZXB0T3V0cHV0KHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBIb3N0Q29udHJhY3RFcnJvcihvcGVyYXRpb24sIFwidGhlIHJlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHRoZSBkZWNsYXJlZCByZXN1bHRcIik7XG5cdH1cblx0cmV0dXJuIHZhbHVlIGFzIFQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW48RSBleHRlbmRzIHsgcmVhZG9ubHkga2luZDogc3RyaW5nIH0+KFxuXHRjbGllbnQ6IEhvc3RDbGllbnRMaWtlLFxuXHRvcGVyYXRpb246IHN0cmluZyxcblx0aW5wdXQ6IHVua25vd24sXG5cdGhhbmRsZXJzOiBIb3N0U3RyZWFtSGFuZGxlcnM8RT4sXG5cdG9wdGlvbnM6IEhvc3RJbnZva2VPcHRpb25zIHwgdW5kZWZpbmVkLFxuXHRhY2NlcHRJbnB1dDogKHZhbHVlOiB1bmtub3duLCBzdHJpY3Q/OiBib29sZWFuKSA9PiBib29sZWFuLFxuXHRhY2NlcHRFdmVudDogKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBFLFxuKTogUHJvbWlzZTxIb3N0U3RyZWFtSGFuZGxlPiB7XG5cdGlmICghYWNjZXB0SW5wdXQoaW5wdXQsIHRydWUpKSB7XG5cdFx0dGhyb3cgbmV3IEhvc3RDb250cmFjdEVycm9yKG9wZXJhdGlvbiwgXCJ0aGUgYXJndW1lbnRzIGRvIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgcmVxdWVzdFwiKTtcblx0fVxuXHQvLyBUaGUgdHlwZWQgc3RyZWFtIGVuZHMgZXhhY3RseSBvbmNlLCBsaWtlIHRoZSBzdWJzY3JpcHRpb24gdW5kZXIgaXQ6IGFcblx0Ly8gY29udHJhY3QgdmlvbGF0aW9uIGVuZHMgaXQgaGVyZSwgY2xvc2VzIHRoZSBzdWJzY3JpcHRpb24sIGFuZCB0aGVcblx0Ly8gYGRpc3Bvc2VkYCB0aGUgY2xpZW50IHRoZW4gcmVwb3J0cyBpcyBub3QgZGVsaXZlcmVkIGEgc2Vjb25kIHRpbWUuXG5cdGxldCBlbmRlZCA9IGZhbHNlO1xuXHRsZXQgdmlvbGF0ZWQgPSBmYWxzZTtcblx0bGV0IGhhbmRsZTogSG9zdFN0cmVhbUhhbmRsZSB8IG51bGwgPSBudWxsO1xuXHRjb25zdCBlbmQgPSAodGVybWluYWw6IEhvc3RTdHJlYW1UZXJtaW5hbCk6IHZvaWQgPT4ge1xuXHRcdGlmIChlbmRlZCkgcmV0dXJuO1xuXHRcdGVuZGVkID0gdHJ1ZTtcblx0XHRoYW5kbGVycy5vblRlcm1pbmFsPy4odGVybWluYWwpO1xuXHR9O1xuXHRoYW5kbGUgPSBhd2FpdCBjbGllbnQuc3Vic2NyaWJlKFxuXHRcdG9wZXJhdGlvbixcblx0XHRpbnB1dCBhcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG5cdFx0e1xuXHRcdFx0b25FdmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmIChlbmRlZCkgcmV0dXJuO1xuXHRcdFx0XHRpZiAoYWNjZXB0RXZlbnQoZXZlbnQpKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMub25FdmVudD8uKGV2ZW50KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0ZW5kKHtcblx0XHRcdFx0XHRraW5kOiBcImVycm9yXCIsXG5cdFx0XHRcdFx0bWVzc2FnZTogbmV3IEhvc3RDb250cmFjdEVycm9yKFxuXHRcdFx0XHRcdFx0b3BlcmF0aW9uLFxuXHRcdFx0XHRcdFx0XCJhbiBldmVudCBkb2VzIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgZXZlbnRzXCIsXG5cdFx0XHRcdFx0KS5tZXNzYWdlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGhhbmRsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHZpb2xhdGVkID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG9uVGVybWluYWw6IGVuZCxcblx0XHR9LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdGlmICh2aW9sYXRlZCkge1xuXHRcdGhhbmRsZS5jbG9zZSgpO1xuXHR9XG5cdHJldHVybiBoYW5kbGU7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBSU8sSUFBTSxVQUFVO0FBQ2hCLElBQU0sbUJBQW1CO0FBQ3pCLElBQU0sc0JBQXNCO0FBRzVCLElBQU0sa0JBQWtCO0FBQUEsRUFDOUI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNEO0FBQUE7QUErQ08sTUFBTSwwQkFBMEIsTUFBTTtBQUFBLEVBQzVCO0FBQUEsRUFDVCxXQUFXLENBQUMsV0FBbUIsU0FBaUI7QUFBQSxJQUN0RCxNQUFNLGNBQWMsZUFBZSxTQUFTO0FBQUEsSUFDNUMsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLFlBQVk7QUFBQTtBQUVu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TSxJQUFJLGtCQUFrQixXQUFXLGlEQUFpRDtBQUFBLEVBQ3pGO0FBQUEsRUFJQSxJQUFJLFFBQVE7QUFBQSxFQUNaLElBQUksV0FBVztBQUFBLEVBQ2YsSUFBSSxTQUFrQztBQUFBLEVBQ3RDLE1BQU0sTUFBTSxDQUFDLGFBQXVDO0FBQUEsSUFDbkQsSUFBSTtBQUFBLE1BQU87QUFBQSxJQUNYLFFBQVE7QUFBQSxJQUNSLFNBQVMsYUFBYSxRQUFRO0FBQUE7QUFBQSxFQUUvQixTQUFTLE1BQU0sT0FBTyxVQUNyQixXQUNBLE9BQ0E7QUFBQSxJQUNDLFNBQVMsQ0FBQyxVQUFVO0FBQUEsTUFDbkIsSUFBSTtBQUFBLFFBQU87QUFBQSxNQUNYLElBQUksWUFBWSxLQUFLLEdBQUc7QUFBQSxRQUN2QixTQUFTLFVBQVUsS0FBSztBQUFBLFFBQ3hCO0FBQUEsTUFDRDtBQUFBLE1BQ0EsSUFBSTtBQUFBLFFBQ0gsTUFBTTtBQUFBLFFBQ04sU0FBUyxJQUFJLGtCQUNaLFdBQ0EsNkNBQ0QsRUFBRTtBQUFBLE1BQ0gsQ0FBQztBQUFBLE1BQ0QsSUFBSSxXQUFXLE1BQU07QUFBQSxRQUNwQixXQUFXO0FBQUEsTUFDWixFQUFPO0FBQUEsUUFDTixPQUFPLE1BQU07QUFBQTtBQUFBO0FBQUEsSUFHZixZQUFZO0FBQUEsRUFDYixHQUNBLE9BQ0Q7QUFBQSxFQUNBLElBQUksVUFBVTtBQUFBLElBQ2IsT0FBTyxNQUFNO0FBQUEsRUFDZDtBQUFBLEVBQ0EsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiRUYxNjVGNTkxQzc1ODI5OTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|
package/dist/index.d.ts
CHANGED
|
@@ -24,11 +24,27 @@ interface ActionDescription {
|
|
|
24
24
|
readonly request: Readonly<Record<string, unknown>>;
|
|
25
25
|
readonly result: Readonly<Record<string, unknown>>;
|
|
26
26
|
}
|
|
27
|
+
/** The event kinds a stream may declare; the frame carries the same three. */
|
|
28
|
+
type StreamEventKind = "data" | "progress" | "state";
|
|
29
|
+
/**
|
|
30
|
+
* A declared stream (decision-28): a request in, one payload schema per
|
|
31
|
+
* declared event kind out. There is no `result`: the reply to a subscription is
|
|
32
|
+
* the protocol's acknowledgement, not something an author declares.
|
|
33
|
+
*/
|
|
34
|
+
interface StreamDescription {
|
|
35
|
+
readonly id: string;
|
|
36
|
+
readonly title: string;
|
|
37
|
+
readonly handler: string;
|
|
38
|
+
readonly request: Readonly<Record<string, unknown>>;
|
|
39
|
+
readonly events: Readonly<Partial<Record<StreamEventKind, Readonly<Record<string, unknown>>>>>;
|
|
40
|
+
}
|
|
27
41
|
interface PluginDescription {
|
|
28
42
|
readonly schema_version: 1;
|
|
29
43
|
readonly id: string;
|
|
30
44
|
readonly title: string;
|
|
31
45
|
readonly actions: readonly ActionDescription[];
|
|
46
|
+
/** Declared streams; a description from a host that predates them is empty. */
|
|
47
|
+
readonly streams: readonly StreamDescription[];
|
|
32
48
|
}
|
|
33
49
|
/**
|
|
34
50
|
* Return whether `value` is a finite integer within the JavaScript-safe wire range.
|
|
@@ -79,7 +95,12 @@ declare class QgisSdkContractValidationError extends QgisSdkError {
|
|
|
79
95
|
toJSON(): SerializedContractValidationError;
|
|
80
96
|
}
|
|
81
97
|
/**
|
|
98
|
+
* Return whether `value` is a non-null, non-array object: the shape every wire
|
|
99
|
+
* envelope, description and event payload must have before its fields are read.
|
|
100
|
+
*/
|
|
101
|
+
declare function isPlainRecord(value: unknown): value is Record<string, unknown>;
|
|
102
|
+
/**
|
|
82
103
|
* Parse and validate a version 1 `PluginDescription` emitted by `describe_plugin`.
|
|
83
104
|
*/
|
|
84
105
|
declare function parsePluginDescription(input: string | Readonly<Record<string, unknown>>): PluginDescription;
|
|
85
|
-
export { ActionDescription, MAX_SAFE_INTEGER, MIN_SAFE_INTEGER, PLUGIN_DESCRIPTION_SCHEMA_VERSION, PluginDescription, QgisSdkContractValidationError, QgisSdkDeclarationError, QgisSdkError, QgisSdkScopeClosedError, QgisSdkUnsupportedCapabilityError, QgisSdkValidationIssue, SerializedContractValidationError, SerializedValidationIssue, ValidationDirection, isSafeJsonInteger, parsePluginDescription };
|
|
106
|
+
export { ActionDescription, MAX_SAFE_INTEGER, MIN_SAFE_INTEGER, PLUGIN_DESCRIPTION_SCHEMA_VERSION, PluginDescription, QgisSdkContractValidationError, QgisSdkDeclarationError, QgisSdkError, QgisSdkScopeClosedError, QgisSdkUnsupportedCapabilityError, QgisSdkValidationIssue, SerializedContractValidationError, SerializedValidationIssue, StreamDescription, StreamEventKind, ValidationDirection, isPlainRecord, isSafeJsonInteger, parsePluginDescription };
|