@plumile/router 0.1.12 → 0.1.13
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 +426 -13
- package/lib/esm/index.d.ts +4 -0
- package/lib/esm/index.d.ts.map +1 -1
- package/lib/esm/index.js +5 -1
- package/lib/esm/routing/createRouter.d.ts +1 -0
- package/lib/esm/routing/createRouter.d.ts.map +1 -1
- package/lib/esm/routing/createRouter.js +399 -359
- package/lib/esm/routing/devtools.d.ts +20 -0
- package/lib/esm/routing/devtools.d.ts.map +1 -0
- package/lib/esm/routing/devtools.js +678 -0
- package/lib/esm/routing/filters.d.ts +97 -0
- package/lib/esm/routing/filters.d.ts.map +1 -0
- package/lib/esm/routing/filters.js +557 -0
- package/lib/esm/routing/index.d.ts +6 -0
- package/lib/esm/routing/index.d.ts.map +1 -1
- package/lib/esm/routing/index.js +7 -1
- package/lib/esm/routing/useActiveFilters.d.ts +9 -0
- package/lib/esm/routing/useActiveFilters.d.ts.map +1 -0
- package/lib/esm/routing/useActiveFilters.js +38 -0
- package/lib/esm/routing/useFilterState.d.ts +10 -0
- package/lib/esm/routing/useFilterState.d.ts.map +1 -0
- package/lib/esm/routing/useFilterState.js +14 -0
- package/lib/esm/routing/useNavigate.d.ts +7 -0
- package/lib/esm/routing/useNavigate.d.ts.map +1 -1
- package/lib/esm/routing/useNavigate.js +1 -1
- package/lib/esm/routing/useNavigateWithQuery.d.ts +15 -0
- package/lib/esm/routing/useNavigateWithQuery.d.ts.map +1 -0
- package/lib/esm/routing/useNavigateWithQuery.js +95 -0
- package/lib/esm/routing/useQueryObject.d.ts +18 -0
- package/lib/esm/routing/useQueryObject.d.ts.map +1 -0
- package/lib/esm/routing/useQueryObject.js +107 -0
- package/lib/esm/routing/useStableRefEquality.d.ts +5 -0
- package/lib/esm/routing/useStableRefEquality.d.ts.map +1 -0
- package/lib/esm/routing/useStableRefEquality.js +47 -0
- package/lib/esm/tools/buildSearch.d.ts +8 -2
- package/lib/esm/tools/buildSearch.d.ts.map +1 -1
- package/lib/esm/tools/buildSearch.js +216 -12
- package/lib/esm/types.d.ts +19 -0
- package/lib/esm/types.d.ts.map +1 -1
- package/lib/esm/types.js +1 -1
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/index.d.ts +4 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/routing/createRouter.d.ts +1 -0
- package/lib/types/routing/createRouter.d.ts.map +1 -1
- package/lib/types/routing/devtools.d.ts +20 -0
- package/lib/types/routing/devtools.d.ts.map +1 -0
- package/lib/types/routing/filters.d.ts +97 -0
- package/lib/types/routing/filters.d.ts.map +1 -0
- package/lib/types/routing/index.d.ts +6 -0
- package/lib/types/routing/index.d.ts.map +1 -1
- package/lib/types/routing/useActiveFilters.d.ts +9 -0
- package/lib/types/routing/useActiveFilters.d.ts.map +1 -0
- package/lib/types/routing/useFilterState.d.ts +10 -0
- package/lib/types/routing/useFilterState.d.ts.map +1 -0
- package/lib/types/routing/useNavigate.d.ts +7 -0
- package/lib/types/routing/useNavigate.d.ts.map +1 -1
- package/lib/types/routing/useNavigateWithQuery.d.ts +15 -0
- package/lib/types/routing/useNavigateWithQuery.d.ts.map +1 -0
- package/lib/types/routing/useQueryObject.d.ts +18 -0
- package/lib/types/routing/useQueryObject.d.ts.map +1 -0
- package/lib/types/routing/useStableRefEquality.d.ts +5 -0
- package/lib/types/routing/useStableRefEquality.d.ts.map +1 -0
- package/lib/types/tools/buildSearch.d.ts +8 -2
- package/lib/types/tools/buildSearch.d.ts.map +1 -1
- package/lib/types/types.d.ts +19 -0
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
import { useCallback, useContext, useMemo, useRef } from 'react';
|
|
2
|
+
import RoutingContext from './RoutingContext.js';
|
|
3
|
+
export function numberFilter(def = {}) {
|
|
4
|
+
return { __filter: true, kind: 'number', ...def };
|
|
5
|
+
}
|
|
6
|
+
export function stringFilter(def = {}) {
|
|
7
|
+
return { __filter: true, kind: 'string', ...def };
|
|
8
|
+
}
|
|
9
|
+
export function defineFilters(schema) {
|
|
10
|
+
return { __defined: true, schema };
|
|
11
|
+
}
|
|
12
|
+
const NUMERIC_DEFAULT_OPS = [
|
|
13
|
+
'eq',
|
|
14
|
+
'neq',
|
|
15
|
+
'gt',
|
|
16
|
+
'gte',
|
|
17
|
+
'lt',
|
|
18
|
+
'lte',
|
|
19
|
+
'in',
|
|
20
|
+
'nin',
|
|
21
|
+
'between',
|
|
22
|
+
'exists',
|
|
23
|
+
];
|
|
24
|
+
const STRING_DEFAULT_OPS = [
|
|
25
|
+
'eq',
|
|
26
|
+
'neq',
|
|
27
|
+
'in',
|
|
28
|
+
'nin',
|
|
29
|
+
'between',
|
|
30
|
+
'exists',
|
|
31
|
+
'contains',
|
|
32
|
+
'starts',
|
|
33
|
+
'ends',
|
|
34
|
+
'regex',
|
|
35
|
+
];
|
|
36
|
+
function allowedOperators(def) {
|
|
37
|
+
if (def.operators != null) {
|
|
38
|
+
return def.operators;
|
|
39
|
+
}
|
|
40
|
+
if (def.kind === 'number') {
|
|
41
|
+
return NUMERIC_DEFAULT_OPS;
|
|
42
|
+
}
|
|
43
|
+
return STRING_DEFAULT_OPS;
|
|
44
|
+
}
|
|
45
|
+
function parsePrimitive(kind, raw) {
|
|
46
|
+
if (kind === 'string') {
|
|
47
|
+
return raw;
|
|
48
|
+
}
|
|
49
|
+
const n = Number(raw);
|
|
50
|
+
if (Number.isNaN(n)) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return n;
|
|
54
|
+
}
|
|
55
|
+
function serializePrimitive(v) {
|
|
56
|
+
if (typeof v === 'boolean') {
|
|
57
|
+
if (v) {
|
|
58
|
+
return '1';
|
|
59
|
+
}
|
|
60
|
+
return '0';
|
|
61
|
+
}
|
|
62
|
+
return String(v);
|
|
63
|
+
}
|
|
64
|
+
const PARSE_CACHE = new Map();
|
|
65
|
+
const SCHEMA_IDS = new WeakMap();
|
|
66
|
+
let NEXT_SCHEMA_ID = 0;
|
|
67
|
+
function stableFiltersSignature(obj, schemaId) {
|
|
68
|
+
const parts = ['S', String(schemaId)];
|
|
69
|
+
const fields = Object.keys(obj).sort();
|
|
70
|
+
for (const f of fields) {
|
|
71
|
+
parts.push('F', f);
|
|
72
|
+
const fieldObj = obj[f];
|
|
73
|
+
const ops = Object.keys(fieldObj ?? {}).sort();
|
|
74
|
+
for (const op of ops) {
|
|
75
|
+
const desc = Object.getOwnPropertyDescriptor(fieldObj, op);
|
|
76
|
+
if (desc == null) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const val = desc.value;
|
|
80
|
+
parts.push('O', op);
|
|
81
|
+
if (typeof val === 'boolean') {
|
|
82
|
+
if (val) {
|
|
83
|
+
parts.push('T');
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
parts.push('F');
|
|
87
|
+
}
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (Array.isArray(val)) {
|
|
91
|
+
if (val.length > 0 && Array.isArray(val[0])) {
|
|
92
|
+
parts.push('B');
|
|
93
|
+
for (const t of val) {
|
|
94
|
+
if (Array.isArray(t)) {
|
|
95
|
+
parts.push(String(t[0]), String(t[1]));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
parts.push('A');
|
|
101
|
+
for (const v of val) {
|
|
102
|
+
parts.push(String(v));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (val === undefined) {
|
|
108
|
+
parts.push('U');
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (typeof val === 'string' || typeof val === 'number') {
|
|
112
|
+
parts.push('V', String(val));
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
parts.push('V', '[obj]');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return parts.join('\u001f');
|
|
119
|
+
}
|
|
120
|
+
export function parseFilters(defined, rawQuery) {
|
|
121
|
+
const schemaId = (() => {
|
|
122
|
+
const wm = SCHEMA_IDS;
|
|
123
|
+
let id = wm.get(defined);
|
|
124
|
+
if (id == null) {
|
|
125
|
+
id = NEXT_SCHEMA_ID += 1;
|
|
126
|
+
wm.set(defined, id);
|
|
127
|
+
}
|
|
128
|
+
return id;
|
|
129
|
+
})();
|
|
130
|
+
const { schema } = defined;
|
|
131
|
+
const out = {};
|
|
132
|
+
for (const entry of Object.entries(schema)) {
|
|
133
|
+
const field = entry[0];
|
|
134
|
+
const def = entry[1];
|
|
135
|
+
const fieldState = {};
|
|
136
|
+
const ops = allowedOperators(def);
|
|
137
|
+
for (const op of ops) {
|
|
138
|
+
const key = `${field}.${op}`;
|
|
139
|
+
const rawVal = rawQuery[key];
|
|
140
|
+
if (rawVal === undefined) {
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
let values;
|
|
144
|
+
if (Array.isArray(rawVal)) {
|
|
145
|
+
values = rawVal;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
values = [rawVal];
|
|
149
|
+
}
|
|
150
|
+
if (op === 'exists') {
|
|
151
|
+
const last = values[values.length - 1];
|
|
152
|
+
if (last !== undefined && last !== '') {
|
|
153
|
+
const norm = last.toLowerCase();
|
|
154
|
+
if (norm === '0' || norm === 'false' || norm === 'no') {
|
|
155
|
+
fieldState.exists = false;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
fieldState.exists = true;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else if (op === 'between') {
|
|
163
|
+
const tuples = [];
|
|
164
|
+
let i = 0;
|
|
165
|
+
while (i + 1 < values.length) {
|
|
166
|
+
const rawA = values[i];
|
|
167
|
+
const rawB = values[i + 1];
|
|
168
|
+
if (rawA === undefined || rawB === undefined) {
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
const a = parsePrimitive(def.kind, rawA);
|
|
172
|
+
const b = parsePrimitive(def.kind, rawB);
|
|
173
|
+
if (a !== undefined && b !== undefined) {
|
|
174
|
+
let x = a;
|
|
175
|
+
let y = b;
|
|
176
|
+
if (x > y) {
|
|
177
|
+
const tmp = x;
|
|
178
|
+
x = y;
|
|
179
|
+
y = tmp;
|
|
180
|
+
}
|
|
181
|
+
tuples.push([x, y]);
|
|
182
|
+
}
|
|
183
|
+
i += 2;
|
|
184
|
+
}
|
|
185
|
+
if (tuples.length > 0) {
|
|
186
|
+
tuples.sort((a, b) => {
|
|
187
|
+
const ax = a[0];
|
|
188
|
+
const bx = b[0];
|
|
189
|
+
if (ax < bx)
|
|
190
|
+
return -1;
|
|
191
|
+
if (ax > bx)
|
|
192
|
+
return 1;
|
|
193
|
+
const ay = a[1];
|
|
194
|
+
const by = b[1];
|
|
195
|
+
if (ay < by)
|
|
196
|
+
return -1;
|
|
197
|
+
if (ay > by)
|
|
198
|
+
return 1;
|
|
199
|
+
return 0;
|
|
200
|
+
});
|
|
201
|
+
fieldState.between = tuples;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
const arr = [];
|
|
206
|
+
for (const rawItem of values) {
|
|
207
|
+
let value = rawItem;
|
|
208
|
+
if (def.kind === 'string' && def.normalize != null) {
|
|
209
|
+
try {
|
|
210
|
+
value = def.normalize(rawItem);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
value = rawItem;
|
|
214
|
+
}
|
|
215
|
+
if (value === '') {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const parsed = parsePrimitive(def.kind, value);
|
|
220
|
+
if (parsed !== undefined && parsed !== '') {
|
|
221
|
+
arr.push(parsed);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (arr.length > 0) {
|
|
225
|
+
if (def.kind === 'number') {
|
|
226
|
+
const nums = arr;
|
|
227
|
+
nums.sort((a, b) => {
|
|
228
|
+
return a - b;
|
|
229
|
+
});
|
|
230
|
+
if (def.dedupe) {
|
|
231
|
+
const ded = [];
|
|
232
|
+
let last;
|
|
233
|
+
for (const n of nums) {
|
|
234
|
+
if (n !== last) {
|
|
235
|
+
ded.push(n);
|
|
236
|
+
last = n;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
fieldState[op] = ded;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
fieldState[op] = nums;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else if (def.dedupe) {
|
|
246
|
+
const seen = new Set();
|
|
247
|
+
const res = [];
|
|
248
|
+
for (const s of arr) {
|
|
249
|
+
if (!seen.has(s)) {
|
|
250
|
+
seen.add(s);
|
|
251
|
+
res.push(s);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
fieldState[op] = res;
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
fieldState[op] = arr;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
out[field] = fieldState;
|
|
264
|
+
}
|
|
265
|
+
const signature = stableFiltersSignature(out, schemaId);
|
|
266
|
+
const existing = PARSE_CACHE.get(signature);
|
|
267
|
+
if (existing !== undefined) {
|
|
268
|
+
return existing;
|
|
269
|
+
}
|
|
270
|
+
PARSE_CACHE.set(signature, out);
|
|
271
|
+
return out;
|
|
272
|
+
}
|
|
273
|
+
export const OPERATOR_PRIORITY = [
|
|
274
|
+
'eq',
|
|
275
|
+
'between',
|
|
276
|
+
'gt',
|
|
277
|
+
'gte',
|
|
278
|
+
'lt',
|
|
279
|
+
'lte',
|
|
280
|
+
'in',
|
|
281
|
+
'nin',
|
|
282
|
+
'exists',
|
|
283
|
+
'contains',
|
|
284
|
+
'starts',
|
|
285
|
+
'ends',
|
|
286
|
+
'regex',
|
|
287
|
+
];
|
|
288
|
+
function arraysEqual(a, b) {
|
|
289
|
+
if (a.length !== b.length) {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
let i = 0;
|
|
293
|
+
while (i < a.length) {
|
|
294
|
+
const av = a[i];
|
|
295
|
+
const bv = b[i];
|
|
296
|
+
if (Array.isArray(av) && Array.isArray(bv)) {
|
|
297
|
+
if (!arraysEqual(av, bv)) {
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
else if (av !== bv) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
i += 1;
|
|
305
|
+
}
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
export function buildFiltersQuery(defined, currentQuery, next) {
|
|
309
|
+
const { schema } = defined;
|
|
310
|
+
const out = {};
|
|
311
|
+
const fields = Object.keys(schema);
|
|
312
|
+
for (const kv of Object.entries(currentQuery)) {
|
|
313
|
+
const k = kv[0];
|
|
314
|
+
const v = kv[1];
|
|
315
|
+
let belongs = false;
|
|
316
|
+
for (const f of fields) {
|
|
317
|
+
if (k.startsWith(`${f}.`)) {
|
|
318
|
+
belongs = true;
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (!belongs) {
|
|
323
|
+
out[k] = v;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
for (const entry of Object.entries(schema)) {
|
|
327
|
+
const field = entry[0];
|
|
328
|
+
const def = entry[1];
|
|
329
|
+
const opsUnsorted = allowedOperators(def);
|
|
330
|
+
const ops = [...opsUnsorted];
|
|
331
|
+
ops.sort((a, b) => {
|
|
332
|
+
const ia = OPERATOR_PRIORITY.indexOf(a);
|
|
333
|
+
const ib = OPERATOR_PRIORITY.indexOf(b);
|
|
334
|
+
let safeA = ia;
|
|
335
|
+
if (safeA === -1) {
|
|
336
|
+
safeA = 999;
|
|
337
|
+
}
|
|
338
|
+
let safeB = ib;
|
|
339
|
+
if (safeB === -1) {
|
|
340
|
+
safeB = 999;
|
|
341
|
+
}
|
|
342
|
+
if (safeA < safeB)
|
|
343
|
+
return -1;
|
|
344
|
+
if (safeA > safeB)
|
|
345
|
+
return 1;
|
|
346
|
+
if (a < b)
|
|
347
|
+
return -1;
|
|
348
|
+
if (a > b)
|
|
349
|
+
return 1;
|
|
350
|
+
return 0;
|
|
351
|
+
});
|
|
352
|
+
const recordNext = next;
|
|
353
|
+
const state = recordNext[field] ?? {};
|
|
354
|
+
for (const op of ops) {
|
|
355
|
+
if (Object.prototype.hasOwnProperty.call(state, op)) {
|
|
356
|
+
const value = state[op];
|
|
357
|
+
if (value != null) {
|
|
358
|
+
const defaults = def.defaults;
|
|
359
|
+
if (defaults != null &&
|
|
360
|
+
Object.prototype.hasOwnProperty.call(defaults, op)) {
|
|
361
|
+
const dv = defaults[op];
|
|
362
|
+
let equal = false;
|
|
363
|
+
if (Array.isArray(dv) && Array.isArray(value)) {
|
|
364
|
+
equal = arraysEqual(dv, value);
|
|
365
|
+
}
|
|
366
|
+
else if (typeof dv === 'boolean' && typeof value === 'boolean') {
|
|
367
|
+
equal = dv === value;
|
|
368
|
+
}
|
|
369
|
+
if (equal) {
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
const key = `${field}.${op}`;
|
|
374
|
+
if (op === 'exists' && typeof value === 'boolean') {
|
|
375
|
+
out[key] = serializePrimitive(value);
|
|
376
|
+
}
|
|
377
|
+
else if (op === 'between') {
|
|
378
|
+
const ranges = value;
|
|
379
|
+
for (const range of ranges) {
|
|
380
|
+
const aVal = range[0];
|
|
381
|
+
const bVal = range[1];
|
|
382
|
+
const pair = [
|
|
383
|
+
serializePrimitive(aVal),
|
|
384
|
+
serializePrimitive(bVal),
|
|
385
|
+
];
|
|
386
|
+
const existing = out[key];
|
|
387
|
+
if (existing == null) {
|
|
388
|
+
out[key] = pair;
|
|
389
|
+
}
|
|
390
|
+
else if (Array.isArray(existing)) {
|
|
391
|
+
out[key] = [...existing, ...pair];
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
out[key] = [existing, ...pair];
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
const arr = value;
|
|
400
|
+
for (const val of arr) {
|
|
401
|
+
const sv = serializePrimitive(val);
|
|
402
|
+
const existing = out[key];
|
|
403
|
+
if (existing == null) {
|
|
404
|
+
out[key] = sv;
|
|
405
|
+
}
|
|
406
|
+
else if (Array.isArray(existing)) {
|
|
407
|
+
existing.push(sv);
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
out[key] = [existing, sv];
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return out;
|
|
419
|
+
}
|
|
420
|
+
export function useFilters(defined) {
|
|
421
|
+
const ctx = useContext(RoutingContext);
|
|
422
|
+
const entry = ctx?.get();
|
|
423
|
+
const activeDefined = useMemo(() => {
|
|
424
|
+
if (defined != null) {
|
|
425
|
+
return defined;
|
|
426
|
+
}
|
|
427
|
+
if (ctx == null) {
|
|
428
|
+
return undefined;
|
|
429
|
+
}
|
|
430
|
+
return ctx.currentMergedFilterSchema();
|
|
431
|
+
}, [defined, ctx]);
|
|
432
|
+
const filters = useMemo(() => {
|
|
433
|
+
if (activeDefined == null || entry == null) {
|
|
434
|
+
return {};
|
|
435
|
+
}
|
|
436
|
+
return parseFilters(activeDefined, entry.query);
|
|
437
|
+
}, [activeDefined, entry]);
|
|
438
|
+
const schemaRef = useRef(activeDefined);
|
|
439
|
+
schemaRef.current = activeDefined;
|
|
440
|
+
const navigateFilters = useCallback((nextFilters, opts) => {
|
|
441
|
+
if (ctx == null) {
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
let schemaNow = schemaRef.current;
|
|
445
|
+
schemaNow ??= ctx.currentMergedFilterSchema();
|
|
446
|
+
if (schemaNow == null) {
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
ctx.navigate({
|
|
450
|
+
filters: nextFilters,
|
|
451
|
+
filterSchema: schemaNow,
|
|
452
|
+
replace: opts?.replace,
|
|
453
|
+
batch: opts?.batch,
|
|
454
|
+
});
|
|
455
|
+
}, [ctx]);
|
|
456
|
+
const set = useCallback((next, navOpts) => {
|
|
457
|
+
const prev = filters;
|
|
458
|
+
let resolved = prev;
|
|
459
|
+
if (typeof next === 'function') {
|
|
460
|
+
try {
|
|
461
|
+
resolved = next(prev);
|
|
462
|
+
}
|
|
463
|
+
catch {
|
|
464
|
+
resolved = prev;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
resolved = next;
|
|
469
|
+
}
|
|
470
|
+
const internal = navOpts?.internalBatch !== false;
|
|
471
|
+
if (!internal) {
|
|
472
|
+
let replaceFlag;
|
|
473
|
+
let batchFlag;
|
|
474
|
+
if (navOpts.replace === true) {
|
|
475
|
+
replaceFlag = true;
|
|
476
|
+
}
|
|
477
|
+
if (navOpts.batch === true) {
|
|
478
|
+
batchFlag = true;
|
|
479
|
+
}
|
|
480
|
+
navigateFilters(resolved, { replace: replaceFlag, batch: batchFlag });
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
const self = set;
|
|
484
|
+
self.__pending ??= { scheduled: false };
|
|
485
|
+
const pending = self.__pending;
|
|
486
|
+
pending.filters = resolved;
|
|
487
|
+
if (navOpts?.replace) {
|
|
488
|
+
pending.replace = true;
|
|
489
|
+
}
|
|
490
|
+
if (navOpts?.batch) {
|
|
491
|
+
pending.batch = true;
|
|
492
|
+
}
|
|
493
|
+
if (!pending.scheduled) {
|
|
494
|
+
pending.scheduled = true;
|
|
495
|
+
queueMicrotask(() => {
|
|
496
|
+
pending.scheduled = false;
|
|
497
|
+
if (pending.filters != null) {
|
|
498
|
+
navigateFilters(pending.filters, {
|
|
499
|
+
replace: pending.replace,
|
|
500
|
+
batch: pending.batch,
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
pending.filters = undefined;
|
|
504
|
+
pending.replace = undefined;
|
|
505
|
+
pending.batch = undefined;
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
}, [filters, navigateFilters]);
|
|
509
|
+
const patch = useCallback((delta, navOpts) => {
|
|
510
|
+
set((prev) => {
|
|
511
|
+
const merged = { ...prev };
|
|
512
|
+
for (const [field, ops] of Object.entries(delta)) {
|
|
513
|
+
let cur = merged[field];
|
|
514
|
+
if (cur == null || typeof cur !== 'object') {
|
|
515
|
+
cur = {};
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
cur = { ...cur };
|
|
519
|
+
}
|
|
520
|
+
if (ops != null && typeof ops === 'object') {
|
|
521
|
+
for (const [op, val] of Object.entries(ops)) {
|
|
522
|
+
cur[op] = val;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
merged[field] = cur;
|
|
526
|
+
}
|
|
527
|
+
return merged;
|
|
528
|
+
}, navOpts);
|
|
529
|
+
}, [set]);
|
|
530
|
+
const clear = useCallback((fields, navOpts) => {
|
|
531
|
+
if (fields == null) {
|
|
532
|
+
set((prev) => {
|
|
533
|
+
const next = {};
|
|
534
|
+
for (const k of Object.keys(prev)) {
|
|
535
|
+
next[k] = {};
|
|
536
|
+
}
|
|
537
|
+
return next;
|
|
538
|
+
}, navOpts);
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
const emptyEntries = fields.map((f) => {
|
|
542
|
+
return [f, {}];
|
|
543
|
+
});
|
|
544
|
+
const delta = Object.fromEntries(emptyEntries);
|
|
545
|
+
patch(delta, navOpts);
|
|
546
|
+
}
|
|
547
|
+
}, [patch, set]);
|
|
548
|
+
const helpers = {
|
|
549
|
+
set,
|
|
550
|
+
patch,
|
|
551
|
+
clear,
|
|
552
|
+
};
|
|
553
|
+
return [filters, helpers];
|
|
554
|
+
}
|
|
555
|
+
export const useQueryFilters = useFilters;
|
|
556
|
+
export default useFilters;
|
|
557
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yb3V0aW5nL2ZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNqRSxPQUFPLGNBQWMsTUFBTSxxQkFBcUIsQ0FBQztBQXFFakQsTUFBTSxVQUFVLFlBQVksQ0FDMUIsTUFBMkUsRUFBRTtJQUU3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDcEQsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzFCLE1BQTJFLEVBQUU7SUFFN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3BELENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUMzQixNQUFTO0lBRVQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDckMsQ0FBQztBQXFDRCxNQUFNLG1CQUFtQixHQUFxQjtJQUM1QyxJQUFJO0lBQ0osS0FBSztJQUNMLElBQUk7SUFDSixLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxJQUFJO0lBQ0osS0FBSztJQUNMLFNBQVM7SUFDVCxRQUFRO0NBQ1QsQ0FBQztBQUNGLE1BQU0sa0JBQWtCLEdBQXFCO0lBQzNDLElBQUk7SUFDSixLQUFLO0lBQ0wsSUFBSTtJQUNKLEtBQUs7SUFDTCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87Q0FDUixDQUFDO0FBR0YsU0FBUyxnQkFBZ0IsQ0FBQyxHQUEwQjtJQUNsRCxJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFF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O1FBQzFFLEdBQUc7UUFDSCxLQUFLO1FBQ0wsS0FBSztLQUNOLENBQUM7SUFDRixPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDO0FBQzFDLGVBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSb3V0aW5nQ29udGV4dCBmcm9tICcuL1JvdXRpbmdDb250ZXh0LmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUeXBlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEZpbHRlck9wZXJhdG9yID1cbiAgfCAnZXEnXG4gIHwgJ25lcSdcbiAgfCAnZ3QnXG4gIHwgJ2d0ZSdcbiAgfCAnbHQnXG4gIHwgJ2x0ZSdcbiAgfCAnaW4nXG4gIHwgJ25pbidcbiAgfCAnYmV0d2VlbidcbiAgfCAnZXhpc3RzJ1xuICB8ICdjb250YWlucydcbiAgfCAnc3RhcnRzJ1xuICB8ICdlbmRzJ1xuICB8ICdyZWdleCc7XG5cbmV4cG9ydCB0eXBlIEZpbHRlclZhbHVlS2luZCA9ICdzdHJpbmcnIHwgJ251bWJlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyRmllbGREZWZpbml0aW9uPFxuICBLaW5kIGV4dGVuZHMgRmlsdGVyVmFsdWVLaW5kID0gRmlsdGVyVmFsdWVLaW5kLFxuPiB7XG4gIF9fZmlsdGVyOiB0cnVlO1xuICBraW5kOiBLaW5kO1xuICBvcGVyYXRvcnM/OiBGaWx0ZXJPcGVyYXRvcltdO1xuICBkZWR1cGU/OiBib29sZWFuO1xuICBsYWJlbD86IHN0cmluZztcbiAgbm9ybWFsaXplPzogKHJhdzogc3RyaW5nKSA9PiBzdHJpbmc7IC8vIHN0cmluZyBvbmx5XG4gIGRlZmF1bHRzPzogUGFydGlhbDxcbiAgICBLaW5kIGV4dGVuZHMgJ251bWJlcidcbiAgICAgID8ge1xuICAgICAgICAgIGVxOiBudW1iZXJbXTtcbiAgICAgICAgICBuZXE6IG51bWJlcltdO1xuICAgICAgICAgIGd0OiBudW1iZXJbXTtcbiAgICAgICAgICBndGU6IG51bWJlcltdO1xuICAgICAgICAgIGx0OiBudW1iZXJbXTtcbiAgICAgICAgICBsdGU6IG51bWJlcltdO1xuICAgICAgICAgIGluOiBudW1iZXJbXTtcbiAgICAgICAgICBuaW46IG51bWJlcltdO1xuICAgICAgICAgIGJldHdlZW46IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICAgICAgICBleGlzdHM6IGJvb2xlYW47XG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIGVxOiBzdHJpbmdbXTtcbiAgICAgICAgICBuZXE6IHN0cmluZ1tdO1xuICAgICAgICAgIGluOiBzdHJpbmdbXTtcbiAgICAgICAgICBuaW46IHN0cmluZ1tdO1xuICAgICAgICAgIGJldHdlZW46IFtzdHJpbmcsIHN0cmluZ11bXTtcbiAgICAgICAgICBleGlzdHM6IGJvb2xlYW47XG4gICAgICAgICAgY29udGFpbnM6IHN0cmluZ1tdO1xuICAgICAgICAgIHN0YXJ0czogc3RyaW5nW107XG4gICAgICAgICAgZW5kczogc3RyaW5nW107XG4gICAgICAgICAgcmVnZXg6IHN0cmluZ1tdO1xuICAgICAgICB9XG4gID47XG59XG5cbmV4cG9ydCB0eXBlIEZpbHRlclNjaGVtYSA9IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkRGVmaW5pdGlvbj47XG5leHBvcnQgaW50ZXJmYWNlIERlZmluZWRGaWx0ZXJTY2hlbWE8RiBleHRlbmRzIEZpbHRlclNjaGVtYT4ge1xuICBfX2RlZmluZWQ6IHRydWU7XG4gIHNjaGVtYTogRjtcbn1cblxuLyoqIENyZWF0ZSBhIG51bWJlciBmaWx0ZXIgZmllbGQgZGVmaW5pdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckZpbHRlcihcbiAgZGVmOiBQYXJ0aWFsPE9taXQ8RmlsdGVyRmllbGREZWZpbml0aW9uPCdudW1iZXInPiwgJ19fZmlsdGVyJyB8ICdraW5kJz4+ID0ge30sXG4pOiBGaWx0ZXJGaWVsZERlZmluaXRpb248J251bWJlcic+IHtcbiAgcmV0dXJuIHsgX19maWx0ZXI6IHRydWUsIGtpbmQ6ICdudW1iZXInLCAuLi5kZWYgfTtcbn1cbi8qKiBDcmVhdGUgYSBzdHJpbmcgZmlsdGVyIGZpZWxkIGRlZmluaXRpb24gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGaWx0ZXIoXG4gIGRlZjogUGFydGlhbDxPbWl0PEZpbHRlckZpZWxkRGVmaW5pdGlvbjwnc3RyaW5nJz4sICdfX2ZpbHRlcicgfCAna2luZCc+PiA9IHt9LFxuKTogRmlsdGVyRmllbGREZWZpbml0aW9uPCdzdHJpbmcnPiB7XG4gIHJldHVybiB7IF9fZmlsdGVyOiB0cnVlLCBraW5kOiAnc3RyaW5nJywgLi4uZGVmIH07XG59XG4vKiogV3JhcCBhIHNjaGVtYSB0byBtYXJrIGl0IGFzIGRlZmluZWQgZm9yIGluZmVyZW5jZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUZpbHRlcnM8RiBleHRlbmRzIEZpbHRlclNjaGVtYT4oXG4gIHNjaGVtYTogRixcbik6IERlZmluZWRGaWx0ZXJTY2hlbWE8Rj4ge1xuICByZXR1cm4geyBfX2RlZmluZWQ6IHRydWUsIHNjaGVtYSB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEluZmVyZW5jZSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCB0eXBlIE9wZXJhdG9yVmFsdWU8SyBleHRlbmRzIEZpbHRlclZhbHVlS2luZD4gPSBLIGV4dGVuZHMgJ251bWJlcidcbiAgPyB7XG4gICAgICBlcT86IG51bWJlcltdO1xuICAgICAgbmVxPzogbnVtYmVyW107XG4gICAgICBndD86IG51bWJlcltdO1xuICAgICAgZ3RlPzogbnVtYmVyW107XG4gICAgICBsdD86IG51bWJlcltdO1xuICAgICAgbHRlPzogbnVtYmVyW107XG4gICAgICBpbj86IG51bWJlcltdO1xuICAgICAgbmluPzogbnVtYmVyW107XG4gICAgICBiZXR3ZWVuPzogW251bWJlciwgbnVtYmVyXVtdO1xuICAgICAgZXhpc3RzPzogYm9vbGVhbjtcbiAgICB9XG4gIDoge1xuICAgICAgZXE/OiBzdHJpbmdbXTtcbiAgICAgIG5lcT86IHN0cmluZ1tdO1xuICAgICAgaW4/OiBzdHJpbmdbXTtcbiAgICAgIG5pbj86IHN0cmluZ1tdO1xuICAgICAgYmV0d2Vlbj86IFtzdHJpbmcsIHN0cmluZ11bXTtcbiAgICAgIGV4aXN0cz86IGJvb2xlYW47XG4gICAgICBjb250YWlucz86IHN0cmluZ1tdO1xuICAgICAgc3RhcnRzPzogc3RyaW5nW107XG4gICAgICBlbmRzPzogc3RyaW5nW107XG4gICAgICByZWdleD86IHN0cmluZ1tdO1xuICAgIH07XG5leHBvcnQgdHlwZSBJbmZlckZpbHRlcnM8RiBleHRlbmRzIEZpbHRlclNjaGVtYT4gPSB7XG4gIFtLIGluIGtleW9mIEZdOiBPcGVyYXRvclZhbHVlPEZbS11bJ2tpbmQnXT47XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE9wZXJhdG9yIGRlZmF1bHRzICYgdXRpbGl0aWVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IE5VTUVSSUNfREVGQVVMVF9PUFM6IEZpbHRlck9wZXJhdG9yW10gPSBbXG4gICdlcScsXG4gICduZXEnLFxuICAnZ3QnLFxuICAnZ3RlJyxcbiAgJ2x0JyxcbiAgJ2x0ZScsXG4gICdpbicsXG4gICduaW4nLFxuICAnYmV0d2VlbicsXG4gICdleGlzdHMnLFxuXTtcbmNvbnN0IFNUUklOR19ERUZBVUxUX09QUzogRmlsdGVyT3BlcmF0b3JbXSA9IFtcbiAgJ2VxJyxcbiAgJ25lcScsXG4gICdpbicsXG4gICduaW4nLFxuICAnYmV0d2VlbicsXG4gICdleGlzdHMnLFxuICAnY29udGFpbnMnLFxuICAnc3RhcnRzJyxcbiAgJ2VuZHMnLFxuICAncmVnZXgnLFxuXTtcblxuLyoqIFJldHVybiBhbGxvd2VkIG9wZXJhdG9ycyBmb3IgYSBmaWVsZCAoZXhwbGljaXQgb3IgZGVmYXVsdHMpICovXG5mdW5jdGlvbiBhbGxvd2VkT3BlcmF0b3JzKGRlZjogRmlsdGVyRmllbGREZWZpbml0aW9uKTogRmlsdGVyT3BlcmF0b3JbXSB7XG4gIGlmIChkZWYub3BlcmF0b3JzICE9IG51bGwpIHtcbiAgICByZXR1cm4gZGVmLm9wZXJhdG9ycztcbiAgfVxuICBpZiAoZGVmLmtpbmQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIE5VTUVSSUNfREVGQVVMVF9PUFM7XG4gIH1cbiAgcmV0dXJuIFNUUklOR19ERUZBVUxUX09QUztcbn1cblxuLyoqIFBhcnNlIGEgcHJpbWl0aXZlIGFjY29yZGluZyB0byBraW5kICovXG5mdW5jdGlvbiBwYXJzZVByaW1pdGl2ZShcbiAga2luZDogRmlsdGVyVmFsdWVLaW5kLFxuICByYXc6IHN0cmluZyxcbik6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChraW5kID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByYXc7XG4gIH1cbiAgY29uc3QgbiA9IE51bWJlcihyYXcpO1xuICBpZiAoTnVtYmVyLmlzTmFOKG4pKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLyoqIFNlcmlhbGl6ZSBwcmltaXRpdmUgb3IgYm9vbGVhbiB0byBxdWVyeSBzdHJpbmcgdmFsdWUgKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZVByaW1pdGl2ZSh2OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2ID09PSAnYm9vbGVhbicpIHtcbiAgICBpZiAodikge1xuICAgICAgcmV0dXJuICcxJztcbiAgICB9XG4gICAgcmV0dXJuICcwJztcbiAgfVxuICByZXR1cm4gU3RyaW5nKHYpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDYWNoZSB1dGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKiogR2xvYmFsIHBhcnNlIGNhY2hlIGtleWVkIGJ5IGNhbm9uaWNhbCBzaWduYXR1cmUgKi9cbmNvbnN0IFBBUlNFX0NBQ0hFID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4vKiogV2VhayBtYXAgYXNzaWduaW5nIHN0YWJsZSBudW1lcmljIGlkcyBwZXIgc2NoZW1hIHdyYXBwZXIgKi9cbmNvbnN0IFNDSEVNQV9JRFMgPSBuZXcgV2Vha01hcDxvYmplY3QsIG51bWJlcj4oKTtcbmxldCBORVhUX1NDSEVNQV9JRCA9IDA7XG5cbi8qKiBCdWlsZCBhIHN0YWJsZSBjYW5vbmljYWwgc2lnbmF0dXJlIGZvciBwYXJzZWQgZmlsdGVycyAqL1xuZnVuY3Rpb24gc3RhYmxlRmlsdGVyc1NpZ25hdHVyZShcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIHNjaGVtYUlkOiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbJ1MnLCBTdHJpbmcoc2NoZW1hSWQpXTtcbiAgY29uc3QgZmllbGRzID0gT2JqZWN0LmtleXMob2JqKS5zb3J0KCk7XG4gIGZvciAoY29uc3QgZiBvZiBmaWVsZHMpIHtcbiAgICBwYXJ0cy5wdXNoKCdGJywgZik7XG4gICAgY29uc3QgZmllbGRPYmogPSBvYmpbZl07XG4gICAgY29uc3Qgb3BzID0gT2JqZWN0LmtleXMoZmllbGRPYmogPz8ge30pLnNvcnQoKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZmllbGRPYmosIG9wKTtcbiAgICAgIGlmIChkZXNjID09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsOiB1bmtub3duID0gZGVzYy52YWx1ZTtcbiAgICAgIHBhcnRzLnB1c2goJ08nLCBvcCk7XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKCdUJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydHMucHVzaCgnRicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgaWYgKHZhbC5sZW5ndGggPiAwICYmIEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgIHBhcnRzLnB1c2goJ0InKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdmFsIGFzIHVua25vd25bXSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIHtcbiAgICAgICAgICAgICAgcGFydHMucHVzaChTdHJpbmcodFswXSksIFN0cmluZyh0WzFdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnRzLnB1c2goJ0EnKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsIGFzIHVua25vd25bXSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChTdHJpbmcodikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFydHMucHVzaCgnVScpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcGFydHMucHVzaCgnVicsIFN0cmluZyh2YWwpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGFydHMucHVzaCgnVicsICdbb2JqXScpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFydHMuam9pbignXFx1MDAxZicpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcnNpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqIFBhcnNlIHJhdyBxdWVyeSBpbnRvIHN0cnVjdHVyZWQgZmlsdGVycyAod2l0aCBpZGVudGl0eSBjYWNoZSkgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZpbHRlcnM8RiBleHRlbmRzIERlZmluZWRGaWx0ZXJTY2hlbWE8RmlsdGVyU2NoZW1hPj4oXG4gIGRlZmluZWQ6IEYsXG4gIHJhd1F1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4sXG4pOiBJbmZlckZpbHRlcnM8Rlsnc2NoZW1hJ10+IHtcbiAgLy8gLS0tIENhY2hpbmcgU3RyYXRlZ3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gV2UgcmVidWlsZCB0aGUgc3RydWN0dXJlZCBvYmplY3QgZXZlcnkgaW52b2NhdGlvbiAoc2ltcGxpY2l0eSkgdGhlblxuICAvLyBjb21wdXRlIGEgc3RhYmxlIGNhbm9uaWNhbCBzaWduYXR1cmUgYW5kIHJldHVybiB0aGUgcHJldmlvdXNseSBjYWNoZWRcbiAgLy8gb2JqZWN0IHdoZW4gaWRlbnRpY2FsLiBUaGlzIHNhdGlzZmllcyBpZGVudGl0eSBleHBlY3RhdGlvbnMgaW4gdGVzdHNcbiAgLy8gKHBhcnNlRmlsdGVycyhhKSA9PT0gcGFyc2VGaWx0ZXJzKGEpIGZvciB1bmNoYW5nZWQgcmF3IHF1ZXJ5KSB3aGlsZVxuICAvLyBrZWVwaW5nIGltcGxlbWVudGF0aW9uIHN0cmFpZ2h0Zm9yd2FyZC4gTWVtb3J5IHVzYWdlIGlzIGJvdW5kZWQgYnlcbiAgLy8gdmFyaWF0aW9uIG9mIGNhbm9uaWNhbCBmaWx0ZXIgc3RhdGVzIGVuY291bnRlcmVkIGR1cmluZyBhcHAgbGlmZXRpbWUuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGNvbnN0IHNjaGVtYUlkID0gKCgpID0+IHtcbiAgICAvLyBBc3NpZ24gc3RhYmxlIHNtYWxsIG51bWVyaWMgaWQgcGVyIGRlZmluZWQgc2NoZW1hIHdyYXBwZXIuXG4gICAgY29uc3Qgd20gPSBTQ0hFTUFfSURTO1xuICAgIGxldCBpZCA9IHdtLmdldChkZWZpbmVkKTtcbiAgICBpZiAoaWQgPT0gbnVsbCkge1xuICAgICAgaWQgPSBORVhUX1NDSEVNQV9JRCArPSAxO1xuICAgICAgd20uc2V0KGRlZmluZWQsIGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9KSgpO1xuICAvLyBXZSBidWlsZCB0aGVuIGhhc2g7IGFsdGVybmF0aXZlIHByZS1oYXNoIG9mIHJhdyB2YWx1ZXMgb21pdHRlZCBmb3IgY2xhcml0eS5cbiAgY29uc3QgeyBzY2hlbWEgfSA9IGRlZmluZWQ7XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge307XG4gIGZvciAoY29uc3QgZW50cnkgb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgIGNvbnN0IGZpZWxkID0gZW50cnlbMF07XG4gICAgY29uc3QgZGVmID0gZW50cnlbMV07XG4gICAgY29uc3QgZmllbGRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCBvcHMgPSBhbGxvd2VkT3BlcmF0b3JzKGRlZik7XG4gICAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcbiAgICAgIGNvbnN0IGtleSA9IGAke2ZpZWxkfS4ke29wfWA7XG4gICAgICBjb25zdCByYXdWYWwgPSByYXdRdWVyeVtrZXldO1xuICAgICAgaWYgKHJhd1ZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIG5vIGtleVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHZhbHVlczogc3RyaW5nW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhd1ZhbCkpIHtcbiAgICAgICAgICB2YWx1ZXMgPSByYXdWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWVzID0gW3Jhd1ZhbF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wID09PSAnZXhpc3RzJykge1xuICAgICAgICAgIGNvbnN0IGxhc3QgPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChsYXN0ICE9PSB1bmRlZmluZWQgJiYgbGFzdCAhPT0gJycpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm0gPSBsYXN0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobm9ybSA9PT0gJzAnIHx8IG5vcm0gPT09ICdmYWxzZScgfHwgbm9ybSA9PT0gJ25vJykge1xuICAgICAgICAgICAgICBmaWVsZFN0YXRlLmV4aXN0cyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZmllbGRTdGF0ZS5leGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJ2JldHdlZW4nKSB7XG4gICAgICAgICAgY29uc3QgdHVwbGVzOiBbdW5rbm93biwgdW5rbm93bl1bXSA9IFtdO1xuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICB3aGlsZSAoaSArIDEgPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCByYXdBID0gdmFsdWVzW2ldO1xuICAgICAgICAgICAgY29uc3QgcmF3QiA9IHZhbHVlc1tpICsgMV07XG4gICAgICAgICAgICBpZiAocmF3QSA9PT0gdW5kZWZpbmVkIHx8IHJhd0IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGEgPSBwYXJzZVByaW1pdGl2ZShkZWYua2luZCwgcmF3QSk7XG4gICAgICAgICAgICBjb25zdCBiID0gcGFyc2VQcmltaXRpdmUoZGVmLmtpbmQsIHJhd0IpO1xuICAgICAgICAgICAgaWYgKGEgIT09IHVuZGVmaW5lZCAmJiBiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbGV0IHggPSBhO1xuICAgICAgICAgICAgICBsZXQgeSA9IGI7XG4gICAgICAgICAgICAgIGlmICgoeCBhcyBudW1iZXIpID4gKHkgYXMgbnVtYmVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcCA9IHg7XG4gICAgICAgICAgICAgICAgeCA9IHk7XG4gICAgICAgICAgICAgICAgeSA9IHRtcDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0dXBsZXMucHVzaChbeCwgeV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHVwbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHR1cGxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGF4ID0gYVswXSBhcyBudW1iZXIgfCBzdHJpbmc7XG4gICAgICAgICAgICAgIGNvbnN0IGJ4ID0gYlswXSBhcyBudW1iZXIgfCBzdHJpbmc7XG4gICAgICAgICAgICAgIGlmIChheCA8IGJ4KSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgIGlmIChheCA+IGJ4KSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgY29uc3QgYXkgPSBhWzFdIGFzIG51bWJlciB8IHN0cmluZztcbiAgICAgICAgICAgICAgY29uc3QgYnkgPSBiWzFdIGFzIG51bWJlciB8IHN0cmluZztcbiAgICAgICAgICAgICAgaWYgKGF5IDwgYnkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgaWYgKGF5ID4gYnkpIHJldHVybiAxO1xuICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZmllbGRTdGF0ZS5iZXR3ZWVuID0gdHVwbGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhcnI6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJhd0l0ZW0gb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSByYXdJdGVtO1xuICAgICAgICAgICAgaWYgKGRlZi5raW5kID09PSAnc3RyaW5nJyAmJiBkZWYubm9ybWFsaXplICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlZi5ub3JtYWxpemUocmF3SXRlbSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gcmF3SXRlbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBlbXB0eVxuICAgICAgICAgICAgICAgIC8vIHNraXAgZW1wdHlcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VQcmltaXRpdmUoZGVmLmtpbmQsIHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQgIT09IHVuZGVmaW5lZCAmJiBwYXJzZWQgIT09ICcnKSB7XG4gICAgICAgICAgICAgIGFyci5wdXNoKHBhcnNlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhcnIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGRlZi5raW5kID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICBjb25zdCBudW1zID0gYXJyIGFzIG51bWJlcltdO1xuICAgICAgICAgICAgICBudW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYSAtIGI7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoZGVmLmRlZHVwZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBudW1zKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobiAhPT0gbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICBkZWQucHVzaChuKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IG47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpZWxkU3RhdGVbb3BdID0gZGVkO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkU3RhdGVbb3BdID0gbnVtcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkZWYuZGVkdXBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgYXJyIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZWVuLmhhcyhzKSkge1xuICAgICAgICAgICAgICAgICAgc2Vlbi5hZGQocyk7XG4gICAgICAgICAgICAgICAgICByZXMucHVzaChzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZmllbGRTdGF0ZVtvcF0gPSByZXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmaWVsZFN0YXRlW29wXSA9IGFyciBhcyBzdHJpbmdbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgb3V0W2ZpZWxkXSA9IGZpZWxkU3RhdGU7XG4gIH1cbiAgY29uc3Qgc2lnbmF0dXJlID0gc3RhYmxlRmlsdGVyc1NpZ25hdHVyZShvdXQsIHNjaGVtYUlkKTtcbiAgY29uc3QgZXhpc3RpbmcgPSBQQVJTRV9DQUNIRS5nZXQoc2lnbmF0dXJlKTtcbiAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXhpc3RpbmcgYXMgSW5mZXJGaWx0ZXJzPEZbJ3NjaGVtYSddPjtcbiAgfVxuICBQQVJTRV9DQUNIRS5zZXQoc2lnbmF0dXJlLCBvdXQpO1xuICByZXR1cm4gb3V0IGFzIEluZmVyRmlsdGVyczxGWydzY2hlbWEnXT47XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VyaWFsaXphdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY29uc3QgT1BFUkFUT1JfUFJJT1JJVFk6IEZpbHRlck9wZXJhdG9yW10gPSBbXG4gICdlcScsXG4gICdiZXR3ZWVuJyxcbiAgJ2d0JyxcbiAgJ2d0ZScsXG4gICdsdCcsXG4gICdsdGUnLFxuICAnaW4nLFxuICAnbmluJyxcbiAgJ2V4aXN0cycsXG4gICdjb250YWlucycsXG4gICdzdGFydHMnLFxuICAnZW5kcycsXG4gICdyZWdleCcsXG5dO1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJzUGF0Y2g8Rj4gPSB7IFtLIGluIGtleW9mIEZdPzogUGFydGlhbDxGW0tdPiB9O1xuXG4vKiogRGVlcCAob25lLWxldmVsKSBhcnJheSBlcXVhbGl0eSB3aXRoIHR1cGxlIHJlY3Vyc2lvbiAqL1xuZnVuY3Rpb24gYXJyYXlzRXF1YWwoYTogdW5rbm93bltdLCBiOiB1bmtub3duW10pOiBib29sZWFuIHtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChpIDwgYS5sZW5ndGgpIHtcbiAgICBjb25zdCBhdiA9IGFbaV07XG4gICAgY29uc3QgYnYgPSBiW2ldO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGF2KSAmJiBBcnJheS5pc0FycmF5KGJ2KSkge1xuICAgICAgaWYgKCFhcnJheXNFcXVhbChhdiwgYnYpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGF2ICE9PSBidikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpICs9IDE7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBTZXJpYWxpemUgc3RydWN0dXJlZCBmaWx0ZXJzIGJhY2sgaW50byBmbGF0IHF1ZXJ5IG9iamVjdCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsdGVyc1F1ZXJ5PEYgZXh0ZW5kcyBEZWZpbmVkRmlsdGVyU2NoZW1hPEZpbHRlclNjaGVtYT4+KFxuICBkZWZpbmVkOiBGLFxuICBjdXJyZW50UXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBuZXh0OiBJbmZlckZpbHRlcnM8Rlsnc2NoZW1hJ10+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCB7IHNjaGVtYSB9ID0gZGVmaW5lZDtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzY2hlbWEpO1xuICBmb3IgKGNvbnN0IGt2IG9mIE9iamVjdC5lbnRyaWVzKGN1cnJlbnRRdWVyeSkpIHtcbiAgICBjb25zdCBrID0ga3ZbMF07XG4gICAgY29uc3QgdiA9IGt2WzFdO1xuICAgIGxldCBiZWxvbmdzID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGsuc3RhcnRzV2l0aChgJHtmfS5gKSkge1xuICAgICAgICBiZWxvbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYmVsb25ncykge1xuICAgICAgb3V0W2tdID0gdjtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgY29uc3QgZmllbGQgPSBlbnRyeVswXTtcbiAgICBjb25zdCBkZWYgPSBlbnRyeVsxXTtcbiAgICBjb25zdCBvcHNVbnNvcnRlZCA9IGFsbG93ZWRPcGVyYXRvcnMoZGVmKTtcbiAgICBjb25zdCBvcHMgPSBbLi4ub3BzVW5zb3J0ZWRdO1xuICAgIG9wcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBpYSA9IE9QRVJBVE9SX1BSSU9SSVRZLmluZGV4T2YoYSk7XG4gICAgICBjb25zdCBpYiA9IE9QRVJBVE9SX1BSSU9SSVRZLmluZGV4T2YoYik7XG4gICAgICBsZXQgc2FmZUEgPSBpYTtcbiAgICAgIGlmIChzYWZlQSA9PT0gLTEpIHtcbiAgICAgICAgc2FmZUEgPSA5OTk7XG4gICAgICB9XG4gICAgICBsZXQgc2FmZUIgPSBpYjtcbiAgICAgIGlmIChzYWZlQiA9PT0gLTEpIHtcbiAgICAgICAgc2FmZUIgPSA5OTk7XG4gICAgICB9XG4gICAgICBpZiAoc2FmZUEgPCBzYWZlQikgcmV0dXJuIC0xO1xuICAgICAgaWYgKHNhZmVBID4gc2FmZUIpIHJldHVybiAxO1xuICAgICAgaWYgKGEgPCBiKSByZXR1cm4gLTE7XG4gICAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG4gICAgY29uc3QgcmVjb3JkTmV4dCA9IG5leHQgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgIGNvbnN0IHN0YXRlID0gcmVjb3JkTmV4dFtmaWVsZF0gPz8ge307XG4gICAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc3RhdGUsIG9wKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN0YXRlW29wXTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0cyA9IGRlZi5kZWZhdWx0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWZhdWx0cyAhPSBudWxsICYmXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdHMsIG9wKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgZHYgPSBkZWZhdWx0c1tvcF07XG4gICAgICAgICAgICBsZXQgZXF1YWwgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGR2KSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICBlcXVhbCA9IGFycmF5c0VxdWFsKGR2LCB2YWx1ZSBhcyB1bmtub3duW10pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZHYgPT09ICdib29sZWFuJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICBlcXVhbCA9IGR2ID09PSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcXVhbCkge1xuICAgICAgICAgICAgICAvLyBvbWl0IGRlZmF1bHQtZXF1aXZhbGVudFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgICAgICAgY29udGludWU7IC8vIG9taXQgZGVmYXVsdC1lcXVpdmFsZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGtleSA9IGAke2ZpZWxkfS4ke29wfWA7XG4gICAgICAgICAgaWYgKG9wID09PSAnZXhpc3RzJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgb3V0W2tleV0gPSBzZXJpYWxpemVQcmltaXRpdmUodmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09ICdiZXR3ZWVuJykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VzID0gdmFsdWUgYXMgW3Vua25vd24sIHVua25vd25dW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcykge1xuICAgICAgICAgICAgICBjb25zdCBhVmFsID0gcmFuZ2VbMF07XG4gICAgICAgICAgICAgIGNvbnN0IGJWYWwgPSByYW5nZVsxXTtcbiAgICAgICAgICAgICAgY29uc3QgcGFpcjogKHN0cmluZyB8IG51bWJlcilbXSA9IFtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVQcmltaXRpdmUoYVZhbCBhcyBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVQcmltaXRpdmUoYlZhbCBhcyBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBvdXRba2V5XTtcbiAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IHBhaXI7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IFsuLi5leGlzdGluZywgLi4ucGFpcl07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0W2tleV0gPSBbZXhpc3RpbmcsIC4uLnBhaXJdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IHZhbHVlIGFzIHVua25vd25bXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsIG9mIGFycikge1xuICAgICAgICAgICAgICBjb25zdCBzdiA9IHNlcmlhbGl6ZVByaW1pdGl2ZSh2YWwgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbik7XG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gb3V0W2tleV07XG4gICAgICAgICAgICAgIGlmIChleGlzdGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0W2tleV0gPSBzdjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nKSkge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnB1c2goc3YpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gW2V4aXN0aW5nLCBzdl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIb29rXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRmlsdGVyc0hlbHBlcnM8Rj4ge1xuICBzZXQ6IChcbiAgICBuZXh0OiBGIHwgKChwOiBGKSA9PiBGKSxcbiAgICBuYXZPcHRzPzogeyByZXBsYWNlPzogYm9vbGVhbjsgYmF0Y2g/OiBib29sZWFuOyBpbnRlcm5hbEJhdGNoPzogYm9vbGVhbiB9LFxuICApID0+IHZvaWQ7XG4gIHBhdGNoOiAoXG4gICAgZGVsdGE6IEZpbHRlcnNQYXRjaDxGPixcbiAgICBuYXZPcHRzPzogeyByZXBsYWNlPzogYm9vbGVhbjsgYmF0Y2g/OiBib29sZWFuOyBpbnRlcm5hbEJhdGNoPzogYm9vbGVhbiB9LFxuICApID0+IHZvaWQ7XG4gIGNsZWFyOiAoXG4gICAgZmllbGRzPzogKGtleW9mIEYpW10sXG4gICAgbmF2T3B0cz86IHsgcmVwbGFjZT86IGJvb2xlYW47IGJhdGNoPzogYm9vbGVhbjsgaW50ZXJuYWxCYXRjaD86IGJvb2xlYW4gfSxcbiAgKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIHVzZUZpbHRlcnMgaG9va1xuICogLSBXaGVuIGEgc2NoZW1hIHdyYXBwZXIgaXMgcHJvdmlkZWQsIHR5cGVzIHJlbWFpbiBpbmZlcnJlZC5cbiAqIC0gV2hlbiBvbWl0dGVkLCBpbXBsaWNpdCBtZXJnZWQgcm91dGUgc2NoZW1hIGlzIHVzZWQgKGhlbHBlcnMgc3RpbGwgd29yayBidXQgcmVjb3JkIGlzIGdlbmVyaWMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRmlsdGVycyhcbiAgZGVmaW5lZD86IERlZmluZWRGaWx0ZXJTY2hlbWE8RmlsdGVyU2NoZW1hPixcbik6IFtcbiAgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICBVc2VGaWx0ZXJzSGVscGVyczxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+LFxuXSB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoUm91dGluZ0NvbnRleHQpO1xuICBjb25zdCBlbnRyeSA9IGN0eD8uZ2V0KCk7XG4gIGNvbnN0IGFjdGl2ZURlZmluZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGVmaW5lZCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGN0eCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY3R4LmN1cnJlbnRNZXJnZWRGaWx0ZXJTY2hlbWEoKTtcbiAgfSwgW2RlZmluZWQsIGN0eF0pO1xuXG4gIGNvbnN0IGZpbHRlcnMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoYWN0aXZlRGVmaW5lZCA9PSBudWxsIHx8IGVudHJ5ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZpbHRlcnMoYWN0aXZlRGVmaW5lZCwgZW50cnkucXVlcnkpO1xuICB9LCBbYWN0aXZlRGVmaW5lZCwgZW50cnldKTtcblxuICB0eXBlIE5hdk9wdHMgPSB7XG4gICAgcmVwbGFjZT86IGJvb2xlYW47XG4gICAgYmF0Y2g/OiBib29sZWFuO1xuICAgIGludGVybmFsQmF0Y2g/OiBib29sZWFuO1xuICB9O1xuICBjb25zdCBzY2hlbWFSZWYgPSB1c2VSZWYoYWN0aXZlRGVmaW5lZCk7XG4gIHNjaGVtYVJlZi5jdXJyZW50ID0gYWN0aXZlRGVmaW5lZDtcblxuICBjb25zdCBuYXZpZ2F0ZUZpbHRlcnMgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBuZXh0RmlsdGVyczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgICAgb3B0cz86IHsgcmVwbGFjZT86IGJvb2xlYW47IGJhdGNoPzogYm9vbGVhbiB9LFxuICAgICkgPT4ge1xuICAgICAgaWYgKGN0eCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBzY2hlbWFOb3cgPSBzY2hlbWFSZWYuY3VycmVudDtcbiAgICAgIHNjaGVtYU5vdyA/Pz0gY3R4LmN1cnJlbnRNZXJnZWRGaWx0ZXJTY2hlbWEoKTtcbiAgICAgIGlmIChzY2hlbWFOb3cgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdHgubmF2aWdhdGUoe1xuICAgICAgICBmaWx0ZXJzOiBuZXh0RmlsdGVycyxcbiAgICAgICAgZmlsdGVyU2NoZW1hOiBzY2hlbWFOb3csXG4gICAgICAgIHJlcGxhY2U6IG9wdHM/LnJlcGxhY2UsXG4gICAgICAgIGJhdGNoOiBvcHRzPy5iYXRjaCxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW2N0eF0sXG4gICk7XG5cbiAgY29uc3Qgc2V0ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgbmV4dDpcbiAgICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgICAgfCAoKFxuICAgICAgICAgICAgcDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgICAgICAgICkgPT4gUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSxcbiAgICAgIG5hdk9wdHM/OiBOYXZPcHRzLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgcHJldiA9IGZpbHRlcnM7XG4gICAgICBsZXQgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHByZXY7XG4gICAgICBpZiAodHlwZW9mIG5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNvbHZlZCA9IG5leHQocHJldik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJlc29sdmVkID0gcHJldjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZWQgPSBuZXh0O1xuICAgICAgfVxuICAgICAgY29uc3QgaW50ZXJuYWwgPSBuYXZPcHRzPy5pbnRlcm5hbEJhdGNoICE9PSBmYWxzZTtcbiAgICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgICAgbGV0IHJlcGxhY2VGbGFnOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgYmF0Y2hGbGFnOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAobmF2T3B0cy5yZXBsYWNlID09PSB0cnVlKSB7XG4gICAgICAgICAgcmVwbGFjZUZsYWcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZPcHRzLmJhdGNoID09PSB0cnVlKSB7XG4gICAgICAgICAgYmF0Y2hGbGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBuYXZpZ2F0ZUZpbHRlcnMocmVzb2x2ZWQsIHsgcmVwbGFjZTogcmVwbGFjZUZsYWcsIGJhdGNoOiBiYXRjaEZsYWcgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGludGVyZmFjZSBQZW5kaW5nU3RhdGUge1xuICAgICAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICAgICAgYmF0Y2g/OiBib29sZWFuO1xuICAgICAgICBzY2hlZHVsZWQ6IGJvb2xlYW47XG4gICAgICB9XG4gICAgICBjb25zdCBzZWxmID0gc2V0IGFzIHVua25vd24gYXMgeyBfX3BlbmRpbmc/OiBQZW5kaW5nU3RhdGUgfTtcbiAgICAgIHNlbGYuX19wZW5kaW5nID8/PSB7IHNjaGVkdWxlZDogZmFsc2UgfTtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBzZWxmLl9fcGVuZGluZztcbiAgICAgIHBlbmRpbmcuZmlsdGVycyA9IHJlc29sdmVkO1xuICAgICAgaWYgKG5hdk9wdHM/LnJlcGxhY2UpIHtcbiAgICAgICAgcGVuZGluZy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChuYXZPcHRzPy5iYXRjaCkge1xuICAgICAgICBwZW5kaW5nLmJhdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghcGVuZGluZy5zY2hlZHVsZWQpIHtcbiAgICAgICAgcGVuZGluZy5zY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgcGVuZGluZy5zY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAocGVuZGluZy5maWx0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5hdmlnYXRlRmlsdGVycyhwZW5kaW5nLmZpbHRlcnMsIHtcbiAgICAgICAgICAgICAgcmVwbGFjZTogcGVuZGluZy5yZXBsYWNlLFxuICAgICAgICAgICAgICBiYXRjaDogcGVuZGluZy5iYXRjaCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwZW5kaW5nLmZpbHRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcGVuZGluZy5yZXBsYWNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHBlbmRpbmcuYmF0Y2ggPSB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpbHRlcnMsIG5hdmlnYXRlRmlsdGVyc10sXG4gICk7XG5cbiAgY29uc3QgcGF0Y2ggPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBkZWx0YTogRmlsdGVyc1BhdGNoPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4sXG4gICAgICBuYXZPcHRzPzogTmF2T3B0cyxcbiAgICApID0+IHtcbiAgICAgIHNldCgocHJldikgPT4ge1xuICAgICAgICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHsgLi4ucHJldiB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtmaWVsZCwgb3BzXSBvZiBPYmplY3QuZW50cmllcyhkZWx0YSkpIHtcbiAgICAgICAgICBsZXQgY3VyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9IG1lcmdlZFtmaWVsZF07XG4gICAgICAgICAgaWYgKGN1ciA9PSBudWxsIHx8IHR5cGVvZiBjdXIgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjdXIgPSB7fTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VyID0geyAuLi5jdXIgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wcyAhPSBudWxsICYmIHR5cGVvZiBvcHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtvcCwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgb3BzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjdXJbb3BdID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBtZXJnZWRbZmllbGRdID0gY3VyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgICB9LCBuYXZPcHRzKTtcbiAgICB9LFxuICAgIFtzZXRdLFxuICApO1xuXG4gIGNvbnN0IGNsZWFyID0gdXNlQ2FsbGJhY2soXG4gICAgKGZpZWxkcz86IHN0cmluZ1tdLCBuYXZPcHRzPzogTmF2T3B0cykgPT4ge1xuICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB7XG4gICAgICAgIHNldCgocHJldikgPT4ge1xuICAgICAgICAgIGNvbnN0IG5leHQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhwcmV2KSkge1xuICAgICAgICAgICAgbmV4dFtrXSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfSwgbmF2T3B0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbXB0eUVudHJpZXMgPSBmaWVsZHMubWFwKChmKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtmLCB7fV07XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkZWx0YSA9IE9iamVjdC5mcm9tRW50cmllcyhlbXB0eUVudHJpZXMpIGFzIEZpbHRlcnNQYXRjaDxcbiAgICAgICAgICBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgICAgPjtcbiAgICAgICAgcGF0Y2goZGVsdGEsIG5hdk9wdHMpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3BhdGNoLCBzZXRdLFxuICApO1xuXG4gIGNvbnN0IGhlbHBlcnM6IFVzZUZpbHRlcnNIZWxwZXJzPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4gPSB7XG4gICAgc2V0LFxuICAgIHBhdGNoLFxuICAgIGNsZWFyLFxuICB9O1xuICByZXR1cm4gW2ZpbHRlcnMsIGhlbHBlcnNdO1xufVxuXG5leHBvcnQgY29uc3QgdXNlUXVlcnlGaWx0ZXJzID0gdXNlRmlsdGVycztcbmV4cG9ydCBkZWZhdWx0IHVzZUZpbHRlcnM7XG4iXX0=
|
|
@@ -8,4 +8,10 @@ export { default as useQuery } from './useQuery.js';
|
|
|
8
8
|
export { default as useTypedQuery } from './useTypedQuery.js';
|
|
9
9
|
export { default as useNavigate } from './useNavigate.js';
|
|
10
10
|
export { default as useQueryState } from './useQueryState.js';
|
|
11
|
+
export { defineFilters, numberFilter, stringFilter, useFilters, useQueryFilters, } from './filters.js';
|
|
12
|
+
export { default as useFilterState } from './useFilterState.js';
|
|
13
|
+
export { default as useActiveFilters } from './useActiveFilters.js';
|
|
14
|
+
export { default as useQueryObject } from './useQueryObject.js';
|
|
15
|
+
export { default as useNavigateWithQuery } from './useNavigateWithQuery.js';
|
|
16
|
+
export { default as useStableRefEquality } from './useStableRefEquality.js';
|
|
11
17
|
//# sourceMappingURL=index.d.ts.map
|