@uengage.io/platform-sdk 0.14.0 → 1.0.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.
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * Dependency-free envelope guard for the browser realtime client.
4
+ *
5
+ * This mirrors `@uengage/common`'s `platformEventSchema` and the SDK's own
6
+ * `events/schema.ts`, but hand-rolled: the `/realtime` subpath ships with
7
+ * zero runtime dependencies (no zod, no Node built-ins) so it stays a few
8
+ * KB in a frontend bundle. Change one, change all three.
9
+ *
10
+ * NO DOMAIN CROSS-CHECK, deliberately — this is the one mirror that does
11
+ * not carry the resource→domain map, and it is not an oversight:
12
+ *
13
+ * - It would be checking the wrong thing. The producing SDK derives
14
+ * `domain` from `type` and the consuming service re-validates the pair
15
+ * before it ever publishes to a channel. By the time an envelope
16
+ * reaches a browser the pair has been checked twice server-side; a
17
+ * third check can only reject, never repair.
18
+ * - It would rot dangerously. A browser bundle sits in someone's cache
19
+ * for weeks. Baking today's map into it means that the day a new
20
+ * domain ships, every un-refreshed tab starts silently dropping live
21
+ * events for it — a stale client rejecting the future, which is the
22
+ * failure mode `validatePlatformEvent` is careful to avoid even
23
+ * server-side.
24
+ *
25
+ * So the guard is structural only: shapes and types, not membership.
26
+ * `packages/platform-sdk/test/events/domain-map.test.ts` asserts that
27
+ * every canonical domain is accepted, and that an unlisted one is too.
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.asRealtimeEvent = asRealtimeEvent;
31
+ exports.isNewer = isNewer;
32
+ /** ULID: Crockford base32, 26 chars, excludes I/L/O/U. */
33
+ const ULID_RE = /^[0-9A-HJKMNP-TV-Z]{26}$/;
34
+ /** Dotted `resource.operation`, e.g. `order.status_changed`. */
35
+ const EVENT_TYPE_RE = /^[a-z][a-z0-9_]*\.[a-z][a-z0-9_]*$/;
36
+ /**
37
+ * Structural check on an untrusted payload. Returns the event or null —
38
+ * never throws, because a single malformed frame must not tear down a
39
+ * live subscription.
40
+ */
41
+ function asRealtimeEvent(value) {
42
+ if (typeof value !== 'object' || value === null)
43
+ return null;
44
+ const v = value;
45
+ if (typeof v.id !== 'string' || !ULID_RE.test(v.id))
46
+ return null;
47
+ if (typeof v.type !== 'string' || !EVENT_TYPE_RE.test(v.type))
48
+ return null;
49
+ if (typeof v.domain !== 'string' || v.domain.length === 0)
50
+ return null;
51
+ if (typeof v.source !== 'string' || v.source.length === 0)
52
+ return null;
53
+ if (typeof v.version !== 'number' || !Number.isInteger(v.version) || v.version < 1)
54
+ return null;
55
+ if (typeof v.occurredAt !== 'string' || v.occurredAt.length === 0)
56
+ return null;
57
+ if (typeof v.tenantId !== 'string' || v.tenantId.length === 0)
58
+ return null;
59
+ if (typeof v.data !== 'object' || v.data === null || Array.isArray(v.data))
60
+ return null;
61
+ return v;
62
+ }
63
+ /**
64
+ * Ordering/dedupe guard, keyed on the envelope's monotonic ULID.
65
+ *
66
+ * ULIDs are lexicographically sortable by mint time, so a plain string
67
+ * compare orders events without parsing timestamps or knowing anything
68
+ * about the domain. This is what makes at-least-once delivery and the
69
+ * snapshot/stream race both harmless: whichever arrives second with an
70
+ * id <= the one already rendered is dropped.
71
+ */
72
+ function isNewer(candidateId, seenId) {
73
+ if (seenId === undefined)
74
+ return true;
75
+ return candidateId > seenId;
76
+ }
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52ZWxvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVhbHRpbWUvZW52ZWxvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRzs7QUF5QkgsMENBWUM7QUFXRCwwQkFHQztBQWpERCwwREFBMEQ7QUFDMUQsTUFBTSxPQUFPLEdBQUcsMEJBQTBCLENBQUM7QUFFM0MsZ0VBQWdFO0FBQ2hFLE1BQU0sYUFBYSxHQUFHLG9DQUFvQyxDQUFDO0FBYzNEOzs7O0dBSUc7QUFDSCxTQUFnQixlQUFlLENBQUMsS0FBYztJQUM1QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzdELE1BQU0sQ0FBQyxHQUFHLEtBQWdDLENBQUM7SUFDM0MsSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakUsSUFBSSxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0UsSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2RSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZFLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2hHLElBQUksT0FBTyxDQUFDLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDL0UsSUFBSSxPQUFPLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEYsT0FBTyxDQUE2QixDQUFDO0FBQ3ZDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLE9BQU8sQ0FBQyxXQUFtQixFQUFFLE1BQTBCO0lBQ3JFLElBQUksTUFBTSxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QyxPQUFPLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVwZW5kZW5jeS1mcmVlIGVudmVsb3BlIGd1YXJkIGZvciB0aGUgYnJvd3NlciByZWFsdGltZSBjbGllbnQuXG4gKlxuICogVGhpcyBtaXJyb3JzIGBAdWVuZ2FnZS9jb21tb25gJ3MgYHBsYXRmb3JtRXZlbnRTY2hlbWFgIGFuZCB0aGUgU0RLJ3Mgb3duXG4gKiBgZXZlbnRzL3NjaGVtYS50c2AsIGJ1dCBoYW5kLXJvbGxlZDogdGhlIGAvcmVhbHRpbWVgIHN1YnBhdGggc2hpcHMgd2l0aFxuICogemVybyBydW50aW1lIGRlcGVuZGVuY2llcyAobm8gem9kLCBubyBOb2RlIGJ1aWx0LWlucykgc28gaXQgc3RheXMgYSBmZXdcbiAqIEtCIGluIGEgZnJvbnRlbmQgYnVuZGxlLiBDaGFuZ2Ugb25lLCBjaGFuZ2UgYWxsIHRocmVlLlxuICpcbiAqIE5PIERPTUFJTiBDUk9TUy1DSEVDSywgZGVsaWJlcmF0ZWx5IOKAlCB0aGlzIGlzIHRoZSBvbmUgbWlycm9yIHRoYXQgZG9lc1xuICogbm90IGNhcnJ5IHRoZSByZXNvdXJjZeKGkmRvbWFpbiBtYXAsIGFuZCBpdCBpcyBub3QgYW4gb3ZlcnNpZ2h0OlxuICpcbiAqICAgLSBJdCB3b3VsZCBiZSBjaGVja2luZyB0aGUgd3JvbmcgdGhpbmcuIFRoZSBwcm9kdWNpbmcgU0RLIGRlcml2ZXNcbiAqICAgICBgZG9tYWluYCBmcm9tIGB0eXBlYCBhbmQgdGhlIGNvbnN1bWluZyBzZXJ2aWNlIHJlLXZhbGlkYXRlcyB0aGUgcGFpclxuICogICAgIGJlZm9yZSBpdCBldmVyIHB1Ymxpc2hlcyB0byBhIGNoYW5uZWwuIEJ5IHRoZSB0aW1lIGFuIGVudmVsb3BlXG4gKiAgICAgcmVhY2hlcyBhIGJyb3dzZXIgdGhlIHBhaXIgaGFzIGJlZW4gY2hlY2tlZCB0d2ljZSBzZXJ2ZXItc2lkZTsgYVxuICogICAgIHRoaXJkIGNoZWNrIGNhbiBvbmx5IHJlamVjdCwgbmV2ZXIgcmVwYWlyLlxuICogICAtIEl0IHdvdWxkIHJvdCBkYW5nZXJvdXNseS4gQSBicm93c2VyIGJ1bmRsZSBzaXRzIGluIHNvbWVvbmUncyBjYWNoZVxuICogICAgIGZvciB3ZWVrcy4gQmFraW5nIHRvZGF5J3MgbWFwIGludG8gaXQgbWVhbnMgdGhhdCB0aGUgZGF5IGEgbmV3XG4gKiAgICAgZG9tYWluIHNoaXBzLCBldmVyeSB1bi1yZWZyZXNoZWQgdGFiIHN0YXJ0cyBzaWxlbnRseSBkcm9wcGluZyBsaXZlXG4gKiAgICAgZXZlbnRzIGZvciBpdCDigJQgYSBzdGFsZSBjbGllbnQgcmVqZWN0aW5nIHRoZSBmdXR1cmUsIHdoaWNoIGlzIHRoZVxuICogICAgIGZhaWx1cmUgbW9kZSBgdmFsaWRhdGVQbGF0Zm9ybUV2ZW50YCBpcyBjYXJlZnVsIHRvIGF2b2lkIGV2ZW5cbiAqICAgICBzZXJ2ZXItc2lkZS5cbiAqXG4gKiBTbyB0aGUgZ3VhcmQgaXMgc3RydWN0dXJhbCBvbmx5OiBzaGFwZXMgYW5kIHR5cGVzLCBub3QgbWVtYmVyc2hpcC5cbiAqIGBwYWNrYWdlcy9wbGF0Zm9ybS1zZGsvdGVzdC9ldmVudHMvZG9tYWluLW1hcC50ZXN0LnRzYCBhc3NlcnRzIHRoYXRcbiAqIGV2ZXJ5IGNhbm9uaWNhbCBkb21haW4gaXMgYWNjZXB0ZWQsIGFuZCB0aGF0IGFuIHVubGlzdGVkIG9uZSBpcyB0b28uXG4gKi9cblxuLyoqIFVMSUQ6IENyb2NrZm9yZCBiYXNlMzIsIDI2IGNoYXJzLCBleGNsdWRlcyBJL0wvTy9VLiAqL1xuY29uc3QgVUxJRF9SRSA9IC9eWzAtOUEtSEpLTU5QLVRWLVpdezI2fSQvO1xuXG4vKiogRG90dGVkIGByZXNvdXJjZS5vcGVyYXRpb25gLCBlLmcuIGBvcmRlci5zdGF0dXNfY2hhbmdlZGAuICovXG5jb25zdCBFVkVOVF9UWVBFX1JFID0gL15bYS16XVthLXowLTlfXSpcXC5bYS16XVthLXowLTlfXSokLztcblxuLyoqIFRoZSBwbGF0Zm9ybSBldmVudC1idXMgZW52ZWxvcGUsIGFzIGl0IGFycml2ZXMgYXQgYSBicm93c2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFsdGltZUV2ZW50IHtcbiAgaWQ6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBkb21haW46IHN0cmluZztcbiAgc291cmNlOiBzdHJpbmc7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgb2NjdXJyZWRBdDogc3RyaW5nO1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGNoZWNrIG9uIGFuIHVudHJ1c3RlZCBwYXlsb2FkLiBSZXR1cm5zIHRoZSBldmVudCBvciBudWxsIOKAlFxuICogbmV2ZXIgdGhyb3dzLCBiZWNhdXNlIGEgc2luZ2xlIG1hbGZvcm1lZCBmcmFtZSBtdXN0IG5vdCB0ZWFyIGRvd24gYVxuICogbGl2ZSBzdWJzY3JpcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc1JlYWx0aW1lRXZlbnQodmFsdWU6IHVua25vd24pOiBSZWFsdGltZUV2ZW50IHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgdiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodHlwZW9mIHYuaWQgIT09ICdzdHJpbmcnIHx8ICFVTElEX1JFLnRlc3Qodi5pZCkpIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIHYudHlwZSAhPT0gJ3N0cmluZycgfHwgIUVWRU5UX1RZUEVfUkUudGVzdCh2LnR5cGUpKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiB2LmRvbWFpbiAhPT0gJ3N0cmluZycgfHwgdi5kb21haW4ubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiB2LnNvdXJjZSAhPT0gJ3N0cmluZycgfHwgdi5zb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiB2LnZlcnNpb24gIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHYudmVyc2lvbikgfHwgdi52ZXJzaW9uIDwgMSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2Ygdi5vY2N1cnJlZEF0ICE9PSAnc3RyaW5nJyB8fCB2Lm9jY3VycmVkQXQubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiB2LnRlbmFudElkICE9PSAnc3RyaW5nJyB8fCB2LnRlbmFudElkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2Ygdi5kYXRhICE9PSAnb2JqZWN0JyB8fCB2LmRhdGEgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheSh2LmRhdGEpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHYgYXMgdW5rbm93biBhcyBSZWFsdGltZUV2ZW50O1xufVxuXG4vKipcbiAqIE9yZGVyaW5nL2RlZHVwZSBndWFyZCwga2V5ZWQgb24gdGhlIGVudmVsb3BlJ3MgbW9ub3RvbmljIFVMSUQuXG4gKlxuICogVUxJRHMgYXJlIGxleGljb2dyYXBoaWNhbGx5IHNvcnRhYmxlIGJ5IG1pbnQgdGltZSwgc28gYSBwbGFpbiBzdHJpbmdcbiAqIGNvbXBhcmUgb3JkZXJzIGV2ZW50cyB3aXRob3V0IHBhcnNpbmcgdGltZXN0YW1wcyBvciBrbm93aW5nIGFueXRoaW5nXG4gKiBhYm91dCB0aGUgZG9tYWluLiBUaGlzIGlzIHdoYXQgbWFrZXMgYXQtbGVhc3Qtb25jZSBkZWxpdmVyeSBhbmQgdGhlXG4gKiBzbmFwc2hvdC9zdHJlYW0gcmFjZSBib3RoIGhhcm1sZXNzOiB3aGljaGV2ZXIgYXJyaXZlcyBzZWNvbmQgd2l0aCBhblxuICogaWQgPD0gdGhlIG9uZSBhbHJlYWR5IHJlbmRlcmVkIGlzIGRyb3BwZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05ld2VyKGNhbmRpZGF0ZUlkOiBzdHJpbmcsIHNlZW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmIChzZWVuSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBjYW5kaWRhdGVJZCA+IHNlZW5JZDtcbn1cbiJdfQ==
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `@uengage.io/platform-sdk/realtime` — browser-safe realtime client.
3
+ *
4
+ * A thin client for the platform's AppSync Events API: it owns the wire
5
+ * protocol, the keepalive watchdog, reconnect with jittered backoff,
6
+ * resubscribe, token refresh, snapshot catch-up on every (re)connect,
7
+ * and ULID-based ordering/dedupe. Apps own rendering and channel names.
8
+ *
9
+ * ```ts
10
+ * import { realtime } from '@uengage.io/platform-sdk/realtime';
11
+ *
12
+ * const client = realtime.connect({
13
+ * env: 'prod',
14
+ * getToken: () => session.jwt(),
15
+ * });
16
+ *
17
+ * const sub = client.subscribe(`/orders/${orderId}`, {
18
+ * onUpdate(event, meta) { render(event.data); },
19
+ * onError(err) { showOffline(err); },
20
+ * });
21
+ *
22
+ * sub.unsubscribe();
23
+ * ```
24
+ *
25
+ * This subpath is deliberately isolated from the SDK's main entry: zero
26
+ * runtime dependencies, no Node built-ins, no server auth code, so it
27
+ * stays a few KB in a frontend bundle and works unchanged in React
28
+ * Native. Do not import from `../` here.
29
+ */
30
+ import { connect } from './connect';
31
+ export declare const realtime: {
32
+ connect: typeof connect;
33
+ };
34
+ export { connect, jitteredBackoff, type RealtimeClient, type RealtimeConnectOptions, type Subscription, type SubscribeOptions, type UpdateMeta, type MinimalWebSocket, type WebSocketCtor, } from './connect';
35
+ export { asRealtimeEvent, isNewer, type RealtimeEvent } from './envelope';
36
+ export { API_BASE, endpointsFor, type RealtimeEndpoints, type RealtimeEnv } from './endpoints';
37
+ export { EVENT_WS_SUBPROTOCOL, authHeader, authSubprotocol, base64UrlEncode } from './protocol';
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.base64UrlEncode = exports.authSubprotocol = exports.authHeader = exports.EVENT_WS_SUBPROTOCOL = exports.endpointsFor = exports.API_BASE = exports.isNewer = exports.asRealtimeEvent = exports.jitteredBackoff = exports.connect = exports.realtime = void 0;
4
+ /**
5
+ * `@uengage.io/platform-sdk/realtime` — browser-safe realtime client.
6
+ *
7
+ * A thin client for the platform's AppSync Events API: it owns the wire
8
+ * protocol, the keepalive watchdog, reconnect with jittered backoff,
9
+ * resubscribe, token refresh, snapshot catch-up on every (re)connect,
10
+ * and ULID-based ordering/dedupe. Apps own rendering and channel names.
11
+ *
12
+ * ```ts
13
+ * import { realtime } from '@uengage.io/platform-sdk/realtime';
14
+ *
15
+ * const client = realtime.connect({
16
+ * env: 'prod',
17
+ * getToken: () => session.jwt(),
18
+ * });
19
+ *
20
+ * const sub = client.subscribe(`/orders/${orderId}`, {
21
+ * onUpdate(event, meta) { render(event.data); },
22
+ * onError(err) { showOffline(err); },
23
+ * });
24
+ *
25
+ * sub.unsubscribe();
26
+ * ```
27
+ *
28
+ * This subpath is deliberately isolated from the SDK's main entry: zero
29
+ * runtime dependencies, no Node built-ins, no server auth code, so it
30
+ * stays a few KB in a frontend bundle and works unchanged in React
31
+ * Native. Do not import from `../` here.
32
+ */
33
+ const connect_1 = require("./connect");
34
+ exports.realtime = { connect: connect_1.connect };
35
+ var connect_2 = require("./connect");
36
+ Object.defineProperty(exports, "connect", { enumerable: true, get: function () { return connect_2.connect; } });
37
+ Object.defineProperty(exports, "jitteredBackoff", { enumerable: true, get: function () { return connect_2.jitteredBackoff; } });
38
+ var envelope_1 = require("./envelope");
39
+ Object.defineProperty(exports, "asRealtimeEvent", { enumerable: true, get: function () { return envelope_1.asRealtimeEvent; } });
40
+ Object.defineProperty(exports, "isNewer", { enumerable: true, get: function () { return envelope_1.isNewer; } });
41
+ var endpoints_1 = require("./endpoints");
42
+ Object.defineProperty(exports, "API_BASE", { enumerable: true, get: function () { return endpoints_1.API_BASE; } });
43
+ Object.defineProperty(exports, "endpointsFor", { enumerable: true, get: function () { return endpoints_1.endpointsFor; } });
44
+ var protocol_1 = require("./protocol");
45
+ Object.defineProperty(exports, "EVENT_WS_SUBPROTOCOL", { enumerable: true, get: function () { return protocol_1.EVENT_WS_SUBPROTOCOL; } });
46
+ Object.defineProperty(exports, "authHeader", { enumerable: true, get: function () { return protocol_1.authHeader; } });
47
+ Object.defineProperty(exports, "authSubprotocol", { enumerable: true, get: function () { return protocol_1.authSubprotocol; } });
48
+ Object.defineProperty(exports, "base64UrlEncode", { enumerable: true, get: function () { return protocol_1.base64UrlEncode; } });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVhbHRpbWUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFDSCx1Q0FBb0M7QUFFdkIsUUFBQSxRQUFRLEdBQUcsRUFBRSxPQUFPLEVBQVAsaUJBQU8sRUFBRSxDQUFDO0FBRXBDLHFDQVVtQjtBQVRqQixrR0FBQSxPQUFPLE9BQUE7QUFDUCwwR0FBQSxlQUFlLE9BQUE7QUFTakIsdUNBQTBFO0FBQWpFLDJHQUFBLGVBQWUsT0FBQTtBQUFFLG1HQUFBLE9BQU8sT0FBQTtBQUNqQyx5Q0FBK0Y7QUFBdEYscUdBQUEsUUFBUSxPQUFBO0FBQUUseUdBQUEsWUFBWSxPQUFBO0FBQy9CLHVDQUFnRztBQUF2RixnSEFBQSxvQkFBb0IsT0FBQTtBQUFFLHNHQUFBLFVBQVUsT0FBQTtBQUFFLDJHQUFBLGVBQWUsT0FBQTtBQUFFLDJHQUFBLGVBQWUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYEB1ZW5nYWdlLmlvL3BsYXRmb3JtLXNkay9yZWFsdGltZWAg4oCUIGJyb3dzZXItc2FmZSByZWFsdGltZSBjbGllbnQuXG4gKlxuICogQSB0aGluIGNsaWVudCBmb3IgdGhlIHBsYXRmb3JtJ3MgQXBwU3luYyBFdmVudHMgQVBJOiBpdCBvd25zIHRoZSB3aXJlXG4gKiBwcm90b2NvbCwgdGhlIGtlZXBhbGl2ZSB3YXRjaGRvZywgcmVjb25uZWN0IHdpdGggaml0dGVyZWQgYmFja29mZixcbiAqIHJlc3Vic2NyaWJlLCB0b2tlbiByZWZyZXNoLCBzbmFwc2hvdCBjYXRjaC11cCBvbiBldmVyeSAocmUpY29ubmVjdCxcbiAqIGFuZCBVTElELWJhc2VkIG9yZGVyaW5nL2RlZHVwZS4gQXBwcyBvd24gcmVuZGVyaW5nIGFuZCBjaGFubmVsIG5hbWVzLlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyByZWFsdGltZSB9IGZyb20gJ0B1ZW5nYWdlLmlvL3BsYXRmb3JtLXNkay9yZWFsdGltZSc7XG4gKlxuICogY29uc3QgY2xpZW50ID0gcmVhbHRpbWUuY29ubmVjdCh7XG4gKiAgIGVudjogJ3Byb2QnLFxuICogICBnZXRUb2tlbjogKCkgPT4gc2Vzc2lvbi5qd3QoKSxcbiAqIH0pO1xuICpcbiAqIGNvbnN0IHN1YiA9IGNsaWVudC5zdWJzY3JpYmUoYC9vcmRlcnMvJHtvcmRlcklkfWAsIHtcbiAqICAgb25VcGRhdGUoZXZlbnQsIG1ldGEpIHsgcmVuZGVyKGV2ZW50LmRhdGEpOyB9LFxuICogICBvbkVycm9yKGVycikgeyBzaG93T2ZmbGluZShlcnIpOyB9LFxuICogfSk7XG4gKlxuICogc3ViLnVuc3Vic2NyaWJlKCk7XG4gKiBgYGBcbiAqXG4gKiBUaGlzIHN1YnBhdGggaXMgZGVsaWJlcmF0ZWx5IGlzb2xhdGVkIGZyb20gdGhlIFNESydzIG1haW4gZW50cnk6IHplcm9cbiAqIHJ1bnRpbWUgZGVwZW5kZW5jaWVzLCBubyBOb2RlIGJ1aWx0LWlucywgbm8gc2VydmVyIGF1dGggY29kZSwgc28gaXRcbiAqIHN0YXlzIGEgZmV3IEtCIGluIGEgZnJvbnRlbmQgYnVuZGxlIGFuZCB3b3JrcyB1bmNoYW5nZWQgaW4gUmVhY3RcbiAqIE5hdGl2ZS4gRG8gbm90IGltcG9ydCBmcm9tIGAuLi9gIGhlcmUuXG4gKi9cbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICcuL2Nvbm5lY3QnO1xuXG5leHBvcnQgY29uc3QgcmVhbHRpbWUgPSB7IGNvbm5lY3QgfTtcblxuZXhwb3J0IHtcbiAgY29ubmVjdCxcbiAgaml0dGVyZWRCYWNrb2ZmLFxuICB0eXBlIFJlYWx0aW1lQ2xpZW50LFxuICB0eXBlIFJlYWx0aW1lQ29ubmVjdE9wdGlvbnMsXG4gIHR5cGUgU3Vic2NyaXB0aW9uLFxuICB0eXBlIFN1YnNjcmliZU9wdGlvbnMsXG4gIHR5cGUgVXBkYXRlTWV0YSxcbiAgdHlwZSBNaW5pbWFsV2ViU29ja2V0LFxuICB0eXBlIFdlYlNvY2tldEN0b3IsXG59IGZyb20gJy4vY29ubmVjdCc7XG5leHBvcnQgeyBhc1JlYWx0aW1lRXZlbnQsIGlzTmV3ZXIsIHR5cGUgUmVhbHRpbWVFdmVudCB9IGZyb20gJy4vZW52ZWxvcGUnO1xuZXhwb3J0IHsgQVBJX0JBU0UsIGVuZHBvaW50c0ZvciwgdHlwZSBSZWFsdGltZUVuZHBvaW50cywgdHlwZSBSZWFsdGltZUVudiB9IGZyb20gJy4vZW5kcG9pbnRzJztcbmV4cG9ydCB7IEVWRU5UX1dTX1NVQlBST1RPQ09MLCBhdXRoSGVhZGVyLCBhdXRoU3VicHJvdG9jb2wsIGJhc2U2NFVybEVuY29kZSB9IGZyb20gJy4vcHJvdG9jb2wnO1xuIl19
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The AppSync Events WebSocket wire protocol, as documented at
3
+ * https://docs.aws.amazon.com/appsync/latest/eventapi/event-api-websocket-protocol.html
4
+ *
5
+ * Everything here is pure data + string manipulation: no I/O, no
6
+ * dependencies, no Node built-ins. The socket lifecycle lives in
7
+ * `connect.ts`.
8
+ */
9
+ /** WebSocket subprotocol that selects the Events (not GraphQL) protocol. */
10
+ export declare const EVENT_WS_SUBPROTOCOL = "aws-appsync-event-ws";
11
+ /**
12
+ * AppSync takes connection auth as a *subprotocol*, because a browser
13
+ * WebSocket cannot set request headers. The auth header object is
14
+ * JSON-encoded, base64url-encoded, and prefixed with `header-`.
15
+ */
16
+ export declare function authSubprotocol(header: Record<string, string>): string;
17
+ /**
18
+ * The auth object AppSync expects, for both the connection handshake and
19
+ * each `subscribe` frame. `host` must be the API's HTTP domain (not the
20
+ * realtime domain) — AppSync validates the signature/token against it.
21
+ */
22
+ export declare function authHeader(httpHost: string, token: string): Record<string, string>;
23
+ /**
24
+ * base64url with padding stripped. Uses `btoa` over UTF-8 bytes rather
25
+ * than `Buffer`, which does not exist in a browser.
26
+ */
27
+ export declare function base64UrlEncode(input: string): string;
28
+ export interface ConnectionAckFrame {
29
+ type: 'connection_ack';
30
+ /**
31
+ * How long the server will tolerate silence before it closes the
32
+ * connection. The client watchdog uses this rather than a hard-coded
33
+ * 60s so a server-side change doesn't strand us.
34
+ */
35
+ connectionTimeoutMs?: number;
36
+ }
37
+ export interface DataFrame {
38
+ type: 'data';
39
+ id: string;
40
+ /**
41
+ * The published payload, JSON-encoded *inside* the already-JSON frame.
42
+ * Double-encoded on the wire; `parseDataFrameEvent` unwraps both.
43
+ */
44
+ event: string;
45
+ }
46
+ export interface ErrorFrame {
47
+ type: 'connection_error' | 'subscribe_error' | 'publish_error';
48
+ id?: string;
49
+ errors?: Array<{
50
+ errorType?: string;
51
+ message?: string;
52
+ }>;
53
+ }
54
+ export type ServerFrame = ConnectionAckFrame | DataFrame | ErrorFrame | {
55
+ type: 'ka';
56
+ } | {
57
+ type: 'subscribe_success';
58
+ id: string;
59
+ } | {
60
+ type: 'unsubscribe_success';
61
+ id: string;
62
+ } | {
63
+ type: string;
64
+ [k: string]: unknown;
65
+ };
66
+ export declare function parseServerFrame(raw: string): ServerFrame | null;
67
+ /** Unwrap the inner JSON of a `data` frame. Null if it isn't parseable. */
68
+ export declare function parseDataFrameEvent(frame: DataFrame): unknown;
69
+ /** Human-readable text from an error frame, for `onError`. */
70
+ export declare function errorFrameMessage(frame: ErrorFrame): string;
71
+ export declare function connectionInitFrame(): string;
72
+ export declare function subscribeFrame(id: string, channel: string, auth: Record<string, string>): string;
73
+ export declare function unsubscribeFrame(id: string): string;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ /**
3
+ * The AppSync Events WebSocket wire protocol, as documented at
4
+ * https://docs.aws.amazon.com/appsync/latest/eventapi/event-api-websocket-protocol.html
5
+ *
6
+ * Everything here is pure data + string manipulation: no I/O, no
7
+ * dependencies, no Node built-ins. The socket lifecycle lives in
8
+ * `connect.ts`.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.EVENT_WS_SUBPROTOCOL = void 0;
12
+ exports.authSubprotocol = authSubprotocol;
13
+ exports.authHeader = authHeader;
14
+ exports.base64UrlEncode = base64UrlEncode;
15
+ exports.parseServerFrame = parseServerFrame;
16
+ exports.parseDataFrameEvent = parseDataFrameEvent;
17
+ exports.errorFrameMessage = errorFrameMessage;
18
+ exports.connectionInitFrame = connectionInitFrame;
19
+ exports.subscribeFrame = subscribeFrame;
20
+ exports.unsubscribeFrame = unsubscribeFrame;
21
+ /** WebSocket subprotocol that selects the Events (not GraphQL) protocol. */
22
+ exports.EVENT_WS_SUBPROTOCOL = 'aws-appsync-event-ws';
23
+ /**
24
+ * AppSync takes connection auth as a *subprotocol*, because a browser
25
+ * WebSocket cannot set request headers. The auth header object is
26
+ * JSON-encoded, base64url-encoded, and prefixed with `header-`.
27
+ */
28
+ function authSubprotocol(header) {
29
+ return `header-${base64UrlEncode(JSON.stringify(header))}`;
30
+ }
31
+ /**
32
+ * The auth object AppSync expects, for both the connection handshake and
33
+ * each `subscribe` frame. `host` must be the API's HTTP domain (not the
34
+ * realtime domain) — AppSync validates the signature/token against it.
35
+ */
36
+ function authHeader(httpHost, token) {
37
+ return { host: httpHost, Authorization: token };
38
+ }
39
+ /**
40
+ * base64url with padding stripped. Uses `btoa` over UTF-8 bytes rather
41
+ * than `Buffer`, which does not exist in a browser.
42
+ */
43
+ function base64UrlEncode(input) {
44
+ const bytes = new TextEncoder().encode(input);
45
+ let binary = '';
46
+ for (let i = 0; i < bytes.length; i++)
47
+ binary += String.fromCharCode(bytes[i]);
48
+ return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
49
+ }
50
+ function parseServerFrame(raw) {
51
+ try {
52
+ const parsed = JSON.parse(raw);
53
+ if (typeof parsed !== 'object' || parsed === null)
54
+ return null;
55
+ const frame = parsed;
56
+ if (typeof frame.type !== 'string')
57
+ return null;
58
+ return parsed;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ /** Unwrap the inner JSON of a `data` frame. Null if it isn't parseable. */
65
+ function parseDataFrameEvent(frame) {
66
+ try {
67
+ return JSON.parse(frame.event);
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ /** Human-readable text from an error frame, for `onError`. */
74
+ function errorFrameMessage(frame) {
75
+ const parts = (frame.errors ?? [])
76
+ .map((e) => e.message ?? e.errorType)
77
+ .filter((m) => typeof m === 'string' && m.length > 0);
78
+ return parts.length > 0 ? parts.join('; ') : frame.type;
79
+ }
80
+ function connectionInitFrame() {
81
+ return JSON.stringify({ type: 'connection_init' });
82
+ }
83
+ function subscribeFrame(id, channel, auth) {
84
+ return JSON.stringify({ type: 'subscribe', id, channel, authorization: auth });
85
+ }
86
+ function unsubscribeFrame(id) {
87
+ return JSON.stringify({ type: 'unsubscribe', id });
88
+ }
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVhbHRpbWUvcHJvdG9jb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7OztBQVVILDBDQUVDO0FBT0QsZ0NBRUM7QUFNRCwwQ0FLQztBQXVDRCw0Q0FVQztBQUdELGtEQU1DO0FBR0QsOENBS0M7QUFFRCxrREFFQztBQUVELHdDQUVDO0FBRUQsNENBRUM7QUE1R0QsNEVBQTRFO0FBQy9ELFFBQUEsb0JBQW9CLEdBQUcsc0JBQXNCLENBQUM7QUFFM0Q7Ozs7R0FJRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxNQUE4QjtJQUM1RCxPQUFPLFVBQVUsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLFFBQWdCLEVBQUUsS0FBYTtJQUN4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxLQUFhO0lBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBdUNELFNBQWdCLGdCQUFnQixDQUFDLEdBQVc7SUFDMUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQVksQ0FBQztRQUMxQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9ELE1BQU0sS0FBSyxHQUFHLE1BQTRCLENBQUM7UUFDM0MsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hELE9BQU8sTUFBcUIsQ0FBQztJQUMvQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxTQUFnQixtQkFBbUIsQ0FBQyxLQUFnQjtJQUNsRCxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBWSxDQUFDO0lBQzVDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsOERBQThEO0FBQzlELFNBQWdCLGlCQUFpQixDQUFDLEtBQWlCO0lBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7U0FDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7U0FDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyRSxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFnQixtQkFBbUI7SUFDakMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLEVBQVUsRUFBRSxPQUFlLEVBQUUsSUFBNEI7SUFDdEYsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxFQUFVO0lBQ3pDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgQXBwU3luYyBFdmVudHMgV2ViU29ja2V0IHdpcmUgcHJvdG9jb2wsIGFzIGRvY3VtZW50ZWQgYXRcbiAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcHBzeW5jL2xhdGVzdC9ldmVudGFwaS9ldmVudC1hcGktd2Vic29ja2V0LXByb3RvY29sLmh0bWxcbiAqXG4gKiBFdmVyeXRoaW5nIGhlcmUgaXMgcHVyZSBkYXRhICsgc3RyaW5nIG1hbmlwdWxhdGlvbjogbm8gSS9PLCBub1xuICogZGVwZW5kZW5jaWVzLCBubyBOb2RlIGJ1aWx0LWlucy4gVGhlIHNvY2tldCBsaWZlY3ljbGUgbGl2ZXMgaW5cbiAqIGBjb25uZWN0LnRzYC5cbiAqL1xuXG4vKiogV2ViU29ja2V0IHN1YnByb3RvY29sIHRoYXQgc2VsZWN0cyB0aGUgRXZlbnRzIChub3QgR3JhcGhRTCkgcHJvdG9jb2wuICovXG5leHBvcnQgY29uc3QgRVZFTlRfV1NfU1VCUFJPVE9DT0wgPSAnYXdzLWFwcHN5bmMtZXZlbnQtd3MnO1xuXG4vKipcbiAqIEFwcFN5bmMgdGFrZXMgY29ubmVjdGlvbiBhdXRoIGFzIGEgKnN1YnByb3RvY29sKiwgYmVjYXVzZSBhIGJyb3dzZXJcbiAqIFdlYlNvY2tldCBjYW5ub3Qgc2V0IHJlcXVlc3QgaGVhZGVycy4gVGhlIGF1dGggaGVhZGVyIG9iamVjdCBpc1xuICogSlNPTi1lbmNvZGVkLCBiYXNlNjR1cmwtZW5jb2RlZCwgYW5kIHByZWZpeGVkIHdpdGggYGhlYWRlci1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXV0aFN1YnByb3RvY29sKGhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyB7XG4gIHJldHVybiBgaGVhZGVyLSR7YmFzZTY0VXJsRW5jb2RlKEpTT04uc3RyaW5naWZ5KGhlYWRlcikpfWA7XG59XG5cbi8qKlxuICogVGhlIGF1dGggb2JqZWN0IEFwcFN5bmMgZXhwZWN0cywgZm9yIGJvdGggdGhlIGNvbm5lY3Rpb24gaGFuZHNoYWtlIGFuZFxuICogZWFjaCBgc3Vic2NyaWJlYCBmcmFtZS4gYGhvc3RgIG11c3QgYmUgdGhlIEFQSSdzIEhUVFAgZG9tYWluIChub3QgdGhlXG4gKiByZWFsdGltZSBkb21haW4pIOKAlCBBcHBTeW5jIHZhbGlkYXRlcyB0aGUgc2lnbmF0dXJlL3Rva2VuIGFnYWluc3QgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRoSGVhZGVyKGh0dHBIb3N0OiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIHsgaG9zdDogaHR0cEhvc3QsIEF1dGhvcml6YXRpb246IHRva2VuIH07XG59XG5cbi8qKlxuICogYmFzZTY0dXJsIHdpdGggcGFkZGluZyBzdHJpcHBlZC4gVXNlcyBgYnRvYWAgb3ZlciBVVEYtOCBieXRlcyByYXRoZXJcbiAqIHRoYW4gYEJ1ZmZlcmAsIHdoaWNoIGRvZXMgbm90IGV4aXN0IGluIGEgYnJvd3Nlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFVybEVuY29kZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoaW5wdXQpO1xuICBsZXQgYmluYXJ5ID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KS5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59XG5cbi8vIOKUgOKUgOKUgCBGcmFtZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbkFja0ZyYW1lIHtcbiAgdHlwZTogJ2Nvbm5lY3Rpb25fYWNrJztcbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBzZXJ2ZXIgd2lsbCB0b2xlcmF0ZSBzaWxlbmNlIGJlZm9yZSBpdCBjbG9zZXMgdGhlXG4gICAqIGNvbm5lY3Rpb24uIFRoZSBjbGllbnQgd2F0Y2hkb2cgdXNlcyB0aGlzIHJhdGhlciB0aGFuIGEgaGFyZC1jb2RlZFxuICAgKiA2MHMgc28gYSBzZXJ2ZXItc2lkZSBjaGFuZ2UgZG9lc24ndCBzdHJhbmQgdXMuXG4gICAqL1xuICBjb25uZWN0aW9uVGltZW91dE1zPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFGcmFtZSB7XG4gIHR5cGU6ICdkYXRhJztcbiAgaWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwdWJsaXNoZWQgcGF5bG9hZCwgSlNPTi1lbmNvZGVkICppbnNpZGUqIHRoZSBhbHJlYWR5LUpTT04gZnJhbWUuXG4gICAqIERvdWJsZS1lbmNvZGVkIG9uIHRoZSB3aXJlOyBgcGFyc2VEYXRhRnJhbWVFdmVudGAgdW53cmFwcyBib3RoLlxuICAgKi9cbiAgZXZlbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckZyYW1lIHtcbiAgdHlwZTogJ2Nvbm5lY3Rpb25fZXJyb3InIHwgJ3N1YnNjcmliZV9lcnJvcicgfCAncHVibGlzaF9lcnJvcic7XG4gIGlkPzogc3RyaW5nO1xuICBlcnJvcnM/OiBBcnJheTx7IGVycm9yVHlwZT86IHN0cmluZzsgbWVzc2FnZT86IHN0cmluZyB9Pjtcbn1cblxuZXhwb3J0IHR5cGUgU2VydmVyRnJhbWUgPVxuICB8IENvbm5lY3Rpb25BY2tGcmFtZVxuICB8IERhdGFGcmFtZVxuICB8IEVycm9yRnJhbWVcbiAgfCB7IHR5cGU6ICdrYScgfVxuICB8IHsgdHlwZTogJ3N1YnNjcmliZV9zdWNjZXNzJzsgaWQ6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAndW5zdWJzY3JpYmVfc3VjY2Vzcyc7IGlkOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogc3RyaW5nOyBbazogc3RyaW5nXTogdW5rbm93biB9O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZXJ2ZXJGcmFtZShyYXc6IHN0cmluZyk6IFNlcnZlckZyYW1lIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpIGFzIHVua25vd247XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IHBhcnNlZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZnJhbWUgPSBwYXJzZWQgYXMgeyB0eXBlPzogdW5rbm93biB9O1xuICAgIGlmICh0eXBlb2YgZnJhbWUudHlwZSAhPT0gJ3N0cmluZycpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBwYXJzZWQgYXMgU2VydmVyRnJhbWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKiBVbndyYXAgdGhlIGlubmVyIEpTT04gb2YgYSBgZGF0YWAgZnJhbWUuIE51bGwgaWYgaXQgaXNuJ3QgcGFyc2VhYmxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0YUZyYW1lRXZlbnQoZnJhbWU6IERhdGFGcmFtZSk6IHVua25vd24ge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZyYW1lLmV2ZW50KSBhcyB1bmtub3duO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKiogSHVtYW4tcmVhZGFibGUgdGV4dCBmcm9tIGFuIGVycm9yIGZyYW1lLCBmb3IgYG9uRXJyb3JgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yRnJhbWVNZXNzYWdlKGZyYW1lOiBFcnJvckZyYW1lKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHMgPSAoZnJhbWUuZXJyb3JzID8/IFtdKVxuICAgIC5tYXAoKGUpID0+IGUubWVzc2FnZSA/PyBlLmVycm9yVHlwZSlcbiAgICAuZmlsdGVyKChtKTogbSBpcyBzdHJpbmcgPT4gdHlwZW9mIG0gPT09ICdzdHJpbmcnICYmIG0ubGVuZ3RoID4gMCk7XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHMuam9pbignOyAnKSA6IGZyYW1lLnR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25uZWN0aW9uSW5pdEZyYW1lKCk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdjb25uZWN0aW9uX2luaXQnIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Vic2NyaWJlRnJhbWUoaWQ6IHN0cmluZywgY2hhbm5lbDogc3RyaW5nLCBhdXRoOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3N1YnNjcmliZScsIGlkLCBjaGFubmVsLCBhdXRob3JpemF0aW9uOiBhdXRoIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5zdWJzY3JpYmVGcmFtZShpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3Vuc3Vic2NyaWJlJywgaWQgfSk7XG59XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import { type PlatformAuth, type PlatformAuthInput, type PlatformConfigInput } from '../config';
2
- import type { ContainingInput, Zone, ZoneCreateInput, ZoneCreateResult, ZoneListOptions, ZoneListPage, ZonePatchInput, ZoneReplaceInput, ZoneSummary } from './schema';
2
+ import type { ContainingInput, IntersectingInput, NearbyInput, Zone, ZoneCreateInput, ZoneCreateResult, ZoneListOptions, ZoneListPage, ZoneNearby, ZonePatchInput, ZoneReplaceInput, ZoneSummary } from './schema';
3
3
  export interface ZonesClient {
4
4
  config(input: PlatformConfigInput): ZonesClient;
5
5
  auth(input: PlatformAuthInput | PlatformAuth): ZonesClient;
@@ -29,6 +29,10 @@ export interface ZonesClient {
29
29
  containing(input: ContainingInput): Promise<ZoneSummary[]>;
30
30
  /** Sugar over containing({ point, ids: [zid] }). True iff the zone contains the point. */
31
31
  contains(zid: string, point: ContainingInput['point']): Promise<boolean>;
32
+ /** POST /v1/zones/nearby - zones within `radiusMeters` of a point, ordered by distance asc. */
33
+ nearby(input: NearbyInput): Promise<ZoneNearby[]>;
34
+ /** POST /v1/zones/intersecting - zones whose geometry overlaps the given geometry. */
35
+ intersecting(input: IntersectingInput): Promise<ZoneSummary[]>;
32
36
  }
33
37
  export declare class ZonesApiError extends Error {
34
38
  readonly status: number;
@@ -34,6 +34,22 @@ function assertPoint(label, point) {
34
34
  throw new Error(`zones.${label}: lng must be in [-180, 180] (got ${lng})`);
35
35
  }
36
36
  }
37
+ function assertGeometry(label, geometry) {
38
+ const type = geometry?.type;
39
+ if (type !== 'Polygon' && type !== 'MultiPolygon') {
40
+ throw new Error(`zones.${label}: geometry.type must be Polygon or MultiPolygon (got ${JSON.stringify(type)})`);
41
+ }
42
+ }
43
+ function assertPositiveNumber(label, field, value) {
44
+ if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
45
+ throw new Error(`zones.${label}: ${field} must be a positive number (got ${value})`);
46
+ }
47
+ }
48
+ function assertPositiveInt(label, field, value) {
49
+ if (!Number.isInteger(value) || value <= 0) {
50
+ throw new Error(`zones.${label}: ${field} must be a positive integer (got ${value})`);
51
+ }
52
+ }
37
53
  /**
38
54
  * Build the `zones` namespace.
39
55
  *
@@ -150,7 +166,40 @@ function createZonesClient(input = {}) {
150
166
  const matches = await client.containing({ point, ids: [zid] });
151
167
  return matches.length > 0;
152
168
  },
169
+ async nearby(input) {
170
+ if (!input || typeof input !== 'object') {
171
+ throw new Error('zones.nearby: input must include `point`');
172
+ }
173
+ assertPoint('nearby', input.point);
174
+ assertPositiveNumber('nearby', 'radiusMeters', input.radiusMeters);
175
+ if (input.limit !== undefined)
176
+ assertPositiveInt('nearby', 'limit', input.limit);
177
+ if (input.ids !== undefined) {
178
+ for (const zid of input.ids)
179
+ assertUuid('nearby', zid);
180
+ }
181
+ const res = await send('POST', '/v1/zones/nearby', undefined, input);
182
+ const body = await expectJson(res);
183
+ return body.zones;
184
+ },
185
+ async intersecting(input) {
186
+ if (!input || typeof input !== 'object' || !input.geometry) {
187
+ throw new Error('zones.intersecting: input must include `geometry`');
188
+ }
189
+ assertGeometry('intersecting', input.geometry);
190
+ if (input.limit !== undefined)
191
+ assertPositiveInt('intersecting', 'limit', input.limit);
192
+ if (input.ids !== undefined) {
193
+ for (const zid of input.ids)
194
+ assertUuid('intersecting', zid);
195
+ }
196
+ if (input.excludeZid !== undefined)
197
+ assertUuid('intersecting', input.excludeZid);
198
+ const res = await send('POST', '/v1/zones/intersecting', undefined, input);
199
+ const body = await expectJson(res);
200
+ return body.zones;
201
+ },
153
202
  };
154
203
  return client;
155
204
  }
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3pvbmVzL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2RkEsOENBcUhDO0FBbE5ELHNDQUttQjtBQUNuQixrQ0FBNEM7QUFhNUMsTUFBTSxVQUFVLEdBQUcsaUVBQWlFLENBQUM7QUE2QnJGLE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFDN0IsTUFBTSxDQUFTO0lBQ2YsSUFBSSxDQUFTO0lBRXRCLFlBQVksTUFBYyxFQUFFLElBQVk7UUFDdEMsS0FBSyxDQUFDLGFBQWEsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBVkQsc0NBVUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUFhLEVBQUUsR0FBVztJQUM1QyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyw2QkFBNkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckYsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFhLEVBQUUsS0FBbUM7SUFDckUsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQztJQUN2QixNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDO0lBQ3ZCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFL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R0FBRyxNQUFNLFVBQVUsQ0FBMkIsR0FBRyxDQUFDLENBQUM7WUFDN0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLO1lBQ3ZCLFVBQVUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUM7S0FDRixDQUFDO0lBRUYsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbmZpZ1N0YXRlLFxuICB0eXBlIFBsYXRmb3JtQXV0aCxcbiAgdHlwZSBQbGF0Zm9ybUF1dGhJbnB1dCxcbiAgdHlwZSBQbGF0Zm9ybUNvbmZpZ0lucHV0LFxufSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgc2VuZFdpdGhBdXRoUmV0cnkgfSBmcm9tICcuLi9odHRwJztcbmltcG9ydCB0eXBlIHtcbiAgQ29udGFpbmluZ0lucHV0LFxuICBab25lLFxuICBab25lQ3JlYXRlSW5wdXQsXG4gIFpvbmVDcmVhdGVSZXN1bHQsXG4gIFpvbmVMaXN0T3B0aW9ucyxcbiAgWm9uZUxpc3RQYWdlLFxuICBab25lUGF0Y2hJbnB1dCxcbiAgWm9uZVJlcGxhY2VJbnB1dCxcbiAgWm9uZVN1bW1hcnksXG59IGZyb20gJy4vc2NoZW1hJztcblxuY29uc3QgVVVJRF9SRUdFWCA9IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC9pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFpvbmVzQ2xpZW50IHtcbiAgY29uZmlnKGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogWm9uZXNDbGllbnQ7XG4gIGF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogWm9uZXNDbGllbnQ7XG5cbiAgLyoqIFBPU1QgL3YxL3pvbmVzIC0gY3JlYXRlIGEgc2luZ2xlIHpvbmUuICovXG4gIGNyZWF0ZShpbnB1dDogWm9uZUNyZWF0ZUlucHV0KTogUHJvbWlzZTxab25lQ3JlYXRlUmVzdWx0PjtcbiAgLyoqIEdFVCAvdjEvem9uZXMve3ppZH0gLSByZXR1cm5zIHRoZSBmdWxsIHpvbmUgb3IgdGhyb3dzIFpvbmVzQXBpRXJyb3IoNDA0KS4gKi9cbiAgZ2V0KHppZDogc3RyaW5nKTogUHJvbWlzZTxab25lPjtcbiAgLyoqIFBBVENIIC92MS96b25lcy97emlkfSAtIHNoYWxsb3cgdGFnIG1lcmdlOyBudWxsIGRlbGV0ZXMgYSBrZXkuICovXG4gIHVwZGF0ZSh6aWQ6IHN0cmluZywgaW5wdXQ6IFpvbmVQYXRjaElucHV0KTogUHJvbWlzZTxab25lPjtcbiAgLyoqIFBVVCAvdjEvem9uZXMve3ppZH0gLSBmdWxsIHJlcGxhY2Ugb2YgZ2VvbWV0cnkgKyB0YWdzLiAqL1xuICByZXBsYWNlKHppZDogc3RyaW5nLCBpbnB1dDogWm9uZVJlcGxhY2VJbnB1dCk6IFByb21pc2U8Wm9uZT47XG4gIC8qKiBERUxFVEUgL3YxL3pvbmVzL3t6aWR9IC0gNDA0IGlmIG5vdCBwcmVzZW50LiAqL1xuICBkZWxldGUoemlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogR0VUIC92MS96b25lcz90YWdzPS4uLiAtIHRhZy1maWx0ZXJlZCwga2V5c2V0LXBhZ2luYXRlZCBsaXN0aW5nLiAqL1xuICBsaXN0KG9wdHM/OiBab25lTGlzdE9wdGlvbnMpOiBQcm9taXNlPFpvbmVMaXN0UGFnZT47XG4gIC8qKiBQT1NUIC92MS96b25lcy9iYXRjaC9jcmVhdGUgLSBib3VuZGVkIGFycmF5OyByZXR1cm5lZCBpbiBpbnB1dCBvcmRlci4gKi9cbiAgY3JlYXRlTWFueSh6b25lczogcmVhZG9ubHkgWm9uZUNyZWF0ZUlucHV0W10pOiBQcm9taXNlPHsgem9uZXM6IEFycmF5PHsgemlkOiBzdHJpbmcgfT4gfT47XG4gIC8qKiBQT1NUIC92MS96b25lcy9iYXRjaC9kZWxldGUgLSByZXR1cm5zIHRoZSBjb3VudCBhY3R1YWxseSBkZWxldGVkLiAqL1xuICBkZWxldGVNYW55KHppZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTx7IGRlbGV0ZWQ6IG51bWJlciB9PjtcblxuICAvKiogUE9TVCAvdjEvem9uZXMvY29udGFpbmluZyAtIHRoZSBzcGF0aWFsIHByaW1pdGl2ZS4gKi9cbiAgY29udGFpbmluZyhpbnB1dDogQ29udGFpbmluZ0lucHV0KTogUHJvbWlzZTxab25lU3VtbWFyeVtdPjtcbiAgLyoqIFN1Z2FyIG92ZXIgY29udGFpbmluZyh7IHBvaW50LCBpZHM6IFt6aWRdIH0pLiBUcnVlIGlmZiB0aGUgem9uZSBjb250YWlucyB0aGUgcG9pbnQuICovXG4gIGNvbnRhaW5zKHppZDogc3RyaW5nLCBwb2ludDogQ29udGFpbmluZ0lucHV0Wydwb2ludCddKTogUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGNsYXNzIFpvbmVzQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGB6b25lcyBBUEkgJHtzdGF0dXN9OiAke2JvZHl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ1pvbmVzQXBpRXJyb3InO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuYm9keSA9IGJvZHk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0VXVpZChsYWJlbDogc3RyaW5nLCB6aWQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAodHlwZW9mIHppZCAhPT0gJ3N0cmluZycgfHwgIVVVSURfUkVHRVgudGVzdCh6aWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB6b25lcy4ke2xhYmVsfTogemlkIG11c3QgYmUgYSB1dWlkIChnb3QgJHtKU09OLnN0cmluZ2lmeSh6aWQpfSlgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRQb2ludChsYWJlbDogc3RyaW5nLCBwb2ludDogeyBsYXQ6IG51bWJlcjsgbG5nOiBudW1iZXIgfSk6IHZvaWQge1xuICBjb25zdCBsYXQgPSBwb2ludD8ubGF0O1xuICBjb25zdCBsbmcgPSBwb2ludD8ubG5nO1xuICBpZiAodHlwZW9mIGxhdCAhPT0gJ251bWJlcicgfHwgdHlwZW9mIGxuZyAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHpvbmVzLiR7bGFiZWx9OiBwb2ludCBtdXN0IGJlIHsgbGF0OiBudW1iZXIsIGxuZzogbnVtYmVyIH1gKTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShsYXQpIHx8IGxhdCA8IC05MCB8fCBsYXQgPiA5MCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgem9uZXMuJHtsYWJlbH06IGxhdCBtdXN0IGJlIGluIFstOTAsIDkwXSAoZ290ICR7bGF0fSlgKTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShsbmcpIHx8IGxuZyA8IC0xODAgfHwgbG5nID4gMTgwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB6b25lcy4ke2xhYmVsfTogbG5nIG11c3QgYmUgaW4gWy0xODAsIDE4MF0gKGdvdCAke2xuZ30pYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHpvbmVzYCBuYW1lc3BhY2UuXG4gKlxuICogU2hhcGUgYW5kIGNvbnRyYWN0IG1pcnJvciB7QGxpbmsgY3JlYXRlQnVzaW5lc3NDbGllbnR9IC0gbGF6eSBjb25maWdcbiAqIHJlc29sdXRpb24gdmlhIHtAbGluayBDb25maWdTdGF0ZX0sIHNoYXJlZCA0MDEtcmV0cnkgdmlhXG4gKiB7QGxpbmsgc2VuZFdpdGhBdXRoUmV0cnl9LCBpbW11dGFibGUgcGVyLWNhbGwgY29uZmlnOyBubyBnbG9iYWxzLlxuICpcbiAqIFdyaXRlcyAoYGNyZWF0ZWAsIGB1cGRhdGVgLCBgcmVwbGFjZWAsIGBkZWxldGVgLCBiYXRjaCBvcHMpIHJlcXVpcmUgYVxuICogc2VydmljZS1hY3RvciB0b2tlbi4gUmVhZHMgKGBnZXRgLCBgbGlzdGAsIGBjb250YWluaW5nYCwgYGNvbnRhaW5zYClcbiAqIGFjY2VwdCBlaXRoZXIgYSBzZXJ2aWNlLWFjdG9yIG9yIGEgdXNlci1hY3RvciB0b2tlbi4gVGhlIFNESyBkb2VzIG5vdFxuICogZW5mb3JjZSB0aGlzIC0gdGhlIHNlcnZlciByZXR1cm5zIDQwMS80MDMgYW5kIHdlIHN1cmZhY2UgaXQgYXNcbiAqIHtAbGluayBab25lc0FwaUVycm9yfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVpvbmVzQ2xpZW50KGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0ID0ge30pOiBab25lc0NsaWVudCB7XG4gIGNvbnN0IHN0YXRlID0gbmV3IENvbmZpZ1N0YXRlKCk7XG4gIHN0YXRlLmFwcGx5KGlucHV0KTtcblxuICBhc3luYyBmdW5jdGlvbiBzZW5kKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBxdWVyeT86IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICBjb25zdCB1cmwgPSBgJHtjb25maWcuYmFzZVVybH0ke3BhdGh9JHtxdWVyeSA/PyAnJ31gO1xuICAgIGNvbnN0IHBheWxvYWQgPSBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICByZXR1cm4gc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7IG1ldGhvZCwgcGF0aCwgdXJsLCBib2R5OiBwYXlsb2FkIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZXhwZWN0SnNvbjxUPihyZXM6IFJlc3BvbnNlKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBab25lc0FwaUVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgVDtcbiAgfVxuXG4gIGNvbnN0IGNsaWVudDogWm9uZXNDbGllbnQgPSB7XG4gICAgY29uZmlnKG9wdHMpIHtcbiAgICAgIHN0YXRlLmFwcGx5KG9wdHMpO1xuICAgICAgcmV0dXJuIGNsaWVudDtcbiAgICB9LFxuICAgIGF1dGgob3B0cykge1xuICAgICAgc3RhdGUuc2V0QXV0aChvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZShpbnB1dCkge1xuICAgICAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignem9uZXMuY3JlYXRlOiBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIGBnZW9tZXRyeWAnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmQoJ1BPU1QnLCAnL3YxL3pvbmVzJywgdW5kZWZpbmVkLCBpbnB1dCk7XG4gICAgICByZXR1cm4gZXhwZWN0SnNvbjxab25lQ3JlYXRlUmVzdWx0PihyZXMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXQoemlkKSB7XG4gICAgICBhc3NlcnRVdWlkKCdnZXQnLCB6aWQpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZCgnR0VUJywgYC92MS96b25lcy8ke3ppZH1gKTtcbiAgICAgIHJldHVybiBleHBlY3RKc29uPFpvbmU+KHJlcyk7XG4gICAgfSxcblxuICAgIGFzeW5jIHVwZGF0ZSh6aWQsIGlucHV0KSB7XG4gICAgICBhc3NlcnRVdWlkKCd1cGRhdGUnLCB6aWQpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZCgnUEFUQ0gnLCBgL3YxL3pvbmVzLyR7emlkfWAsIHVuZGVmaW5lZCwgaW5wdXQpO1xuICAgICAgcmV0dXJuIGV4cGVjdEpzb248Wm9uZT4ocmVzKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVwbGFjZSh6aWQsIGlucHV0KSB7XG4gICAgICBhc3NlcnRVdWlkKCdyZXBsYWNlJywgemlkKTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmQoJ1BVVCcsIGAvdjEvem9uZXMvJHt6aWR9YCwgdW5kZWZpbmVkLCBpbnB1dCk7XG4gICAgICByZXR1cm4gZXhwZWN0SnNvbjxab25lPihyZXMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUoemlkKSB7XG4gICAgICBhc3NlcnRVdWlkKCdkZWxldGUnLCB6aWQpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZCgnREVMRVRFJywgYC92MS96b25lcy8ke3ppZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDQpIHJldHVybjtcbiAgICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgWm9uZXNBcGlFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdChvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIGlmIChvcHRzLnRhZ3MgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgndGFncycsIEpTT04uc3RyaW5naWZ5KG9wdHMudGFncykpO1xuICAgICAgaWYgKG9wdHMuY3Vyc29yICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ2N1cnNvcicsIG9wdHMuY3Vyc29yKTtcbiAgICAgIGlmIChvcHRzLmxpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG9wdHMubGltaXQpIHx8IG9wdHMubGltaXQgPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgem9uZXMubGlzdDogbGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke29wdHMubGltaXR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKG9wdHMubGltaXQpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHFzID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kKCdHRVQnLCAnL3YxL3pvbmVzJywgcXMubGVuZ3RoID8gYD8ke3FzfWAgOiB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuIGV4cGVjdEpzb248Wm9uZUxpc3RQYWdlPihyZXMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVNYW55KHpvbmVzKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoem9uZXMpIHx8IHpvbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3pvbmVzLmNyZWF0ZU1hbnk6IHpvbmVzIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmQoJ1BPU1QnLCAnL3YxL3pvbmVzL2JhdGNoL2NyZWF0ZScsIHVuZGVmaW5lZCwgeyB6b25lcyB9KTtcbiAgICAgIHJldHVybiBleHBlY3RKc29uPHsgem9uZXM6IEFycmF5PHsgemlkOiBzdHJpbmcgfT4gfT4ocmVzKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWFueSh6aWRzKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoemlkcykgfHwgemlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd6b25lcy5kZWxldGVNYW55OiB6aWRzIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgemlkIG9mIHppZHMpIGFzc2VydFV1aWQoJ2RlbGV0ZU1hbnknLCB6aWQpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZCgnUE9TVCcsICcvdjEvem9uZXMvYmF0Y2gvZGVsZXRlJywgdW5kZWZpbmVkLCB7IHppZHMgfSk7XG4gICAgICByZXR1cm4gZXhwZWN0SnNvbjx7IGRlbGV0ZWQ6IG51bWJlciB9PihyZXMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBjb250YWluaW5nKGlucHV0KSB7XG4gICAgICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd6b25lcy5jb250YWluaW5nOiBpbnB1dCBtdXN0IGluY2x1ZGUgYHBvaW50YCcpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0UG9pbnQoJ2NvbnRhaW5pbmcnLCBpbnB1dC5wb2ludCk7XG4gICAgICBpZiAoaW5wdXQuaWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCB6aWQgb2YgaW5wdXQuaWRzKSBhc3NlcnRVdWlkKCdjb250YWluaW5nJywgemlkKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmQoJ1BPU1QnLCAnL3YxL3pvbmVzL2NvbnRhaW5pbmcnLCB1bmRlZmluZWQsIGlucHV0KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBleHBlY3RKc29uPHsgem9uZXM6IFpvbmVTdW1tYXJ5W10gfT4ocmVzKTtcbiAgICAgIHJldHVybiBib2R5LnpvbmVzO1xuICAgIH0sXG5cbiAgICBhc3luYyBjb250YWlucyh6aWQsIHBvaW50KSB7XG4gICAgICBhc3NlcnRVdWlkKCdjb250YWlucycsIHppZCk7XG4gICAgICBjb25zdCBtYXRjaGVzID0gYXdhaXQgY2xpZW50LmNvbnRhaW5pbmcoeyBwb2ludCwgaWRzOiBbemlkXSB9KTtcbiAgICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA+IDA7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gY2xpZW50O1xufVxuIl19
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3pvbmVzL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5SEEsOENBbUpDO0FBNVFELHNDQUttQjtBQUNuQixrQ0FBNEM7QUFnQjVDLE1BQU0sVUFBVSxHQUFHLGlFQUFpRSxDQUFDO0FBaUNyRixNQUFhLGFBQWMsU0FBUSxLQUFLO0lBQzdCLE1BQU0sQ0FBUztJQUNmLElBQUksQ0FBUztJQUV0QixZQUFZLE1BQWMsRUFBRSxJQUFZO1FBQ3RDLEtBQUssQ0FBQyxhQUFhLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQVZELHNDQVVDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYSxFQUFFLEdBQVc7SUFDNUMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssNkJBQTZCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYSxFQUFFLEtBQW1DO0lBQ3JFLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUM7SUFDdkIsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQztJQUN2QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FB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RCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUNELGNBQWMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9DLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUFFLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZGLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRztvQkFBRSxVQUFVLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9ELENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUztnQkFBRSxVQUFVLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNFLE1BQU0sSUFBSSxHQUFHLE1BQU0sVUFBVSxDQUEyQixHQUFHLENBQUMsQ0FBQztZQUM3RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZmlnU3RhdGUsXG4gIHR5cGUgUGxhdGZvcm1BdXRoLFxuICB0eXBlIFBsYXRmb3JtQXV0aElucHV0LFxuICB0eXBlIFBsYXRmb3JtQ29uZmlnSW5wdXQsXG59IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBzZW5kV2l0aEF1dGhSZXRyeSB9IGZyb20gJy4uL2h0dHAnO1xuaW1wb3J0IHR5cGUge1xuICBDb250YWluaW5nSW5wdXQsXG4gIEludGVyc2VjdGluZ0lucHV0LFxuICBOZWFyYnlJbnB1dCxcbiAgWm9uZSxcbiAgWm9uZUNyZWF0ZUlucHV0LFxuICBab25lQ3JlYXRlUmVzdWx0LFxuICBab25lTGlzdE9wdGlvbnMsXG4gIFpvbmVMaXN0UGFnZSxcbiAgWm9uZU5lYXJieSxcbiAgWm9uZVBhdGNoSW5wdXQsXG4gIFpvbmVSZXBsYWNlSW5wdXQsXG4gIFpvbmVTdW1tYXJ5LFxufSBmcm9tICcuL3NjaGVtYSc7XG5cbmNvbnN0IFVVSURfUkVHRVggPSAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaTtcblxuZXhwb3J0IGludGVyZmFjZSBab25lc0NsaWVudCB7XG4gIGNvbmZpZyhpbnB1dDogUGxhdGZvcm1Db25maWdJbnB1dCk6IFpvbmVzQ2xpZW50O1xuICBhdXRoKGlucHV0OiBQbGF0Zm9ybUF1dGhJbnB1dCB8IFBsYXRmb3JtQXV0aCk6IFpvbmVzQ2xpZW50O1xuXG4gIC8qKiBQT1NUIC92MS96b25lcyAtIGNyZWF0ZSBhIHNpbmdsZSB6b25lLiAqL1xuICBjcmVhdGUoaW5wdXQ6IFpvbmVDcmVhdGVJbnB1dCk6IFByb21pc2U8Wm9uZUNyZWF0ZVJlc3VsdD47XG4gIC8qKiBHRVQgL3YxL3pvbmVzL3t6aWR9IC0gcmV0dXJucyB0aGUgZnVsbCB6b25lIG9yIHRocm93cyBab25lc0FwaUVycm9yKDQwNCkuICovXG4gIGdldCh6aWQ6IHN0cmluZyk6IFByb21pc2U8Wm9uZT47XG4gIC8qKiBQQVRDSCAvdjEvem9uZXMve3ppZH0gLSBzaGFsbG93IHRhZyBtZXJnZTsgbnVsbCBkZWxldGVzIGEga2V5LiAqL1xuICB1cGRhdGUoemlkOiBzdHJpbmcsIGlucHV0OiBab25lUGF0Y2hJbnB1dCk6IFByb21pc2U8Wm9uZT47XG4gIC8qKiBQVVQgL3YxL3pvbmVzL3t6aWR9IC0gZnVsbCByZXBsYWNlIG9mIGdlb21ldHJ5ICsgdGFncy4gKi9cbiAgcmVwbGFjZSh6aWQ6IHN0cmluZywgaW5wdXQ6IFpvbmVSZXBsYWNlSW5wdXQpOiBQcm9taXNlPFpvbmU+O1xuICAvKiogREVMRVRFIC92MS96b25lcy97emlkfSAtIDQwNCBpZiBub3QgcHJlc2VudC4gKi9cbiAgZGVsZXRlKHppZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEdFVCAvdjEvem9uZXM/dGFncz0uLi4gLSB0YWctZmlsdGVyZWQsIGtleXNldC1wYWdpbmF0ZWQgbGlzdGluZy4gKi9cbiAgbGlzdChvcHRzPzogWm9uZUxpc3RPcHRpb25zKTogUHJvbWlzZTxab25lTGlzdFBhZ2U+O1xuICAvKiogUE9TVCAvdjEvem9uZXMvYmF0Y2gvY3JlYXRlIC0gYm91bmRlZCBhcnJheTsgcmV0dXJuZWQgaW4gaW5wdXQgb3JkZXIuICovXG4gIGNyZWF0ZU1hbnkoem9uZXM6IHJlYWRvbmx5IFpvbmVDcmVhdGVJbnB1dFtdKTogUHJvbWlzZTx7IHpvbmVzOiBBcnJheTx7IHppZDogc3RyaW5nIH0+IH0+O1xuICAvKiogUE9TVCAvdjEvem9uZXMvYmF0Y2gvZGVsZXRlIC0gcmV0dXJucyB0aGUgY291bnQgYWN0dWFsbHkgZGVsZXRlZC4gKi9cbiAgZGVsZXRlTWFueSh6aWRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8eyBkZWxldGVkOiBudW1iZXIgfT47XG5cbiAgLyoqIFBPU1QgL3YxL3pvbmVzL2NvbnRhaW5pbmcgLSB0aGUgc3BhdGlhbCBwcmltaXRpdmUuICovXG4gIGNvbnRhaW5pbmcoaW5wdXQ6IENvbnRhaW5pbmdJbnB1dCk6IFByb21pc2U8Wm9uZVN1bW1hcnlbXT47XG4gIC8qKiBTdWdhciBvdmVyIGNvbnRhaW5pbmcoeyBwb2ludCwgaWRzOiBbemlkXSB9KS4gVHJ1ZSBpZmYgdGhlIHpvbmUgY29udGFpbnMgdGhlIHBvaW50LiAqL1xuICBjb250YWlucyh6aWQ6IHN0cmluZywgcG9pbnQ6IENvbnRhaW5pbmdJbnB1dFsncG9pbnQnXSk6IFByb21pc2U8Ym9vbGVhbj47XG4gIC8qKiBQT1NUIC92MS96b25lcy9uZWFyYnkgLSB6b25lcyB3aXRoaW4gYHJhZGl1c01ldGVyc2Agb2YgYSBwb2ludCwgb3JkZXJlZCBieSBkaXN0YW5jZSBhc2MuICovXG4gIG5lYXJieShpbnB1dDogTmVhcmJ5SW5wdXQpOiBQcm9taXNlPFpvbmVOZWFyYnlbXT47XG4gIC8qKiBQT1NUIC92MS96b25lcy9pbnRlcnNlY3RpbmcgLSB6b25lcyB3aG9zZSBnZW9tZXRyeSBvdmVybGFwcyB0aGUgZ2l2ZW4gZ2VvbWV0cnkuICovXG4gIGludGVyc2VjdGluZyhpbnB1dDogSW50ZXJzZWN0aW5nSW5wdXQpOiBQcm9taXNlPFpvbmVTdW1tYXJ5W10+O1xufVxuXG5leHBvcnQgY2xhc3MgWm9uZXNBcGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzdGF0dXM6IG51bWJlciwgYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYHpvbmVzIEFQSSAke3N0YXR1c306ICR7Ym9keX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnWm9uZXNBcGlFcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRVdWlkKGxhYmVsOiBzdHJpbmcsIHppZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICh0eXBlb2YgemlkICE9PSAnc3RyaW5nJyB8fCAhVVVJRF9SRUdFWC50ZXN0KHppZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHpvbmVzLiR7bGFiZWx9OiB6aWQgbXVzdCBiZSBhIHV1aWQgKGdvdCAke0pTT04uc3RyaW5naWZ5KHppZCl9KWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFBvaW50KGxhYmVsOiBzdHJpbmcsIHBvaW50OiB7IGxhdDogbnVtYmVyOyBsbmc6IG51bWJlciB9KTogdm9pZCB7XG4gIGNvbnN0IGxhdCA9IHBvaW50Py5sYXQ7XG4gIGNvbnN0IGxuZyA9IHBvaW50Py5sbmc7XG4gIGlmICh0eXBlb2YgbGF0ICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgbG5nICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgem9uZXMuJHtsYWJlbH06IHBvaW50IG11c3QgYmUgeyBsYXQ6IG51bWJlciwgbG5nOiBudW1iZXIgfWApO1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGxhdCkgfHwgbGF0IDwgLTkwIHx8IGxhdCA+IDkwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB6b25lcy4ke2xhYmVsfTogbGF0IG11c3QgYmUgaW4gWy05MCwgOTBdIChnb3QgJHtsYXR9KWApO1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGxuZykgfHwgbG5nIDwgLTE4MCB8fCBsbmcgPiAxODApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHpvbmVzLiR7bGFiZWx9OiBsbmcgbXVzdCBiZSBpbiBbLTE4MCwgMTgwXSAoZ290ICR7bG5nfSlgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRHZW9tZXRyeShsYWJlbDogc3RyaW5nLCBnZW9tZXRyeTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCB0eXBlID0gKGdlb21ldHJ5IGFzIHsgdHlwZT86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQpPy50eXBlO1xuICBpZiAodHlwZSAhPT0gJ1BvbHlnb24nICYmIHR5cGUgIT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHpvbmVzLiR7bGFiZWx9OiBnZW9tZXRyeS50eXBlIG11c3QgYmUgUG9seWdvbiBvciBNdWx0aVBvbHlnb24gKGdvdCAke0pTT04uc3RyaW5naWZ5KHR5cGUpfSlgLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0UG9zaXRpdmVOdW1iZXIobGFiZWw6IHN0cmluZywgZmllbGQ6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB6b25lcy4ke2xhYmVsfTogJHtmaWVsZH0gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciAoZ290ICR7dmFsdWV9KWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFBvc2l0aXZlSW50KGxhYmVsOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB6b25lcy4ke2xhYmVsfTogJHtmaWVsZH0gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke3ZhbHVlfSlgKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgem9uZXNgIG5hbWVzcGFjZS5cbiAqXG4gKiBTaGFwZSBhbmQgY29udHJhY3QgbWlycm9yIHtAbGluayBjcmVhdGVCdXNpbmVzc0NsaWVudH0gLSBsYXp5IGNvbmZpZ1xuICogcmVzb2x1dGlvbiB2aWEge0BsaW5rIENvbmZpZ1N0YXRlfSwgc2hhcmVkIDQwMS1yZXRyeSB2aWFcbiAqIHtAbGluayBzZW5kV2l0aEF1dGhSZXRyeX0sIGltbXV0YWJsZSBwZXItY2FsbCBjb25maWc7IG5vIGdsb2JhbHMuXG4gKlxuICogV3JpdGVzIChgY3JlYXRlYCwgYHVwZGF0ZWAsIGByZXBsYWNlYCwgYGRlbGV0ZWAsIGJhdGNoIG9wcykgcmVxdWlyZSBhXG4gKiBzZXJ2aWNlLWFjdG9yIHRva2VuLiBSZWFkcyAoYGdldGAsIGBsaXN0YCwgYGNvbnRhaW5pbmdgLCBgY29udGFpbnNgKVxuICogYWNjZXB0IGVpdGhlciBhIHNlcnZpY2UtYWN0b3Igb3IgYSB1c2VyLWFjdG9yIHRva2VuLiBUaGUgU0RLIGRvZXMgbm90XG4gKiBlbmZvcmNlIHRoaXMgLSB0aGUgc2VydmVyIHJldHVybnMgNDAxLzQwMyBhbmQgd2Ugc3VyZmFjZSBpdCBhc1xuICoge0BsaW5rIFpvbmVzQXBpRXJyb3J9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlWm9uZXNDbGllbnQoaW5wdXQ6IFBsYXRmb3JtQ29uZmlnSW5wdXQgPSB7fSk6IFpvbmVzQ2xpZW50IHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgQ29uZmlnU3RhdGUoKTtcbiAgc3RhdGUuYXBwbHkoaW5wdXQpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHNlbmQoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHF1ZXJ5Pzogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgIGNvbnN0IHVybCA9IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0ke3F1ZXJ5ID8/ICcnfWA7XG4gICAgY29uc3QgcGF5bG9hZCA9IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuICAgIHJldHVybiBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHsgbWV0aG9kLCBwYXRoLCB1cmwsIGJvZHk6IHBheWxvYWQgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBleHBlY3RKc29uPFQ+KHJlczogUmVzcG9uc2UpOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IFpvbmVzQXBpRXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBUO1xuICB9XG5cbiAgY29uc3QgY2xpZW50OiBab25lc0NsaWVudCA9IHtcbiAgICBjb25maWcob3B0cykge1xuICAgICAgc3RhdGUuYXBwbHkob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgYXV0aChvcHRzKSB7XG4gICAgICBzdGF0ZS5zZXRBdXRoKG9wdHMpO1xuICAgICAgcmV0dXJuIGNsaWVudDtcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlKGlucHV0KSB7XG4gICAgICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd6b25lcy5jcmVhdGU6IGlucHV0IG11c3QgYmUgYW4gb2JqZWN0IHdpdGggYGdlb21ldHJ5YCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZCgnUE9TVCcsICcvdjEvem9uZXMnLCB1bmRlZmluZWQsIGlucHV0KTtcbiAgICAgIHJldHVybiBleHBlY3RKc29uPFpvbmVDcmVhdGVSZXN1bHQ+KHJlcyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldCh6aWQpIHtcbiAgICAgIGFzc2VydFV1aWQoJ2dldCcsIHppZCk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kKCdHRVQnLCBgL3YxL3pvbmVzLyR7emlkfWApO1xuICAgICAgcmV0dXJuIGV4cGVjdEpzb248Wm9uZT4ocmVzKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlKHppZCwgaW5wdXQpIHtcbiAgICAgIGFzc2VydFV1aWQoJ3VwZGF0ZScsIHppZCk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kKCdQQVRDSCcsIGAvdjEvem9uZXMvJHt6aWR9YCwgdW5kZWZpbmVkLCBpbnB1dCk7XG4gICAgICByZXR1cm4gZXhwZWN0SnNvbjxab25lPihyZXMpO1xuICAgIH0sXG5cbiAgICBhc3luYyByZXBsYWNlKHppZCwgaW5wdXQpIHtcbiAgICAgIGFzc2VydFV1aWQoJ3JlcGxhY2UnLCB6aWQpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZCgnUFVUJywgYC92MS96b25lcy8ke3ppZH1gLCB1bmRlZmluZWQsIGlucHV0KTtcbiAgICAgIHJldHVybiBleHBlY3RKc29uPFpvbmU+KHJlcyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZSh6aWQpIHtcbiAgICAgIGFzc2VydFV1aWQoJ2RlbGV0ZScsIHppZCk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kKCdERUxFVEUnLCBgL3YxL3pvbmVzLyR7emlkfWApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDIwNCkgcmV0dXJuO1xuICAgICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBab25lc0FwaUVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0KG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgaWYgKG9wdHMudGFncyAhPT0gdW5kZWZpbmVkKSBwYXJhbXMuc2V0KCd0YWdzJywgSlNPTi5zdHJpbmdpZnkob3B0cy50YWdzKSk7XG4gICAgICBpZiAob3B0cy5jdXJzb3IgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgnY3Vyc29yJywgb3B0cy5jdXJzb3IpO1xuICAgICAgaWYgKG9wdHMubGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob3B0cy5saW1pdCkgfHwgb3B0cy5saW1pdCA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB6b25lcy5saXN0OiBsaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciAoZ290ICR7b3B0cy5saW1pdH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcob3B0cy5saW1pdCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgcXMgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmQoJ0dFVCcsICcvdjEvem9uZXMnLCBxcy5sZW5ndGggPyBgPyR7cXN9YCA6IHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gZXhwZWN0SnNvbjxab25lTGlzdFBhZ2U+KHJlcyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZU1hbnkoem9uZXMpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh6b25lcykgfHwgem9uZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignem9uZXMuY3JlYXRlTWFueTogem9uZXMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheScpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZCgnUE9TVCcsICcvdjEvem9uZXMvYmF0Y2gvY3JlYXRlJywgdW5kZWZpbmVkLCB7IHpvbmVzIH0pO1xuICAgICAgcmV0dXJuIGV4cGVjdEpzb248eyB6b25lczogQXJyYXk8eyB6aWQ6IHN0cmluZyB9PiB9PihyZXMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVNYW55KHppZHMpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh6aWRzKSB8fCB6aWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3pvbmVzLmRlbGV0ZU1hbnk6IHppZHMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheScpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB6aWQgb2YgemlkcykgYXNzZXJ0VXVpZCgnZGVsZXRlTWFueScsIHppZCk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kKCdQT1NUJywgJy92MS96b25lcy9iYXRjaC9kZWxldGUnLCB1bmRlZmluZWQsIHsgemlkcyB9KTtcbiAgICAgIHJldHVybiBleHBlY3RKc29uPHsgZGVsZXRlZDogbnVtYmVyIH0+KHJlcyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNvbnRhaW5pbmcoaW5wdXQpIHtcbiAgICAgIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3pvbmVzLmNvbnRhaW5pbmc6IGlucHV0IG11c3QgaW5jbHVkZSBgcG9pbnRgJyk7XG4gICAgICB9XG4gICAgICBhc3NlcnRQb2ludCgnY29udGFpbmluZycsIGlucHV0LnBvaW50KTtcbiAgICAgIGlmIChpbnB1dC5pZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHppZCBvZiBpbnB1dC5pZHMpIGFzc2VydFV1aWQoJ2NvbnRhaW5pbmcnLCB6aWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZCgnUE9TVCcsICcvdjEvem9uZXMvY29udGFpbmluZycsIHVuZGVmaW5lZCwgaW5wdXQpO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGV4cGVjdEpzb248eyB6b25lczogWm9uZVN1bW1hcnlbXSB9PihyZXMpO1xuICAgICAgcmV0dXJuIGJvZHkuem9uZXM7XG4gICAgfSxcblxuICAgIGFzeW5jIGNvbnRhaW5zKHppZCwgcG9pbnQpIHtcbiAgICAgIGFzc2VydFV1aWQoJ2NvbnRhaW5zJywgemlkKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBhd2FpdCBjbGllbnQuY29udGFpbmluZyh7IHBvaW50LCBpZHM6IFt6aWRdIH0pO1xuICAgICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID4gMDtcbiAgICB9LFxuXG4gICAgYXN5bmMgbmVhcmJ5KGlucHV0KSB7XG4gICAgICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd6b25lcy5uZWFyYnk6IGlucHV0IG11c3QgaW5jbHVkZSBgcG9pbnRgJyk7XG4gICAgICB9XG4gICAgICBhc3NlcnRQb2ludCgnbmVhcmJ5JywgaW5wdXQucG9pbnQpO1xuICAgICAgYXNzZXJ0UG9zaXRpdmVOdW1iZXIoJ25lYXJieScsICdyYWRpdXNNZXRlcnMnLCBpbnB1dC5yYWRpdXNNZXRlcnMpO1xuICAgICAgaWYgKGlucHV0LmxpbWl0ICE9PSB1bmRlZmluZWQpIGFzc2VydFBvc2l0aXZlSW50KCduZWFyYnknLCAnbGltaXQnLCBpbnB1dC5saW1pdCk7XG4gICAgICBpZiAoaW5wdXQuaWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCB6aWQgb2YgaW5wdXQuaWRzKSBhc3NlcnRVdWlkKCduZWFyYnknLCB6aWQpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZCgnUE9TVCcsICcvdjEvem9uZXMvbmVhcmJ5JywgdW5kZWZpbmVkLCBpbnB1dCk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgZXhwZWN0SnNvbjx7IHpvbmVzOiBab25lTmVhcmJ5W10gfT4ocmVzKTtcbiAgICAgIHJldHVybiBib2R5LnpvbmVzO1xuICAgIH0sXG5cbiAgICBhc3luYyBpbnRlcnNlY3RpbmcoaW5wdXQpIHtcbiAgICAgIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnb2JqZWN0JyB8fCAhaW5wdXQuZ2VvbWV0cnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd6b25lcy5pbnRlcnNlY3Rpbmc6IGlucHV0IG11c3QgaW5jbHVkZSBgZ2VvbWV0cnlgJyk7XG4gICAgICB9XG4gICAgICBhc3NlcnRHZW9tZXRyeSgnaW50ZXJzZWN0aW5nJywgaW5wdXQuZ2VvbWV0cnkpO1xuICAgICAgaWYgKGlucHV0LmxpbWl0ICE9PSB1bmRlZmluZWQpIGFzc2VydFBvc2l0aXZlSW50KCdpbnRlcnNlY3RpbmcnLCAnbGltaXQnLCBpbnB1dC5saW1pdCk7XG4gICAgICBpZiAoaW5wdXQuaWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCB6aWQgb2YgaW5wdXQuaWRzKSBhc3NlcnRVdWlkKCdpbnRlcnNlY3RpbmcnLCB6aWQpO1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0LmV4Y2x1ZGVaaWQgIT09IHVuZGVmaW5lZCkgYXNzZXJ0VXVpZCgnaW50ZXJzZWN0aW5nJywgaW5wdXQuZXhjbHVkZVppZCk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kKCdQT1NUJywgJy92MS96b25lcy9pbnRlcnNlY3RpbmcnLCB1bmRlZmluZWQsIGlucHV0KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBleHBlY3RKc29uPHsgem9uZXM6IFpvbmVTdW1tYXJ5W10gfT4ocmVzKTtcbiAgICAgIHJldHVybiBib2R5LnpvbmVzO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIGNsaWVudDtcbn1cbiJdfQ==
@@ -63,6 +63,7 @@ export interface Zone {
63
63
  zid: string;
64
64
  geometry: GeoJsonMultiPolygon;
65
65
  tags: TagBag;
66
+ areaSqKm: number;
66
67
  createdAt: string;
67
68
  updatedAt: string;
68
69
  }
@@ -102,3 +103,23 @@ export interface ContainingInput {
102
103
  ids?: readonly string[];
103
104
  tags?: TagFilter;
104
105
  }
106
+ export interface NearbyInput {
107
+ point: Point;
108
+ radiusMeters: number;
109
+ tags?: TagFilter;
110
+ ids?: readonly string[];
111
+ limit?: number;
112
+ }
113
+ /** The compact shape returned by `nearby`, with the distance from the query point. */
114
+ export interface ZoneNearby {
115
+ zid: string;
116
+ tags: TagBag;
117
+ distanceMeters: number;
118
+ }
119
+ export interface IntersectingInput {
120
+ geometry: Geometry;
121
+ tags?: TagFilter;
122
+ ids?: readonly string[];
123
+ excludeZid?: string;
124
+ limit?: number;
125
+ }
@@ -13,4 +13,4 @@
13
13
  * order `[lng, lat]` per the GeoJSON spec.
14
14
  */
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3pvbmVzL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7OztHQVlHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlIHN1cmZhY2UgZm9yIHRoZSBwbGF0Zm9ybSBab25lcyBBUEkuXG4gKlxuICogVGhlIFpvbmVzIHNlcnZpY2UgaXMgYSBnZW5lcmljLCBkb21haW4tYWdub3N0aWMgc3BhdGlhbCBwcmltaXRpdmU6IGl0IHN0b3Jlc1xuICogdGFnZ2VkIHBvbHlnb25zIGFuZCBhbnN3ZXJzIHBvaW50LWluLXBvbHlnb24gY29udGFpbm1lbnQgcXVlcmllcy4gSXQga25vd3NcbiAqIG5vdGhpbmcgYWJvdXQgYnVzaW5lc3Nlcywgc2VydmljZWFiaWxpdHksIG9yIGRlbGl2ZXJ5OyB0aG9zZSBhcmUgY29uc3VtZXJcbiAqIGNvbmNlcm5zIHRoYXQgY29tcG9zZSB0aGlzIHByaW1pdGl2ZS5cbiAqXG4gKiBDb29yZGluYXRlIGNvbnZlbnRpb24gZXZlcnl3aGVyZSBpbiB0aGlzIHN1cmZhY2U6IHBvaW50cyBhcmUgdGhlIG5hbWVkXG4gKiBvYmplY3QgYHsgbGF0LCBsbmcgfWAgKG5ldmVyIGEgcG9zaXRpb25hbCBwYWlyKS4gVGhlIHNlcnZpY2UgY29udmVydHNcbiAqIGludGVybmFsbHkgdG8gdGhlIFBvc3RHSVMgbG5nLWZpcnN0IG9yZGVyLiBQb2x5Z29ucyBmb2xsb3cgR2VvSlNPTiBheGlzXG4gKiBvcmRlciBgW2xuZywgbGF0XWAgcGVyIHRoZSBHZW9KU09OIHNwZWMuXG4gKi9cblxuLyoqIExhdGl0dWRlL2xvbmdpdHVkZSBwYWlyLiBMYXQgaW4gWy05MCwgOTBdLCBsbmcgaW4gWy0xODAsIDE4MF0uICovXG5leHBvcnQgaW50ZXJmYWNlIFBvaW50IHtcbiAgbGF0OiBudW1iZXI7XG4gIGxuZzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEdlb0pTT04tMjAwOCBQb2x5Z29uLiBUaGUgZmlyc3QgcmluZyBpcyB0aGUgZXh0ZXJpb3I7IHN1YnNlcXVlbnQgcmluZ3NcbiAqIGFyZSBpbnRlcmlvciAoaG9sZXMpLiBFYWNoIGNvb3JkaW5hdGUgaXMgYFtsbmcsIGxhdF1gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlb0pzb25Qb2x5Z29uIHtcbiAgdHlwZTogJ1BvbHlnb24nO1xuICBjb29yZGluYXRlczogQXJyYXk8QXJyYXk8W251bWJlciwgbnVtYmVyXT4+O1xufVxuXG4vKipcbiAqIEdlb0pTT04tMjAwOCBNdWx0aVBvbHlnb24uIFRoZSBzZXJ2aWNlIG5vcm1hbGlzZXMgUG9seWdvbiB0byBNdWx0aVBvbHlnb25cbiAqIG9uIHdyaXRlLCBzbyByZWFkcyBhbHdheXMgcmV0dXJuIE11bHRpUG9seWdvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW9Kc29uTXVsdGlQb2x5Z29uIHtcbiAgdHlwZTogJ011bHRpUG9seWdvbic7XG4gIGNvb3JkaW5hdGVzOiBBcnJheTxBcnJheTxBcnJheTxbbnVtYmVyLCBudW1iZXJdPj4+O1xufVxuXG5leHBvcnQgdHlwZSBHZW9tZXRyeSA9IEdlb0pzb25Qb2x5Z29uIHwgR2VvSnNvbk11bHRpUG9seWdvbjtcblxuLyoqXG4gKiBUYWcgdmFsdWVzIGFyZSBmbGF0OiBhIHNjYWxhciAoY29lcmNlZCB0byBzdHJpbmcgYnkgdGhlIHNlcnZpY2UpIG9yIGFcbiAqIGZsYXQgYXJyYXkgb2Ygc2NhbGFycy4gTmVzdGVkIG9iamVjdHMgYXJlIHJlamVjdGVkIG9uIHdyaXRlLlxuICpcbiAqIGBudWxsYCBpcyBtZWFuaW5nZnVsIG9ubHkgaW5zaWRlIGEgUEFUQ0ggdGFnIGJhZywgd2hlcmUgaXQgZGVsZXRlcyB0aGVcbiAqIGtleS4gSXQgaXMgbm90IGEgc3RvcmFibGUgdmFsdWUuIFVzZSB7QGxpbmsgUGF0Y2hUYWdCYWd9IGZvciBQQVRDSCBib2RpZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFRhZ1ZhbHVlID0gc3RyaW5nIHwgc3RyaW5nW107XG5cbmV4cG9ydCB0eXBlIFRhZ0JhZyA9IFJlY29yZDxzdHJpbmcsIFRhZ1ZhbHVlPjtcblxuLyoqIFRhZyBiYWcgYWNjZXB0ZWQgYnkgUEFUQ0guIGBudWxsYCBkZWxldGVzIHRoZSBrZXk7IGV2ZXJ5dGhpbmcgZWxzZSBpcyBzaGFsbG93LW1lcmdlZC4gKi9cbmV4cG9ydCB0eXBlIFBhdGNoVGFnQmFnID0gUmVjb3JkPHN0cmluZywgVGFnVmFsdWUgfCBudWxsPjtcblxuLyoqXG4gKiBGaWx0ZXIgZ3JhbW1hciB1c2VkIGJ5IGJvdGggdGhlIGxpc3RpbmcgZW5kcG9pbnQgYW5kIHRoZSBjb250YWlubWVudFxuICogcHJpbWl0aXZlJ3MgYHRhZ3NgIHNlbGVjdG9yOlxuICpcbiAqICAgLSBgeyBrOiBcInZcIiB9YCAgICAgICAgICAgZXF1YWxpdHkgLyBhcnJheS1tZW1iZXJzaGlwOiBgdGFncyBAPiB7XCJrXCI6XCJ2XCJ9YFxuICogICAtIGB7IGs6IFtcInYxXCIsXCJ2MlwiXSB9YCAgIGFueS1vZiAoSU4pOiBwZXItdmFsdWUgYEA+YCBjbGF1c2VzIE9SLWVkXG4gKiAgIC0gbXVsdGlwbGUga2V5cyAgICAgICAgICAgQU5EIGFjcm9zcyBrZXlzXG4gKlxuICogU3RvcmVkIGFycmF5cyBtYXRjaCBzY2FsYXIgZmlsdGVycyB2aWEgSlNPTkIgYEA+YDsgdGhlIGNvbXBpbGVyIGRvZXMgbm90XG4gKiBuZWVkIHRvIGtub3cgdGhlIHN0b3JlZCBzaGFwZS4gVXNlIHRoZSBkZWRpY2F0ZWQgYGlkc2Agc2VsZWN0b3Igb25cbiAqIGNvbnRhaW5tZW50IGZvciBsYXJnZSBpZC1zdHlsZSBzZXRzIOKAlCB0YWcgSU4gaXMgZm9yIGxvdy1jYXJkaW5hbGl0eVxuICogdmFsdWUgbGlzdHMgKGNhdGVnb3J5LCBzdGF0dXMsIHR5cGUpLlxuICovXG5leHBvcnQgdHlwZSBUYWdGaWx0ZXIgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT47XG5cbi8qKiBUaGUgZnVsbCB6b25lIHJlY29yZCByZXR1cm5lZCBieSBgZ2V0YC9gcmVwbGFjZWAvYHVwZGF0ZWAuICovXG5leHBvcnQgaW50ZXJmYWNlIFpvbmUge1xuICB6aWQ6IHN0cmluZztcbiAgZ2VvbWV0cnk6IEdlb0pzb25NdWx0aVBvbHlnb247XG4gIHRhZ3M6IFRhZ0JhZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xufVxuXG4vKiogVGhlIGNvbXBhY3Qgc2hhcGUgcmV0dXJuZWQgYnkgYGNvbnRhaW5pbmdgLCBgbGlzdGAsIGFuZCBgY3JlYXRlYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWm9uZVN1bW1hcnkge1xuICB6aWQ6IHN0cmluZztcbiAgdGFnczogVGFnQmFnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFpvbmVMaXN0UGFnZSB7XG4gIHpvbmVzOiBab25lU3VtbWFyeVtdO1xuICBuZXh0Q3Vyc29yOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFpvbmVDcmVhdGVSZXN1bHQge1xuICB6aWQ6IHN0cmluZztcbiAgdGFnczogVGFnQmFnO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBab25lQ3JlYXRlSW5wdXQge1xuICBnZW9tZXRyeTogR2VvbWV0cnk7XG4gIHRhZ3M/OiBUYWdCYWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWm9uZVBhdGNoSW5wdXQge1xuICBnZW9tZXRyeT86IEdlb21ldHJ5O1xuICB0YWdzPzogUGF0Y2hUYWdCYWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWm9uZVJlcGxhY2VJbnB1dCB7XG4gIGdlb21ldHJ5OiBHZW9tZXRyeTtcbiAgdGFncz86IFRhZ0JhZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBab25lTGlzdE9wdGlvbnMge1xuICB0YWdzPzogVGFnRmlsdGVyO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGxpbWl0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5pbmdJbnB1dCB7XG4gIHBvaW50OiBQb2ludDtcbiAgaWRzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHRhZ3M/OiBUYWdGaWx0ZXI7XG59XG4iXX0=
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3pvbmVzL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7OztHQVlHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlIHN1cmZhY2UgZm9yIHRoZSBwbGF0Zm9ybSBab25lcyBBUEkuXG4gKlxuICogVGhlIFpvbmVzIHNlcnZpY2UgaXMgYSBnZW5lcmljLCBkb21haW4tYWdub3N0aWMgc3BhdGlhbCBwcmltaXRpdmU6IGl0IHN0b3Jlc1xuICogdGFnZ2VkIHBvbHlnb25zIGFuZCBhbnN3ZXJzIHBvaW50LWluLXBvbHlnb24gY29udGFpbm1lbnQgcXVlcmllcy4gSXQga25vd3NcbiAqIG5vdGhpbmcgYWJvdXQgYnVzaW5lc3Nlcywgc2VydmljZWFiaWxpdHksIG9yIGRlbGl2ZXJ5OyB0aG9zZSBhcmUgY29uc3VtZXJcbiAqIGNvbmNlcm5zIHRoYXQgY29tcG9zZSB0aGlzIHByaW1pdGl2ZS5cbiAqXG4gKiBDb29yZGluYXRlIGNvbnZlbnRpb24gZXZlcnl3aGVyZSBpbiB0aGlzIHN1cmZhY2U6IHBvaW50cyBhcmUgdGhlIG5hbWVkXG4gKiBvYmplY3QgYHsgbGF0LCBsbmcgfWAgKG5ldmVyIGEgcG9zaXRpb25hbCBwYWlyKS4gVGhlIHNlcnZpY2UgY29udmVydHNcbiAqIGludGVybmFsbHkgdG8gdGhlIFBvc3RHSVMgbG5nLWZpcnN0IG9yZGVyLiBQb2x5Z29ucyBmb2xsb3cgR2VvSlNPTiBheGlzXG4gKiBvcmRlciBgW2xuZywgbGF0XWAgcGVyIHRoZSBHZW9KU09OIHNwZWMuXG4gKi9cblxuLyoqIExhdGl0dWRlL2xvbmdpdHVkZSBwYWlyLiBMYXQgaW4gWy05MCwgOTBdLCBsbmcgaW4gWy0xODAsIDE4MF0uICovXG5leHBvcnQgaW50ZXJmYWNlIFBvaW50IHtcbiAgbGF0OiBudW1iZXI7XG4gIGxuZzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEdlb0pTT04tMjAwOCBQb2x5Z29uLiBUaGUgZmlyc3QgcmluZyBpcyB0aGUgZXh0ZXJpb3I7IHN1YnNlcXVlbnQgcmluZ3NcbiAqIGFyZSBpbnRlcmlvciAoaG9sZXMpLiBFYWNoIGNvb3JkaW5hdGUgaXMgYFtsbmcsIGxhdF1gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlb0pzb25Qb2x5Z29uIHtcbiAgdHlwZTogJ1BvbHlnb24nO1xuICBjb29yZGluYXRlczogQXJyYXk8QXJyYXk8W251bWJlciwgbnVtYmVyXT4+O1xufVxuXG4vKipcbiAqIEdlb0pTT04tMjAwOCBNdWx0aVBvbHlnb24uIFRoZSBzZXJ2aWNlIG5vcm1hbGlzZXMgUG9seWdvbiB0byBNdWx0aVBvbHlnb25cbiAqIG9uIHdyaXRlLCBzbyByZWFkcyBhbHdheXMgcmV0dXJuIE11bHRpUG9seWdvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW9Kc29uTXVsdGlQb2x5Z29uIHtcbiAgdHlwZTogJ011bHRpUG9seWdvbic7XG4gIGNvb3JkaW5hdGVzOiBBcnJheTxBcnJheTxBcnJheTxbbnVtYmVyLCBudW1iZXJdPj4+O1xufVxuXG5leHBvcnQgdHlwZSBHZW9tZXRyeSA9IEdlb0pzb25Qb2x5Z29uIHwgR2VvSnNvbk11bHRpUG9seWdvbjtcblxuLyoqXG4gKiBUYWcgdmFsdWVzIGFyZSBmbGF0OiBhIHNjYWxhciAoY29lcmNlZCB0byBzdHJpbmcgYnkgdGhlIHNlcnZpY2UpIG9yIGFcbiAqIGZsYXQgYXJyYXkgb2Ygc2NhbGFycy4gTmVzdGVkIG9iamVjdHMgYXJlIHJlamVjdGVkIG9uIHdyaXRlLlxuICpcbiAqIGBudWxsYCBpcyBtZWFuaW5nZnVsIG9ubHkgaW5zaWRlIGEgUEFUQ0ggdGFnIGJhZywgd2hlcmUgaXQgZGVsZXRlcyB0aGVcbiAqIGtleS4gSXQgaXMgbm90IGEgc3RvcmFibGUgdmFsdWUuIFVzZSB7QGxpbmsgUGF0Y2hUYWdCYWd9IGZvciBQQVRDSCBib2RpZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFRhZ1ZhbHVlID0gc3RyaW5nIHwgc3RyaW5nW107XG5cbmV4cG9ydCB0eXBlIFRhZ0JhZyA9IFJlY29yZDxzdHJpbmcsIFRhZ1ZhbHVlPjtcblxuLyoqIFRhZyBiYWcgYWNjZXB0ZWQgYnkgUEFUQ0guIGBudWxsYCBkZWxldGVzIHRoZSBrZXk7IGV2ZXJ5dGhpbmcgZWxzZSBpcyBzaGFsbG93LW1lcmdlZC4gKi9cbmV4cG9ydCB0eXBlIFBhdGNoVGFnQmFnID0gUmVjb3JkPHN0cmluZywgVGFnVmFsdWUgfCBudWxsPjtcblxuLyoqXG4gKiBGaWx0ZXIgZ3JhbW1hciB1c2VkIGJ5IGJvdGggdGhlIGxpc3RpbmcgZW5kcG9pbnQgYW5kIHRoZSBjb250YWlubWVudFxuICogcHJpbWl0aXZlJ3MgYHRhZ3NgIHNlbGVjdG9yOlxuICpcbiAqICAgLSBgeyBrOiBcInZcIiB9YCAgICAgICAgICAgZXF1YWxpdHkgLyBhcnJheS1tZW1iZXJzaGlwOiBgdGFncyBAPiB7XCJrXCI6XCJ2XCJ9YFxuICogICAtIGB7IGs6IFtcInYxXCIsXCJ2MlwiXSB9YCAgIGFueS1vZiAoSU4pOiBwZXItdmFsdWUgYEA+YCBjbGF1c2VzIE9SLWVkXG4gKiAgIC0gbXVsdGlwbGUga2V5cyAgICAgICAgICAgQU5EIGFjcm9zcyBrZXlzXG4gKlxuICogU3RvcmVkIGFycmF5cyBtYXRjaCBzY2FsYXIgZmlsdGVycyB2aWEgSlNPTkIgYEA+YDsgdGhlIGNvbXBpbGVyIGRvZXMgbm90XG4gKiBuZWVkIHRvIGtub3cgdGhlIHN0b3JlZCBzaGFwZS4gVXNlIHRoZSBkZWRpY2F0ZWQgYGlkc2Agc2VsZWN0b3Igb25cbiAqIGNvbnRhaW5tZW50IGZvciBsYXJnZSBpZC1zdHlsZSBzZXRzIOKAlCB0YWcgSU4gaXMgZm9yIGxvdy1jYXJkaW5hbGl0eVxuICogdmFsdWUgbGlzdHMgKGNhdGVnb3J5LCBzdGF0dXMsIHR5cGUpLlxuICovXG5leHBvcnQgdHlwZSBUYWdGaWx0ZXIgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT47XG5cbi8qKiBUaGUgZnVsbCB6b25lIHJlY29yZCByZXR1cm5lZCBieSBgZ2V0YC9gcmVwbGFjZWAvYHVwZGF0ZWAuICovXG5leHBvcnQgaW50ZXJmYWNlIFpvbmUge1xuICB6aWQ6IHN0cmluZztcbiAgZ2VvbWV0cnk6IEdlb0pzb25NdWx0aVBvbHlnb247XG4gIHRhZ3M6IFRhZ0JhZztcbiAgYXJlYVNxS206IG51bWJlcjtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xufVxuXG4vKiogVGhlIGNvbXBhY3Qgc2hhcGUgcmV0dXJuZWQgYnkgYGNvbnRhaW5pbmdgLCBgbGlzdGAsIGFuZCBgY3JlYXRlYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWm9uZVN1bW1hcnkge1xuICB6aWQ6IHN0cmluZztcbiAgdGFnczogVGFnQmFnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFpvbmVMaXN0UGFnZSB7XG4gIHpvbmVzOiBab25lU3VtbWFyeVtdO1xuICBuZXh0Q3Vyc29yOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFpvbmVDcmVhdGVSZXN1bHQge1xuICB6aWQ6IHN0cmluZztcbiAgdGFnczogVGFnQmFnO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBab25lQ3JlYXRlSW5wdXQge1xuICBnZW9tZXRyeTogR2VvbWV0cnk7XG4gIHRhZ3M/OiBUYWdCYWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWm9uZVBhdGNoSW5wdXQge1xuICBnZW9tZXRyeT86IEdlb21ldHJ5O1xuICB0YWdzPzogUGF0Y2hUYWdCYWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWm9uZVJlcGxhY2VJbnB1dCB7XG4gIGdlb21ldHJ5OiBHZW9tZXRyeTtcbiAgdGFncz86IFRhZ0JhZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBab25lTGlzdE9wdGlvbnMge1xuICB0YWdzPzogVGFnRmlsdGVyO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGxpbWl0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5pbmdJbnB1dCB7XG4gIHBvaW50OiBQb2ludDtcbiAgaWRzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHRhZ3M/OiBUYWdGaWx0ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmVhcmJ5SW5wdXQge1xuICBwb2ludDogUG9pbnQ7XG4gIHJhZGl1c01ldGVyczogbnVtYmVyO1xuICB0YWdzPzogVGFnRmlsdGVyO1xuICBpZHM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgbGltaXQ/OiBudW1iZXI7XG59XG5cbi8qKiBUaGUgY29tcGFjdCBzaGFwZSByZXR1cm5lZCBieSBgbmVhcmJ5YCwgd2l0aCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcXVlcnkgcG9pbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFpvbmVOZWFyYnkge1xuICB6aWQ6IHN0cmluZztcbiAgdGFnczogVGFnQmFnO1xuICBkaXN0YW5jZU1ldGVyczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyc2VjdGluZ0lucHV0IHtcbiAgZ2VvbWV0cnk6IEdlb21ldHJ5O1xuICB0YWdzPzogVGFnRmlsdGVyO1xuICBpZHM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgZXhjbHVkZVppZD86IHN0cmluZztcbiAgbGltaXQ/OiBudW1iZXI7XG59XG4iXX0=