logixlysia 6.9.4 → 6.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 6.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 3423143: HTTP adapters no longer cap delivery at one 20-entry batch per round trip. Entries that arrive while a request is in flight wait and go out together in the next request, which starts as soon as the one in flight returns if a full batch (`maxBatchSize`) is waiting and on the `flushIntervalMs` timer otherwise, so light traffic is batched as before and a 50 ms backend now keeps up with thousands of records per second instead of dropping about half of them. Delivery order is unchanged. The new `maxEntriesPerRequest` option (default 500; 100 for Sentry) is the most entries one request carries; it applies to every request, so a `maxBatchSize` above it splits each batch. At most `maxPendingBatches × maxBatchSize` entries wait behind the request in flight, which carries up to `maxEntriesPerRequest` more, so an adapter holds at most 1,140 entries by default (740 for Sentry) where it held about 660; beyond that, entries are dropped, counted and reported once per request. Requests can carry more bytes than before, and vendor byte limits are not enforced. A failure of a request the queue started on its own goes to the adapter's `onError` (or rate-limited stderr), not to `config.onError`, because no `log()` call is awaiting it; a failure of the request started by a `log()` or `flush()` call is still rejected to that caller. `flush()` waits for the entries accepted before the call, not for the queue to go idle, and it resolves rather than rejects when those entries went out in a request the queue started on its own and that request failed, so `flushLogixlysia` no longer passes that failure to `config.onError`. `maxBatchSize` and `maxEntriesPerRequest` must be positive integers, and the adapter throws at construction otherwise; `maxBatchSize: 0` and `Infinity`, which used to mean one request per entry and timer-only batching, now throw too. The built-in HTTP adapters implement `close()`: it stops accepting entries, then flushes, so `flushLogixlysia(options, { close: true })` releases them. `close` is now a required member of the exported `AdapterTransport` type, so an object of your own typed as `AdapterTransport` needs one as well. A transport wrapped in `withRedaction` is not closed through the wrapper yet; it forwards `flush` only.
8
+
9
+ ### Patch Changes
10
+
11
+ - 9ac4a0a: Compressed rotation archives are created with `logFileMode` (default `0o600`) instead of the process umask, so they are no more readable than the live log. An adapter's "invalid endpoint URL" error no longer echoes the credentials embedded in the URL, in its message or in its `cause`. File write and rotation failures reported on stderr (when `config.onError` is not set) are rate limited to one message every 5 seconds, like transport and formatting failures.
12
+ - ca5fe30: `autoRedact` no longer throws, and therefore no longer drops the record, when an error's `name` or `message` is an inherited accessor (a `DOMException`, an app error class with `get name()`); redacted errors keep `message`, `name` and `stack` non-enumerable, as native errors do. A value with a `toJSON` method (Bun's `CookieMap`, app classes) is redacted as what it serializes to; errors keep their class even when they define `toJSON`, so an `HttpError` stays an `HttpError`. The password of a URL, `Bearer` and `Basic` credentials in any string, sensitive query keys inside an absolute URL in a `referer`, `location` or `content-location` header, and a field named `cookies` are now masked. Redaction and log serialization stop at a depth of 64 with `"[Depth]"`, so a deeply nested client payload no longer costs quadratic time or overflows the stack. Rotation sizes, intervals and retention given with units are rejected when they are zero, as the numeric zero already was.
13
+ - 7b030bc: `LogFilter`, `LogixlysiaConfig`, `LogRotationConfig`, `SinkErrorContext` and `WebSocketLike` are exported from the package root as types, so a config object, a rotation config, an `onError` handler or a `wrapWs` hook can be typed without reaching into the package's internals. No runtime export changes.
14
+ - 665b71b: The access line is now written once per request, after Elysia has produced the final response, so it carries the status the client received for every exit: a `mapResponse` rewrite, an error mapped by an `onError` hook in either registration order, `set.status` followed by a thrown `Error`, a response returned from an `onRequest` hook, and an auth short-circuit. A generator (streaming) handler is logged when its body finishes, so `{duration}` covers the whole stream, and a throw inside the body produces an error line. A plain object with `code` and `response` keys is no longer mistaken for Elysia's `status()` result. A thrown 2xx or 3xx `status()` now logs at INFO, as an access line without its message, where it was an ERROR line carrying the message. With `useAsyncLocalStorage`, `useLogger()` works inside hooks registered after the plugin, inside a generator body, inside a handler that awaits `app.handle()` for another route, and in work that outlives the response; outside a request it is still a no-op. The `X-Request-Id` response header is set as soon as the request starts, so short-circuited responses carry it too. The request boundary is app-wide: once the plugin is mounted anywhere, every request of the application gets a line, including routes defined on parent apps (previously those were silently unlogged); mount the plugin once at the root. Apps running with `aot: false`, or mounting the plugin inside `group()` or `guard()`, keep the previous hook-based behaviour, including a second error line for an error thrown after the handler returned. Consequences for existing expectations: an error thrown after the handler returned, by an `afterHandle` hook or while Elysia builds the response, now produces one error line instead of a success line followed by an error line; when an app-wide `onError` registered before the plugin answers, the plugin never sees the thrown value, so the line is an access line at the level of the status sent, with an empty message and no error payload, where it was an error line carrying the thrown value; an error that a later `onError` maps to a 2xx or 3xx (a redirect to a login page, say) is logged as an error line carrying that status and the thrown message, where it was logged as ERROR 500 before; a custom log made from a hook registered after the plugin replaces the access line, as a custom log from the handler always did, where it was a second line before, and a custom log made from a later `onError` now comes before the error line instead of after it; and with two plugin instances in sibling modules, access lines now go through the first instance's sinks, while a custom log made through a later instance's `log` still reaches that instance's transports, without a request ID, and replaces the access line for that request (create the plugin once and share it).
15
+ - 0fb85de: `store.pino` is defined again. Since 6.7.0 the lazy pino Proxy was dropped by Elysia's `state()` because its target had no keys, so every handler that read `store.pino` threw. Assignments such as `store.pino.level = 'debug'` now reach pino. The plugin rejects at construction a `logFilter.level` that is not an array of `DEBUG`, `INFO`, `WARNING` or `ERROR`, `useTransportsOnly: true` without a transport, and a `flushTimeoutMs` that is not a finite number of milliseconds at or above 0; each of these used to turn logging off or misreport shutdown silently. `useTransportsOnly: true` with an empty `transports` list was previously accepted as an effectively disabled logger; use `disableInternalLogger` and `disableFileLogging` for that. `geoEnricher` ignores non-string fields in a Netlify `x-nf-geo` header instead of throwing. A `requestId.generator` that throws or returns an invalid id no longer produces an error line on every request; the plugin falls back to a generated UUID and reports the failure through `onError`, or on stderr at most once per interval when no hook is set.
16
+ - c7667f2: The HTTP adapters now take a JSON-safe copy of each record's `meta` at the moment it is logged. A later change to a logged object is no longer shipped, which also closes a redaction bypass under `autoRedact` (an adapter wrapped by `withRedaction` takes its copy when the wrapper hands the record over, after its own asynchronous redaction, so that window is unchanged). A value that cannot be serialized (a throwing `toJSON` or getter) is replaced by `"[Unserializable]"` for that field only, where it previously turned a whole Axiom, Better Stack or Datadog batch into that string or rejected a ClickHouse, HyperDX, OTLP, PostHog or Sentry batch. A BigInt anywhere in `meta` is shipped as its decimal string by every adapter, so a BigInt user id now resolves to PostHog's `distinct_id`, and `flattenMeta` no longer renders a nested BigInt or cycle as `[object Object]`.
17
+ - 3373fc1: `wrapWs` no longer discards what a hook returns. A returned string, object, `Buffer`, promise or generator reaches Elysia and is sent to the client exactly as without the wrapper; a hook that returned a value by accident (for example `(ws, m) => ws.send(m)`, whose result is Bun's numeric send status) now has that value sent too, as Elysia does for an unwrapped hook. An `async` hook that rejects is handled by Elysia's error path instead of becoming an unhandled rejection, and its lifecycle line is written after the hook settles.
18
+
3
19
  ## 6.9.4
4
20
 
5
21
  ### Patch Changes
package/dist/ai.d.ts CHANGED
@@ -28,6 +28,8 @@ type RequestInfo = Request;
28
28
  type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
29
29
  interface StoreData {
30
30
  beforeTime: bigint;
31
+ /** The status the client received, when the caller resolved it. `handleHttpError` prefers it over the thrown value. */
32
+ status?: number;
31
33
  }
32
34
  interface AIMetrics {
33
35
  calls?: number;
package/dist/axiom.d.ts CHANGED
@@ -29,17 +29,26 @@ interface BatchTransportOptions {
29
29
  */
30
30
  maxBatchSize?: number;
31
31
  /**
32
- * Batches allowed to be waiting on the backend at once. Once the limit is
33
- * reached, new batches are dropped and reported instead of buffered, so an
34
- * unreachable backend cannot grow memory without bound.
32
+ * The most entries one request carries. Lower it for a backend with a
33
+ * per-request item limit. The Sentry adapter defaults to 100.
34
+ * @default 500
35
+ */
36
+ maxEntriesPerRequest?: number;
37
+ /**
38
+ * Bound on the entries that wait behind the request in flight, as a
39
+ * multiple of `maxBatchSize`: at most `maxPendingBatches × maxBatchSize`
40
+ * entries wait, and entries beyond that are dropped and reported.
35
41
  * @default 32
36
42
  */
37
43
  maxPendingBatches?: number;
38
44
  /**
39
- * Called when a batch fails after retries, or is dropped because too
40
- * many batches are pending. When omitted, failures go to stderr, rate
41
- * limited to once every 5 seconds. Pass the same function you give
42
- * `config.onError` to see transport failures in one place.
45
+ * Called when a request fails after retries, or when entries are dropped
46
+ * because too many were already waiting. Failures of a request that a
47
+ * `log()` or `flush()` call started are rejected to that caller instead.
48
+ * When omitted, failures go to stderr, rate limited to once every 5
49
+ * seconds. To see every transport failure in one place, forward them to
50
+ * the function you give `config.onError`, as
51
+ * `error => handle({ error, sink: 'transport' })`.
43
52
  */
44
53
  onError?: (error: unknown) => void;
45
54
  /**
@@ -55,6 +64,8 @@ interface BatchTransportOptions {
55
64
  }
56
65
  /** A {@link Transport} that batches entries and can be flushed on demand. */
57
66
  interface AdapterTransport extends Transport {
67
+ /** Stops accepting entries, then flushes the ones already accepted. Idempotent. */
68
+ close: () => Promise<void>;
58
69
  /** Sends any buffered entries immediately. Call before process exit. */
59
70
  flush: () => Promise<void>;
60
71
  }
package/dist/axiom.js CHANGED
@@ -1,4 +1,4 @@
1
- import{c as O,d as m,e as x,g as P}from"./shared/Logixlysia-kwnc1c9b.js";import{k as N}from"./shared/Logixlysia-1ap5daz6.js";var W="https://api.axiom.co",Z=(k={})=>{let z=k.apiKey??m("AXIOM_API_KEY");if(!z)throw x("Axiom","missing API token. Set AXIOM_API_KEY or pass apiKey to createAxiomTransport()");let C=k.dataset??m("AXIOM_DATASET");if(!C)throw x("Axiom","missing dataset. Set AXIOM_DATASET or pass dataset to createAxiomTransport()");let Q=O(k.baseUrl??m("AXIOM_URL")??W),G=k.orgId??m("AXIOM_ORG_ID"),J={Authorization:`Bearer ${z}`,"Content-Type":"application/json"};if(G)J["X-Axiom-Org-Id"]=G;return P({body:(V)=>N(V.map((q)=>({...q.meta,_time:q.timestamp.toISOString(),level:q.level,message:q.message}))),headers:J,name:"Axiom",options:k,url:`${Q}/v1/datasets/${encodeURIComponent(C)}/ingest`})};export{Z as createAxiomTransport};
1
+ import{c as O,d as m,e as x,g as P}from"./shared/Logixlysia-xb08zg3q.js";import{k as N}from"./shared/Logixlysia-tqpczh9a.js";var W="https://api.axiom.co",Z=(k={})=>{let z=k.apiKey??m("AXIOM_API_KEY");if(!z)throw x("Axiom","missing API token. Set AXIOM_API_KEY or pass apiKey to createAxiomTransport()");let C=k.dataset??m("AXIOM_DATASET");if(!C)throw x("Axiom","missing dataset. Set AXIOM_DATASET or pass dataset to createAxiomTransport()");let Q=O(k.baseUrl??m("AXIOM_URL")??W),G=k.orgId??m("AXIOM_ORG_ID"),J={Authorization:`Bearer ${z}`,"Content-Type":"application/json"};if(G)J["X-Axiom-Org-Id"]=G;return P({body:(V)=>N(V.map((q)=>({...q.meta,_time:q.timestamp.toISOString(),level:q.level,message:q.message}))),headers:J,name:"Axiom",options:k,url:`${Q}/v1/datasets/${encodeURIComponent(C)}/ingest`})};export{Z as createAxiomTransport};
2
2
 
3
3
  //# debugId=9DE441F47039740664756E2164756E21
4
4
  //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2F4aW9tLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7XG4gIGNyZWF0ZUh0dHBUcmFuc3BvcnQsXG4gIGVudlN0cmluZyxcbiAgc3RyaXBUcmFpbGluZ1NsYXNoZXMsXG4gIHRyYW5zcG9ydEVycm9yXG59IGZyb20gJy4vYWRhcHRlcnMvc2hhcmVkJ1xuaW1wb3J0IHR5cGUgeyBBZGFwdGVyVHJhbnNwb3J0LCBCYXRjaFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL2FkYXB0ZXJzL3NoYXJlZCdcbmltcG9ydCB7IHN0cmluZ2lmeUZvckxvZyB9IGZyb20gJy4vdXRpbHMvanNvbidcblxuY29uc3QgREVGQVVMVF9CQVNFX1VSTCA9ICdodHRwczovL2FwaS5heGlvbS5jbydcblxuZXhwb3J0IGludGVyZmFjZSBBeGlvbVRyYW5zcG9ydE9wdGlvbnMgZXh0ZW5kcyBCYXRjaFRyYW5zcG9ydE9wdGlvbnMge1xuICAvKipcbiAgICogQXhpb20gQVBJIHRva2VuIHdpdGggaW5nZXN0IHBlcm1pc3Npb24gKGB4YWF0LeKApmApLlxuICAgKiBGYWxscyBiYWNrIHRvIHRoZSBgQVhJT01fQVBJX0tFWWAgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAqL1xuICBhcGlLZXk/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEFQSSBiYXNlIFVSTC5cbiAgICogRmFsbHMgYmFjayB0byBgQVhJT01fVVJMYC5cbiAgICogQGRlZmF1bHQgJ2h0dHBzOi8vYXBpLmF4aW9tLmNvJ1xuICAgKi9cbiAgYmFzZVVybD86IHN0cmluZ1xuICAvKipcbiAgICogVGFyZ2V0IGRhdGFzZXQgbmFtZS5cbiAgICogRmFsbHMgYmFjayB0byBgQVhJT01fREFUQVNFVGAuXG4gICAqL1xuICBkYXRhc2V0Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBPcmdhbml6YXRpb24gSUQg4oCUIHJlcXVpcmVkIHdoZW4gdXNpbmcgYSBwZXJzb25hbCBhY2Nlc3MgdG9rZW4uXG4gICAqIEZhbGxzIGJhY2sgdG8gYEFYSU9NX09SR19JRGAuXG4gICAqL1xuICBvcmdJZD86IHN0cmluZ1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0cmFuc3BvcnQgdGhhdCBzaGlwcyBsb2dzIHRvIGFuIEF4aW9tIGRhdGFzZXQgdmlhIHRoZSBpbmdlc3QgQVBJLlxuICogRXZlbnRzIGtlZXAgdGhlaXIgbmVzdGVkIHN0cnVjdHVyZSDigJQgQXhpb20gaW5kZXhlcyBldmVyeSBmaWVsZCB3aXRob3V0IGFcbiAqIHNjaGVtYSwgc28gYHJlcXVlc3QubWV0aG9kYCwgYGNvbnRleHQucmVxdWVzdElkYCwgZXRjLiBhcmUgYWxsIHF1ZXJ5YWJsZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBubyBBUEkgdG9rZW4gb3IgZGF0YXNldCBpcyBjb25maWd1cmVkLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQXhpb21UcmFuc3BvcnQgPSAoXG4gIG9wdGlvbnM6IEF4aW9tVHJhbnNwb3J0T3B0aW9ucyA9IHt9XG4pOiBBZGFwdGVyVHJhbnNwb3J0ID0+IHtcbiAgY29uc3QgYXBpS2V5ID0gb3B0aW9ucy5hcGlLZXkgPz8gZW52U3RyaW5nKCdBWElPTV9BUElfS0VZJylcbiAgaWYgKCFhcGlLZXkpIHtcbiAgICB0aHJvdyB0cmFuc3BvcnRFcnJvcihcbiAgICAgICdBeGlvbScsXG4gICAgICAnbWlzc2luZyBBUEkgdG9rZW4uIFNldCBBWElPTV9BUElfS0VZIG9yIHBhc3MgYXBpS2V5IHRvIGNyZWF0ZUF4aW9tVHJhbnNwb3J0KCknXG4gICAgKVxuICB9XG4gIGNvbnN0IGRhdGFzZXQgPSBvcHRpb25zLmRhdGFzZXQgPz8gZW52U3RyaW5nKCdBWElPTV9EQVRBU0VUJylcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgdGhyb3cgdHJhbnNwb3J0RXJyb3IoXG4gICAgICAnQXhpb20nLFxuICAgICAgJ21pc3NpbmcgZGF0YXNldC4gU2V0IEFYSU9NX0RBVEFTRVQgb3IgcGFzcyBkYXRhc2V0IHRvIGNyZWF0ZUF4aW9tVHJhbnNwb3J0KCknXG4gICAgKVxuICB9XG4gIGNvbnN0IGJhc2VVcmwgPSBzdHJpcFRyYWlsaW5nU2xhc2hlcyhcbiAgICBvcHRpb25zLmJhc2VVcmwgPz8gZW52U3RyaW5nKCdBWElPTV9VUkwnKSA/PyBERUZBVUxUX0JBU0VfVVJMXG4gIClcbiAgY29uc3Qgb3JnSWQgPSBvcHRpb25zLm9yZ0lkID8/IGVudlN0cmluZygnQVhJT01fT1JHX0lEJylcblxuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthcGlLZXl9YCxcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gIH1cbiAgaWYgKG9yZ0lkKSB7XG4gICAgaGVhZGVyc1snWC1BeGlvbS1PcmctSWQnXSA9IG9yZ0lkXG4gIH1cblxuICByZXR1cm4gY3JlYXRlSHR0cFRyYW5zcG9ydCh7XG4gICAgYm9keTogZW50cmllcyA9PlxuICAgICAgc3RyaW5naWZ5Rm9yTG9nKFxuICAgICAgICAvLyBNZXRhIGZpcnN0IHNvIHRoZSBhZGFwdGVyLW93bmVkIGZpZWxkcyBiZWxvdyBhbHdheXMgd2luIG9uIGNvbGxpc2lvbi5cbiAgICAgICAgZW50cmllcy5tYXAoZW50cnkgPT4gKHtcbiAgICAgICAgICAuLi5lbnRyeS5tZXRhLFxuICAgICAgICAgIF90aW1lOiBlbnRyeS50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBsZXZlbDogZW50cnkubGV2ZWwsXG4gICAgICAgICAgbWVzc2FnZTogZW50cnkubWVzc2FnZVxuICAgICAgICB9KSlcbiAgICAgICksXG4gICAgaGVhZGVycyxcbiAgICBuYW1lOiAnQXhpb20nLFxuICAgIG9wdGlvbnMsXG4gICAgdXJsOiBgJHtiYXNlVXJsfS92MS9kYXRhc2V0cy8ke2VuY29kZVVSSUNvbXBvbmVudChkYXRhc2V0KX0vaW5nZXN0YFxuICB9KVxufVxuXG5leHBvcnQgdHlwZSB7IEFkYXB0ZXJUcmFuc3BvcnQgfSBmcm9tICcuL2FkYXB0ZXJzL3NoYXJlZCdcbiIKICBdLAogICJtYXBwaW5ncyI6ICJ1SEFTQSxVQUFNLEVBQW1CLHVCQWlDWixFQUF1QixDQUNsQyxFQUFpQyxDQUFDLElBQ2IsQ0FDckIsSUFBTSxFQUFTLEVBQVEsUUFBVSxFQUFVLGVBQWUsRUFDMUQsR0FBSSxDQUFDLEVBQ0gsTUFBTSxFQUNKLFFBQ0EsK0VBQ0YsRUFFRixJQUFNLEVBQVUsRUFBUSxTQUFXLEVBQVUsZUFBZSxFQUM1RCxHQUFJLENBQUMsRUFDSCxNQUFNLEVBQ0osUUFDQSw4RUFDRixFQUVGLElBQU0sRUFBVSxFQUNkLEVBQVEsU0FBVyxFQUFVLFdBQVcsR0FBSyxDQUMvQyxFQUNNLEVBQVEsRUFBUSxPQUFTLEVBQVUsY0FBYyxFQUVqRCxFQUFrQyxDQUN0QyxjQUFlLFVBQVUsSUFDekIsZUFBZ0Isa0JBQ2xCLEVBQ0EsR0FBSSxFQUNGLEVBQVEsa0JBQW9CLEVBRzlCLE9BQU8sRUFBb0IsQ0FDekIsS0FBTSxLQUNKLEVBRUUsRUFBUSxJQUFJLE1BQVUsSUFDakIsRUFBTSxLQUNULE1BQU8sRUFBTSxVQUFVLFlBQVksRUFDbkMsTUFBTyxFQUFNLE1BQ2IsUUFBUyxFQUFNLE9BQ2pCLEVBQUUsQ0FDSixFQUNGLFVBQ0EsS0FBTSxRQUNOLFVBQ0EsSUFBSyxHQUFHLGlCQUF1QixtQkFBbUIsQ0FBTyxVQUMzRCxDQUFDIiwKICAiZGVidWdJZCI6ICI5REU0NDFGNDcwMzk3NDA2NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
@@ -29,17 +29,26 @@ interface BatchTransportOptions {
29
29
  */
30
30
  maxBatchSize?: number;
31
31
  /**
32
- * Batches allowed to be waiting on the backend at once. Once the limit is
33
- * reached, new batches are dropped and reported instead of buffered, so an
34
- * unreachable backend cannot grow memory without bound.
32
+ * The most entries one request carries. Lower it for a backend with a
33
+ * per-request item limit. The Sentry adapter defaults to 100.
34
+ * @default 500
35
+ */
36
+ maxEntriesPerRequest?: number;
37
+ /**
38
+ * Bound on the entries that wait behind the request in flight, as a
39
+ * multiple of `maxBatchSize`: at most `maxPendingBatches × maxBatchSize`
40
+ * entries wait, and entries beyond that are dropped and reported.
35
41
  * @default 32
36
42
  */
37
43
  maxPendingBatches?: number;
38
44
  /**
39
- * Called when a batch fails after retries, or is dropped because too
40
- * many batches are pending. When omitted, failures go to stderr, rate
41
- * limited to once every 5 seconds. Pass the same function you give
42
- * `config.onError` to see transport failures in one place.
45
+ * Called when a request fails after retries, or when entries are dropped
46
+ * because too many were already waiting. Failures of a request that a
47
+ * `log()` or `flush()` call started are rejected to that caller instead.
48
+ * When omitted, failures go to stderr, rate limited to once every 5
49
+ * seconds. To see every transport failure in one place, forward them to
50
+ * the function you give `config.onError`, as
51
+ * `error => handle({ error, sink: 'transport' })`.
43
52
  */
44
53
  onError?: (error: unknown) => void;
45
54
  /**
@@ -55,6 +64,8 @@ interface BatchTransportOptions {
55
64
  }
56
65
  /** A {@link Transport} that batches entries and can be flushed on demand. */
57
66
  interface AdapterTransport extends Transport {
67
+ /** Stops accepting entries, then flushes the ones already accepted. Idempotent. */
68
+ close: () => Promise<void>;
58
69
  /** Sends any buffered entries immediately. Call before process exit. */
59
70
  flush: () => Promise<void>;
60
71
  }
@@ -1,4 +1,4 @@
1
- import{c as G,d as x,e as J,g as K,j as Q}from"./shared/Logixlysia-kwnc1c9b.js";import{k as C}from"./shared/Logixlysia-1ap5daz6.js";var V="https://in.logs.betterstack.com",Y=(q={})=>{let z=q.sourceToken??x("BETTER_STACK_SOURCE_TOKEN");if(!z)throw J("Better Stack","missing source token. Set BETTER_STACK_SOURCE_TOKEN or pass sourceToken to createBetterStackTransport()");return K({body:(R)=>C(R.map((m)=>({...m.meta,dt:m.timestamp.toISOString(),level:m.level,message:Q(m)}))),headers:{Authorization:`Bearer ${z}`,"Content-Type":"application/json"},name:"Better Stack",options:q,url:G(q.endpoint??x("BETTER_STACK_INGESTING_HOST")??V)})};export{Y as createBetterStackTransport};
1
+ import{c as G,d as x,e as J,g as K,j as Q}from"./shared/Logixlysia-xb08zg3q.js";import{k as C}from"./shared/Logixlysia-tqpczh9a.js";var V="https://in.logs.betterstack.com",Y=(q={})=>{let z=q.sourceToken??x("BETTER_STACK_SOURCE_TOKEN");if(!z)throw J("Better Stack","missing source token. Set BETTER_STACK_SOURCE_TOKEN or pass sourceToken to createBetterStackTransport()");return K({body:(R)=>C(R.map((m)=>({...m.meta,dt:m.timestamp.toISOString(),level:m.level,message:Q(m)}))),headers:{Authorization:`Bearer ${z}`,"Content-Type":"application/json"},name:"Better Stack",options:q,url:G(q.endpoint??x("BETTER_STACK_INGESTING_HOST")??V)})};export{Y as createBetterStackTransport};
2
2
 
3
3
  //# debugId=45939F6D5FC2E8D764756E2164756E21
4
4
  //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2JldHRlci1zdGFjay50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQge1xuICBjcmVhdGVIdHRwVHJhbnNwb3J0LFxuICBkZWZhdWx0Qm9keSxcbiAgZW52U3RyaW5nLFxuICBzdHJpcFRyYWlsaW5nU2xhc2hlcyxcbiAgdHJhbnNwb3J0RXJyb3Jcbn0gZnJvbSAnLi9hZGFwdGVycy9zaGFyZWQnXG5pbXBvcnQgdHlwZSB7IEFkYXB0ZXJUcmFuc3BvcnQsIEJhdGNoVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vYWRhcHRlcnMvc2hhcmVkJ1xuaW1wb3J0IHsgc3RyaW5naWZ5Rm9yTG9nIH0gZnJvbSAnLi91dGlscy9qc29uJ1xuXG5jb25zdCBERUZBVUxUX0VORFBPSU5UID0gJ2h0dHBzOi8vaW4ubG9ncy5iZXR0ZXJzdGFjay5jb20nXG5cbmV4cG9ydCBpbnRlcmZhY2UgQmV0dGVyU3RhY2tUcmFuc3BvcnRPcHRpb25zIGV4dGVuZHMgQmF0Y2hUcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEluZ2VzdGluZyBVUkwgc2hvd24gbmV4dCB0byB0aGUgc291cmNlIHRva2VuIOKAlCBuZXdlciBzb3VyY2VzIGdldCBhXG4gICAqIGRlZGljYXRlZCBob3N0IGxpa2UgYGh0dHBzOi8vczEyMzQ1Ni5ldS1uYmctMi5iZXR0ZXJzdGFja2RhdGEuY29tYC5cbiAgICogRmFsbHMgYmFjayB0byBgQkVUVEVSX1NUQUNLX0lOR0VTVElOR19IT1NUYC5cbiAgICogQGRlZmF1bHQgJ2h0dHBzOi8vaW4ubG9ncy5iZXR0ZXJzdGFjay5jb20nXG4gICAqL1xuICBlbmRwb2ludD86IHN0cmluZ1xuICAvKipcbiAgICogU291cmNlIHRva2VuIGZyb20gdGhlIEJldHRlciBTdGFjayBzb3VyY2Ugc2V0dGluZ3MsIHNlbnQgYXMgYSBCZWFyZXJcbiAgICogdG9rZW4uIEZhbGxzIGJhY2sgdG8gdGhlIGBCRVRURVJfU1RBQ0tfU09VUkNFX1RPS0VOYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIHNvdXJjZVRva2VuPzogc3RyaW5nXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRyYW5zcG9ydCB0aGF0IHNoaXBzIGxvZ3MgdG8gQmV0dGVyIFN0YWNrIChUZWxlbWV0cnkgLyBMb2dzKS5cbiAqIEVhY2ggbG9nIHBvc3RzIGFzIEpTT04gd2l0aCBhIGBkdGAgdGltZXN0YW1wLCBgbGV2ZWxgLCBgbWVzc2FnZWAsIGFuZCB0aGVcbiAqIGZ1bGwgbWV0YSBvYmplY3Qg4oCUIGFsbCBxdWVyeWFibGUgaW4gTGl2ZSB0YWlsIGFuZCBTUUwuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IFdoZW4gbm8gc291cmNlIHRva2VuIGlzIGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVCZXR0ZXJTdGFja1RyYW5zcG9ydCA9IChcbiAgb3B0aW9uczogQmV0dGVyU3RhY2tUcmFuc3BvcnRPcHRpb25zID0ge31cbik6IEFkYXB0ZXJUcmFuc3BvcnQgPT4ge1xuICBjb25zdCBzb3VyY2VUb2tlbiA9XG4gICAgb3B0aW9ucy5zb3VyY2VUb2tlbiA/PyBlbnZTdHJpbmcoJ0JFVFRFUl9TVEFDS19TT1VSQ0VfVE9LRU4nKVxuICBpZiAoIXNvdXJjZVRva2VuKSB7XG4gICAgdGhyb3cgdHJhbnNwb3J0RXJyb3IoXG4gICAgICAnQmV0dGVyIFN0YWNrJyxcbiAgICAgICdtaXNzaW5nIHNvdXJjZSB0b2tlbi4gU2V0IEJFVFRFUl9TVEFDS19TT1VSQ0VfVE9LRU4gb3IgcGFzcyBzb3VyY2VUb2tlbiB0byBjcmVhdGVCZXR0ZXJTdGFja1RyYW5zcG9ydCgpJ1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVIdHRwVHJhbnNwb3J0KHtcbiAgICBib2R5OiBlbnRyaWVzID0+XG4gICAgICBzdHJpbmdpZnlGb3JMb2coXG4gICAgICAgIC8vIE1ldGEgZmlyc3Qgc28gdGhlIGFkYXB0ZXItb3duZWQgZmllbGRzIGJlbG93IGFsd2F5cyB3aW4gb24gY29sbGlzaW9uLlxuICAgICAgICBlbnRyaWVzLm1hcChlbnRyeSA9PiAoe1xuICAgICAgICAgIC4uLmVudHJ5Lm1ldGEsXG4gICAgICAgICAgZHQ6IGVudHJ5LnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGxldmVsOiBlbnRyeS5sZXZlbCxcbiAgICAgICAgICBtZXNzYWdlOiBkZWZhdWx0Qm9keShlbnRyeSlcbiAgICAgICAgfSkpXG4gICAgICApLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzb3VyY2VUb2tlbn1gLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgIH0sXG4gICAgbmFtZTogJ0JldHRlciBTdGFjaycsXG4gICAgb3B0aW9ucyxcbiAgICB1cmw6IHN0cmlwVHJhaWxpbmdTbGFzaGVzKFxuICAgICAgb3B0aW9ucy5lbmRwb2ludCA/P1xuICAgICAgICBlbnZTdHJpbmcoJ0JFVFRFUl9TVEFDS19JTkdFU1RJTkdfSE9TVCcpID8/XG4gICAgICAgIERFRkFVTFRfRU5EUE9JTlRcbiAgICApXG4gIH0pXG59XG5cbmV4cG9ydCB0eXBlIHsgQWRhcHRlclRyYW5zcG9ydCB9IGZyb20gJy4vYWRhcHRlcnMvc2hhcmVkJ1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjhIQVVBLFVBQU0sRUFBbUIsa0NBd0JaLEVBQTZCLENBQ3hDLEVBQXVDLENBQUMsSUFDbkIsQ0FDckIsSUFBTSxFQUNKLEVBQVEsYUFBZSxFQUFVLDJCQUEyQixFQUM5RCxHQUFJLENBQUMsRUFDSCxNQUFNLEVBQ0osZUFDQSx5R0FDRixFQUdGLE9BQU8sRUFBb0IsQ0FDekIsS0FBTSxLQUNKLEVBRUUsRUFBUSxJQUFJLE1BQVUsSUFDakIsRUFBTSxLQUNULEdBQUksRUFBTSxVQUFVLFlBQVksRUFDaEMsTUFBTyxFQUFNLE1BQ2IsUUFBUyxFQUFZLENBQUssQ0FDNUIsRUFBRSxDQUNKLEVBQ0YsUUFBUyxDQUNQLGNBQWUsVUFBVSxJQUN6QixlQUFnQixrQkFDbEIsRUFDQSxLQUFNLGVBQ04sVUFDQSxJQUFLLEVBQ0gsRUFBUSxVQUNOLEVBQVUsNkJBQTZCLEdBQ3ZDLENBQ0osQ0FDRixDQUFDIiwKICAiZGVidWdJZCI6ICI0NTkzOUY2RDVGQzJFOEQ3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
@@ -29,17 +29,26 @@ interface BatchTransportOptions {
29
29
  */
30
30
  maxBatchSize?: number;
31
31
  /**
32
- * Batches allowed to be waiting on the backend at once. Once the limit is
33
- * reached, new batches are dropped and reported instead of buffered, so an
34
- * unreachable backend cannot grow memory without bound.
32
+ * The most entries one request carries. Lower it for a backend with a
33
+ * per-request item limit. The Sentry adapter defaults to 100.
34
+ * @default 500
35
+ */
36
+ maxEntriesPerRequest?: number;
37
+ /**
38
+ * Bound on the entries that wait behind the request in flight, as a
39
+ * multiple of `maxBatchSize`: at most `maxPendingBatches × maxBatchSize`
40
+ * entries wait, and entries beyond that are dropped and reported.
35
41
  * @default 32
36
42
  */
37
43
  maxPendingBatches?: number;
38
44
  /**
39
- * Called when a batch fails after retries, or is dropped because too
40
- * many batches are pending. When omitted, failures go to stderr, rate
41
- * limited to once every 5 seconds. Pass the same function you give
42
- * `config.onError` to see transport failures in one place.
45
+ * Called when a request fails after retries, or when entries are dropped
46
+ * because too many were already waiting. Failures of a request that a
47
+ * `log()` or `flush()` call started are rejected to that caller instead.
48
+ * When omitted, failures go to stderr, rate limited to once every 5
49
+ * seconds. To see every transport failure in one place, forward them to
50
+ * the function you give `config.onError`, as
51
+ * `error => handle({ error, sink: 'transport' })`.
43
52
  */
44
53
  onError?: (error: unknown) => void;
45
54
  /**
@@ -55,6 +64,8 @@ interface BatchTransportOptions {
55
64
  }
56
65
  /** A {@link Transport} that batches entries and can be flushed on demand. */
57
66
  interface AdapterTransport extends Transport {
67
+ /** Stops accepting entries, then flushes the ones already accepted. Idempotent. */
68
+ close: () => Promise<void>;
58
69
  /** Sends any buffered entries immediately. Call before process exit. */
59
70
  flush: () => Promise<void>;
60
71
  }
@@ -1,4 +1,4 @@
1
- import{c as $,d as G,e as x,g as J,h as M,j as O}from"./shared/Logixlysia-kwnc1c9b.js";import"./shared/Logixlysia-1ap5daz6.js";var C="http://localhost:8123",N="default",q="logs",B=/^[A-Za-z0-9_]+$/u,Z=(j,z)=>{if(!B.test(j))throw x("ClickHouse",`invalid ${z} '${j}'. Only letters, digits, and underscores are allowed`);return j},H=(j)=>{let z={};for(let[K,Q]of Object.entries(M(j.meta)))z[K]=String(Q);return JSON.stringify({attributes:z,level:j.level,message:O(j),timestamp:j.timestamp.toISOString()})},k=(j={})=>{let z=$(j.url??G("CLICKHOUSE_URL")??C),K=Z(j.database??G("CLICKHOUSE_DATABASE")??N,"database"),Q=Z(j.table??G("CLICKHOUSE_TABLE")??q,"table"),X=j.username??G("CLICKHOUSE_USERNAME"),Y=j.password??G("CLICKHOUSE_PASSWORD"),P=new URLSearchParams({date_time_input_format:"best_effort",query:`INSERT INTO ${K}.${Q} FORMAT JSONEachRow`}),V={"Content-Type":"application/json"};if(X)V["X-ClickHouse-User"]=X;if(Y)V["X-ClickHouse-Key"]=Y;return J({body:(W)=>W.map(H).join(`
1
+ import{c as $,d as G,e as x,g as J,h as M,j as O}from"./shared/Logixlysia-xb08zg3q.js";import"./shared/Logixlysia-tqpczh9a.js";var C="http://localhost:8123",N="default",q="logs",B=/^[A-Za-z0-9_]+$/u,Z=(j,z)=>{if(!B.test(j))throw x("ClickHouse",`invalid ${z} '${j}'. Only letters, digits, and underscores are allowed`);return j},H=(j)=>{let z={};for(let[K,Q]of Object.entries(M(j.meta)))z[K]=String(Q);return JSON.stringify({attributes:z,level:j.level,message:O(j),timestamp:j.timestamp.toISOString()})},k=(j={})=>{let z=$(j.url??G("CLICKHOUSE_URL")??C),K=Z(j.database??G("CLICKHOUSE_DATABASE")??N,"database"),Q=Z(j.table??G("CLICKHOUSE_TABLE")??q,"table"),X=j.username??G("CLICKHOUSE_USERNAME"),Y=j.password??G("CLICKHOUSE_PASSWORD"),P=new URLSearchParams({date_time_input_format:"best_effort",query:`INSERT INTO ${K}.${Q} FORMAT JSONEachRow`}),V={"Content-Type":"application/json"};if(X)V["X-ClickHouse-User"]=X;if(Y)V["X-ClickHouse-Key"]=Y;return J({body:(W)=>W.map(H).join(`
2
2
  `),headers:V,name:"ClickHouse",options:j,url:`${z}/?${P.toString()}`})};export{k as createClickHouseTransport};
3
3
 
4
4
  //# debugId=1B6FC943015B221464756E2164756E21
package/dist/datadog.d.ts CHANGED
@@ -29,17 +29,26 @@ interface BatchTransportOptions {
29
29
  */
30
30
  maxBatchSize?: number;
31
31
  /**
32
- * Batches allowed to be waiting on the backend at once. Once the limit is
33
- * reached, new batches are dropped and reported instead of buffered, so an
34
- * unreachable backend cannot grow memory without bound.
32
+ * The most entries one request carries. Lower it for a backend with a
33
+ * per-request item limit. The Sentry adapter defaults to 100.
34
+ * @default 500
35
+ */
36
+ maxEntriesPerRequest?: number;
37
+ /**
38
+ * Bound on the entries that wait behind the request in flight, as a
39
+ * multiple of `maxBatchSize`: at most `maxPendingBatches × maxBatchSize`
40
+ * entries wait, and entries beyond that are dropped and reported.
35
41
  * @default 32
36
42
  */
37
43
  maxPendingBatches?: number;
38
44
  /**
39
- * Called when a batch fails after retries, or is dropped because too
40
- * many batches are pending. When omitted, failures go to stderr, rate
41
- * limited to once every 5 seconds. Pass the same function you give
42
- * `config.onError` to see transport failures in one place.
45
+ * Called when a request fails after retries, or when entries are dropped
46
+ * because too many were already waiting. Failures of a request that a
47
+ * `log()` or `flush()` call started are rejected to that caller instead.
48
+ * When omitted, failures go to stderr, rate limited to once every 5
49
+ * seconds. To see every transport failure in one place, forward them to
50
+ * the function you give `config.onError`, as
51
+ * `error => handle({ error, sink: 'transport' })`.
43
52
  */
44
53
  onError?: (error: unknown) => void;
45
54
  /**
@@ -55,6 +64,8 @@ interface BatchTransportOptions {
55
64
  }
56
65
  /** A {@link Transport} that batches entries and can be flushed on demand. */
57
66
  interface AdapterTransport extends Transport {
67
+ /** Stops accepting entries, then flushes the ones already accepted. Idempotent. */
68
+ close: () => Promise<void>;
58
69
  /** Sends any buffered entries immediately. Call before process exit. */
59
70
  flush: () => Promise<void>;
60
71
  }
package/dist/datadog.js CHANGED
@@ -1,4 +1,4 @@
1
- import{d as z,e as V,g as W,j as X}from"./shared/Logixlysia-kwnc1c9b.js";import{k as Q}from"./shared/Logixlysia-1ap5daz6.js";var B="datadoghq.com",N="logixlysia",b=(w={})=>{let G=w.apiKey??z("DD_API_KEY");if(!G)throw V("Datadog","missing API key. Set DD_API_KEY or pass apiKey to createDatadogTransport()");let Y=w.site??z("DD_SITE")??B,Z=w.service??z("DD_SERVICE")??N,J=w.hostname??z("DD_HOSTNAME"),$=w.source??N,M=Object.entries(w.tags??{}).map(([q,x])=>`${q}:${x}`).join(","),j=(q)=>{let x={...q.meta,ddsource:$,message:X(q),service:Z,status:q.level.toLowerCase(),timestamp:q.timestamp.toISOString()};if(M)x.ddtags=M;if(J)x.hostname=J;if(typeof q.meta.status==="number")x.http={status_code:q.meta.status};return x};return W({body:(q)=>Q(q.map(j)),headers:{"Content-Type":"application/json","DD-API-KEY":G},name:"Datadog",options:w,url:`https://http-intake.logs.${Y}/api/v2/logs`})};export{b as createDatadogTransport};
1
+ import{d as z,e as V,g as W,j as X}from"./shared/Logixlysia-xb08zg3q.js";import{k as Q}from"./shared/Logixlysia-tqpczh9a.js";var B="datadoghq.com",N="logixlysia",b=(w={})=>{let G=w.apiKey??z("DD_API_KEY");if(!G)throw V("Datadog","missing API key. Set DD_API_KEY or pass apiKey to createDatadogTransport()");let Y=w.site??z("DD_SITE")??B,Z=w.service??z("DD_SERVICE")??N,J=w.hostname??z("DD_HOSTNAME"),$=w.source??N,M=Object.entries(w.tags??{}).map(([q,x])=>`${q}:${x}`).join(","),j=(q)=>{let x={...q.meta,ddsource:$,message:X(q),service:Z,status:q.level.toLowerCase(),timestamp:q.timestamp.toISOString()};if(M)x.ddtags=M;if(J)x.hostname=J;if(typeof q.meta.status==="number")x.http={status_code:q.meta.status};return x};return W({body:(q)=>Q(q.map(j)),headers:{"Content-Type":"application/json","DD-API-KEY":G},name:"Datadog",options:w,url:`https://http-intake.logs.${Y}/api/v2/logs`})};export{b as createDatadogTransport};
2
2
 
3
3
  //# debugId=2A62BE9F1CA2BFC064756E2164756E21
4
4
  //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2RhdGFkb2cudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHtcbiAgY3JlYXRlSHR0cFRyYW5zcG9ydCxcbiAgZGVmYXVsdEJvZHksXG4gIGVudlN0cmluZyxcbiAgdHJhbnNwb3J0RXJyb3Jcbn0gZnJvbSAnLi9hZGFwdGVycy9zaGFyZWQnXG5pbXBvcnQgdHlwZSB7XG4gIEFkYXB0ZXJUcmFuc3BvcnQsXG4gIEJhdGNoVHJhbnNwb3J0T3B0aW9ucyxcbiAgTG9nRW50cnlcbn0gZnJvbSAnLi9hZGFwdGVycy9zaGFyZWQnXG5pbXBvcnQgeyBzdHJpbmdpZnlGb3JMb2cgfSBmcm9tICcuL3V0aWxzL2pzb24nXG5cbmNvbnN0IERFRkFVTFRfU0lURSA9ICdkYXRhZG9naHEuY29tJ1xuY29uc3QgREVGQVVMVF9TT1VSQ0UgPSAnbG9naXhseXNpYSdcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhZG9nVHJhbnNwb3J0T3B0aW9ucyBleHRlbmRzIEJhdGNoVHJhbnNwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEYXRhZG9nIEFQSSBrZXksIHNlbnQgYXMgdGhlIGBERC1BUEktS0VZYCBoZWFkZXIuXG4gICAqIEZhbGxzIGJhY2sgdG8gdGhlIGBERF9BUElfS0VZYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIGFwaUtleT86IHN0cmluZ1xuICAvKipcbiAgICogSG9zdG5hbWUgcmVwb3J0ZWQgd2l0aCBlYWNoIGxvZy5cbiAgICogRmFsbHMgYmFjayB0byBgRERfSE9TVE5BTUVgOyBvbWl0dGVkIHdoZW4gdW5zZXQuXG4gICAqL1xuICBob3N0bmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogYHNlcnZpY2VgIGZhY2V0IG9uIGVhY2ggbG9nLlxuICAgKiBGYWxscyBiYWNrIHRvIGBERF9TRVJWSUNFYC5cbiAgICogQGRlZmF1bHQgJ2xvZ2l4bHlzaWEnXG4gICAqL1xuICBzZXJ2aWNlPzogc3RyaW5nXG4gIC8qKlxuICAgKiBEYXRhZG9nIHNpdGU6IGBkYXRhZG9naHEuY29tYCAoVVMxKSwgYGRhdGFkb2docS5ldWAgKEVVKSxcbiAgICogYHVzMy5kYXRhZG9naHEuY29tYCwgYHVzNS5kYXRhZG9naHEuY29tYCwgYGFwMS5kYXRhZG9naHEuY29tYCwg4oCmXG4gICAqIEZhbGxzIGJhY2sgdG8gYEREX1NJVEVgLlxuICAgKiBAZGVmYXVsdCAnZGF0YWRvZ2hxLmNvbSdcbiAgICovXG4gIHNpdGU/OiBzdHJpbmdcbiAgLyoqIGBkZHNvdXJjZWAgZmFjZXQgb24gZWFjaCBsb2cuIEBkZWZhdWx0ICdsb2dpeGx5c2lhJyAqL1xuICBzb3VyY2U/OiBzdHJpbmdcbiAgLyoqIFRhZ3MgcmVuZGVyZWQgaW50byBgZGR0YWdzYCBhcyBga2V5OnZhbHVlLGtleTI6dmFsdWUyYC4gKi9cbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHJhbnNwb3J0IHRoYXQgc2hpcHMgbG9ncyB0byBEYXRhZG9nIHZpYSB0aGUgdjIgbG9ncyBpbnRha2UgQVBJLlxuICogVGhlIGxvZyBsZXZlbCBsYW5kcyBpbiB0aGUgYHN0YXR1c2AgYXR0cmlidXRlIChEYXRhZG9nJ3MgZGVmYXVsdCBzdGF0dXNcbiAqIHJlbWFwcGVyKSwgYW5kIHRoZSBmdWxsIG1ldGEgb2JqZWN0IHJpZGVzIGFsb25nIGFzIHNlYXJjaGFibGUgYXR0cmlidXRlcy5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBubyBBUEkga2V5IGlzIGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVEYXRhZG9nVHJhbnNwb3J0ID0gKFxuICBvcHRpb25zOiBEYXRhZG9nVHJhbnNwb3J0T3B0aW9ucyA9IHt9XG4pOiBBZGFwdGVyVHJhbnNwb3J0ID0+IHtcbiAgY29uc3QgYXBpS2V5ID0gb3B0aW9ucy5hcGlLZXkgPz8gZW52U3RyaW5nKCdERF9BUElfS0VZJylcbiAgaWYgKCFhcGlLZXkpIHtcbiAgICB0aHJvdyB0cmFuc3BvcnRFcnJvcihcbiAgICAgICdEYXRhZG9nJyxcbiAgICAgICdtaXNzaW5nIEFQSSBrZXkuIFNldCBERF9BUElfS0VZIG9yIHBhc3MgYXBpS2V5IHRvIGNyZWF0ZURhdGFkb2dUcmFuc3BvcnQoKSdcbiAgICApXG4gIH1cbiAgY29uc3Qgc2l0ZSA9IG9wdGlvbnMuc2l0ZSA/PyBlbnZTdHJpbmcoJ0REX1NJVEUnKSA/PyBERUZBVUxUX1NJVEVcbiAgY29uc3Qgc2VydmljZSA9IG9wdGlvbnMuc2VydmljZSA/PyBlbnZTdHJpbmcoJ0REX1NFUlZJQ0UnKSA/PyBERUZBVUxUX1NPVVJDRVxuICBjb25zdCBob3N0bmFtZSA9IG9wdGlvbnMuaG9zdG5hbWUgPz8gZW52U3RyaW5nKCdERF9IT1NUTkFNRScpXG4gIGNvbnN0IHNvdXJjZSA9IG9wdGlvbnMuc291cmNlID8/IERFRkFVTFRfU09VUkNFXG4gIGNvbnN0IGRkdGFncyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMudGFncyA/PyB7fSlcbiAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06JHt2YWx1ZX1gKVxuICAgIC5qb2luKCcsJylcblxuICBjb25zdCB0b0V2ZW50ID0gKGVudHJ5OiBMb2dFbnRyeSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICAvLyBNZXRhIGZpcnN0IHNvIHRoZSBhZGFwdGVyLW93bmVkIGZhY2V0cyBiZWxvdyBhbHdheXMgd2luIOKAlCBhY2Nlc3MtbG9nXG4gICAgLy8gbWV0YSBjYXJyaWVzIGFuIEhUVFAgYHN0YXR1c2AgdGhhdCBtdXN0IG5vdCBjbG9iYmVyIERhdGFkb2cncyBzdGF0dXMuXG4gICAgY29uc3QgZXZlbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgLi4uZW50cnkubWV0YSxcbiAgICAgIGRkc291cmNlOiBzb3VyY2UsXG4gICAgICBtZXNzYWdlOiBkZWZhdWx0Qm9keShlbnRyeSksXG4gICAgICBzZXJ2aWNlLFxuICAgICAgc3RhdHVzOiBlbnRyeS5sZXZlbC50b0xvd2VyQ2FzZSgpLFxuICAgICAgdGltZXN0YW1wOiBlbnRyeS50aW1lc3RhbXAudG9JU09TdHJpbmcoKVxuICAgIH1cbiAgICBpZiAoZGR0YWdzKSB7XG4gICAgICBldmVudC5kZHRhZ3MgPSBkZHRhZ3NcbiAgICB9XG4gICAgaWYgKGhvc3RuYW1lKSB7XG4gICAgICBldmVudC5ob3N0bmFtZSA9IGhvc3RuYW1lXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW50cnkubWV0YS5zdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgICBldmVudC5odHRwID0geyBzdGF0dXNfY29kZTogZW50cnkubWV0YS5zdGF0dXMgfVxuICAgIH1cbiAgICByZXR1cm4gZXZlbnRcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVIdHRwVHJhbnNwb3J0KHtcbiAgICBib2R5OiBlbnRyaWVzID0+IHN0cmluZ2lmeUZvckxvZyhlbnRyaWVzLm1hcCh0b0V2ZW50KSksXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdERC1BUEktS0VZJzogYXBpS2V5XG4gICAgfSxcbiAgICBuYW1lOiAnRGF0YWRvZycsXG4gICAgb3B0aW9ucyxcbiAgICB1cmw6IGBodHRwczovL2h0dHAtaW50YWtlLmxvZ3MuJHtzaXRlfS9hcGkvdjIvbG9nc2BcbiAgfSlcbn1cblxuZXhwb3J0IHR5cGUgeyBBZGFwdGVyVHJhbnNwb3J0IH0gZnJvbSAnLi9hZGFwdGVycy9zaGFyZWQnXG4iCiAgXSwKICAibWFwcGluZ3MiOiAidUhBYUEsVUFBTSxFQUFlLGdCQUNmLEVBQWlCLGFBdUNWLEVBQXlCLENBQ3BDLEVBQW1DLENBQUMsSUFDZixDQUNyQixJQUFNLEVBQVMsRUFBUSxRQUFVLEVBQVUsWUFBWSxFQUN2RCxHQUFJLENBQUMsRUFDSCxNQUFNLEVBQ0osVUFDQSw0RUFDRixFQUVGLElBQU0sRUFBTyxFQUFRLE1BQVEsRUFBVSxTQUFTLEdBQUssRUFDL0MsRUFBVSxFQUFRLFNBQVcsRUFBVSxZQUFZLEdBQUssRUFDeEQsRUFBVyxFQUFRLFVBQVksRUFBVSxhQUFhLEVBQ3RELEVBQVMsRUFBUSxRQUFVLEVBQzNCLEVBQVMsT0FBTyxRQUFRLEVBQVEsTUFBUSxDQUFDLENBQUMsRUFDN0MsSUFBSSxFQUFFLEVBQUssS0FBVyxHQUFHLEtBQU8sR0FBTyxFQUN2QyxLQUFLLEdBQUcsRUFFTCxFQUFVLENBQUMsSUFBNkMsQ0FHNUQsSUFBTSxFQUFpQyxJQUNsQyxFQUFNLEtBQ1QsU0FBVSxFQUNWLFFBQVMsRUFBWSxDQUFLLEVBQzFCLFVBQ0EsT0FBUSxFQUFNLE1BQU0sWUFBWSxFQUNoQyxVQUFXLEVBQU0sVUFBVSxZQUFZLENBQ3pDLEVBQ0EsR0FBSSxFQUNGLEVBQU0sT0FBUyxFQUVqQixHQUFJLEVBQ0YsRUFBTSxTQUFXLEVBRW5CLEdBQUksT0FBTyxFQUFNLEtBQUssU0FBVyxTQUMvQixFQUFNLEtBQU8sQ0FBRSxZQUFhLEVBQU0sS0FBSyxNQUFPLEVBRWhELE9BQU8sR0FHVCxPQUFPLEVBQW9CLENBQ3pCLEtBQU0sS0FBVyxFQUFnQixFQUFRLElBQUksQ0FBTyxDQUFDLEVBQ3JELFFBQVMsQ0FDUCxlQUFnQixtQkFDaEIsYUFBYyxDQUNoQixFQUNBLEtBQU0sVUFDTixVQUNBLElBQUssNEJBQTRCLGVBQ25DLENBQUMiLAogICJkZWJ1Z0lkIjogIjJBNjJCRTlGMUNBMkJGQzA2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
package/dist/enrichers.js CHANGED
@@ -1,4 +1,4 @@
1
- var H=/^(?<version>[\da-f]{2})-(?<traceId>[\da-f]{32})-(?<spanId>[\da-f]{16})-(?<flags>[\da-f]{2})(?:-.+)?$/u,L="0".repeat(32),T="0".repeat(16);var c=(j={})=>{let J=j.header??"traceparent";return{request(Q){let K=Q.headers.get(J);if(!K)return;let $=K.trim(),U=H.exec($);if(!U)return;let[,W,V,z,Z]=U;if(W==="ff"||V===L||z===T||W==="00"&&$.length!==55)return;let x={span_id:z,trace_flags:Z,trace_id:V,trace_sampled:Number.parseInt(Z,16)%2===1};if(j.tracestate){let F=Q.headers.get("tracestate");if(F)x.tracestate=F.slice(0,512)}return x}}},B=/bot|crawl|spider|slurp|facebookexternalhit|preview|headless/iu,C=/ipad|tablet|playbook|silk|kindle/iu,N=/mobi|iphone|ipod|windows phone/iu,A=/android.*mobile/iu,S=[["Edge",/edg(?:a|ios)?\/(?<version>[\d.]+)/iu],["Opera",/(?:opr|opios|opera)\/(?<version>[\d.]+)/iu],["Samsung Internet",/samsungbrowser\/(?<version>[\d.]+)/iu],["Firefox",/(?:firefox|fxios)\/(?<version>[\d.]+)/iu],["Chrome",/(?:chrome|crios)\/(?<version>[\d.]+)/iu],["Safari",/version\/(?<version>[\d.]+).*safari/iu]],w=[["iOS",/iphone|ipad|ipod/iu],["Android",/android/iu],["ChromeOS",/cros/iu],["Windows",/windows nt/iu],["macOS",/mac os x/iu],["Linux",/linux/iu]],P=(j,J)=>{for(let[Q,K]of j){let $=K.exec(J);if($)return{name:Q,version:$[1]}}},D=(j,J)=>{if(J)return"bot";if(C.test(j))return"tablet";if(N.test(j)||A.test(j))return"mobile";return"desktop"},m=()=>({request(j){let J=j.headers.get("user-agent");if(!J)return;let Q=B.test(J),K=P(S,J),$=P(w,J);return{ua:{bot:Q,...K?{browser:K.name}:{},...K?.version?{browserVersion:K.version}:{},device:D(J,Q),...$?{os:$.name}:{}}}}}),G=[["city",["x-vercel-ip-city","cf-ipcity"]],["country",["x-vercel-ip-country","cf-ipcountry"]],["region",["x-vercel-ip-country-region","cf-region-code","cf-region"]],["timezone",["x-vercel-ip-timezone","cf-timezone"]]],b=[["latitude",["x-vercel-ip-latitude","cf-iplatitude"],[-90,90]],["longitude",["x-vercel-ip-longitude","cf-iplongitude"],[-180,180]]];var Y=/^[A-Za-z0-9-]{1,10}$/u,M=(j,J)=>{for(let Q of J){let K=j.headers.get(Q);if(K)return K}},y=(j)=>{try{return decodeURIComponent(j).slice(0,128)}catch{return j.slice(0,128)}},k=(j,J,Q)=>j>=J&&j<=Q,I=(j)=>{let J=j.headers.get("x-nf-geo");if(!J||J.length>2048)return;let Q;try{Q=JSON.parse(atob(J))}catch{return}if(Q===null||typeof Q!=="object")return;let K=Q,$={};if(K.city)$.city=K.city.slice(0,128);if(K.country?.code&&Y.test(K.country.code))$.country=K.country.code;if(K.subdivision?.code&&Y.test(K.subdivision.code))$.region=K.subdivision.code;if(K.timezone)$.timezone=K.timezone.slice(0,128);if(typeof K.latitude==="number"&&k(K.latitude,-90,90))$.latitude=K.latitude;if(typeof K.longitude==="number"&&k(K.longitude,-180,180))$.longitude=K.longitude;return Object.keys($).length>0?$:void 0},f=new Set(["country","region"]),_=(j,J)=>{for(let[Q,K]of G){let $=M(j,K);if(!$)continue;let U=y($);if(!f.has(Q)||Y.test(U))J[Q]=U}},O=(j,J)=>{for(let[Q,K,[$,U]]of b){let W=M(j,K),V=W===void 0?Number.NaN:Number(W);if(Number.isFinite(V)&&k(V,$,U))J[Q]=V}},q=()=>({request(j){let J={};if(_(j,J),O(j,J),Object.keys(J).length>0)return{geo:J};let Q=I(j);return Q?{geo:Q}:void 0}}),X=(j)=>{if(typeof j==="number"&&Number.isFinite(j)&&j>=0)return j;if(typeof j!=="string"||j.length===0)return;let J=Number(j);return Number.isFinite(J)&&J>=0?J:void 0},R=(j,J)=>{for(let[Q,K]of Object.entries(j))if(Q.toLowerCase()===J)return K},p=()=>({request(j){let J=X(j.headers.get("content-length"));return J===void 0?void 0:{requestBytes:J}},response(j){let J=X(R(j.headers,"content-length"));return J===void 0?void 0:{responseBytes:J}}});export{m as userAgentEnricher,c as traceparentEnricher,p as sizeEnricher,q as geoEnricher};
1
+ var B=/^(?<version>[\da-f]{2})-(?<traceId>[\da-f]{32})-(?<spanId>[\da-f]{16})-(?<flags>[\da-f]{2})(?:-.+)?$/u,N="0".repeat(32),A="0".repeat(16);var p=(j={})=>{let J=j.header??"traceparent";return{request(Q){let K=Q.headers.get(J);if(!K)return;let $=K.trim(),U=B.exec($);if(!U)return;let[,W,V,Y,X]=U;if(W==="ff"||V===N||Y===A||W==="00"&&$.length!==55)return;let Z={span_id:Y,trace_flags:X,trace_id:V,trace_sampled:Number.parseInt(X,16)%2===1};if(j.tracestate){let F=Q.headers.get("tracestate");if(F)Z.tracestate=F.slice(0,512)}return Z}}},C=/bot|crawl|spider|slurp|facebookexternalhit|preview|headless/iu,S=/ipad|tablet|playbook|silk|kindle/iu,T=/mobi|iphone|ipod|windows phone/iu,w=/android.*mobile/iu,D=[["Edge",/edg(?:a|ios)?\/(?<version>[\d.]+)/iu],["Opera",/(?:opr|opios|opera)\/(?<version>[\d.]+)/iu],["Samsung Internet",/samsungbrowser\/(?<version>[\d.]+)/iu],["Firefox",/(?:firefox|fxios)\/(?<version>[\d.]+)/iu],["Chrome",/(?:chrome|crios)\/(?<version>[\d.]+)/iu],["Safari",/version\/(?<version>[\d.]+).*safari/iu]],G=[["iOS",/iphone|ipad|ipod/iu],["Android",/android/iu],["ChromeOS",/cros/iu],["Windows",/windows nt/iu],["macOS",/mac os x/iu],["Linux",/linux/iu]],P=(j,J)=>{for(let[Q,K]of j){let $=K.exec(J);if($)return{name:Q,version:$[1]}}},b=(j,J)=>{if(J)return"bot";if(S.test(j))return"tablet";if(T.test(j)||w.test(j))return"mobile";return"desktop"},c=()=>({request(j){let J=j.headers.get("user-agent");if(!J)return;let Q=C.test(J),K=P(D,J),$=P(G,J);return{ua:{bot:Q,...K?{browser:K.name}:{},...K?.version?{browserVersion:K.version}:{},device:b(J,Q),...$?{os:$.name}:{}}}}}),I=[["city",["x-vercel-ip-city","cf-ipcity"]],["country",["x-vercel-ip-country","cf-ipcountry"]],["region",["x-vercel-ip-country-region","cf-region-code","cf-region"]],["timezone",["x-vercel-ip-timezone","cf-timezone"]]],_=[["latitude",["x-vercel-ip-latitude","cf-iplatitude"],[-90,90]],["longitude",["x-vercel-ip-longitude","cf-iplongitude"],[-180,180]]];var H=/^[A-Za-z0-9-]{1,10}$/u,L=(j,J)=>{for(let Q of J){let K=j.headers.get(Q);if(K)return K}},f=(j)=>{try{return decodeURIComponent(j).slice(0,128)}catch{return j.slice(0,128)}},k=(j,J,Q)=>j>=J&&j<=Q,z=(j)=>typeof j==="string"&&j.length>0?j.slice(0,128):void 0,M=(j)=>typeof j==="string"&&H.test(j)?j:void 0,O=(j)=>{let J=j.headers.get("x-nf-geo");if(!J||J.length>2048)return;let Q;try{Q=JSON.parse(atob(J))}catch{return}if(Q===null||typeof Q!=="object")return;let K=Q,$={},U=z(K.city);if(U!==void 0)$.city=U;let W=M(K.country?.code);if(W!==void 0)$.country=W;let V=M(K.subdivision?.code);if(V!==void 0)$.region=V;let Y=z(K.timezone);if(Y!==void 0)$.timezone=Y;if(typeof K.latitude==="number"&&k(K.latitude,-90,90))$.latitude=K.latitude;if(typeof K.longitude==="number"&&k(K.longitude,-180,180))$.longitude=K.longitude;return Object.keys($).length>0?$:void 0},y=new Set(["country","region"]),R=(j,J)=>{for(let[Q,K]of I){let $=L(j,K);if(!$)continue;let U=f($);if(!y.has(Q)||H.test(U))J[Q]=U}},q=(j,J)=>{for(let[Q,K,[$,U]]of _){let W=L(j,K),V=W===void 0?Number.NaN:Number(W);if(Number.isFinite(V)&&k(V,$,U))J[Q]=V}},h=()=>({request(j){let J={};if(R(j,J),q(j,J),Object.keys(J).length>0)return{geo:J};let Q=O(j);return Q?{geo:Q}:void 0}}),x=(j)=>{if(typeof j==="number"&&Number.isFinite(j)&&j>=0)return j;if(typeof j!=="string"||j.length===0)return;let J=Number(j);return Number.isFinite(J)&&J>=0?J:void 0},m=(j,J)=>{for(let[Q,K]of Object.entries(j))if(Q.toLowerCase()===J)return K},E=()=>({request(j){let J=x(j.headers.get("content-length"));return J===void 0?void 0:{requestBytes:J}},response(j){let J=x(m(j.headers,"content-length"));return J===void 0?void 0:{responseBytes:J}}});export{c as userAgentEnricher,p as traceparentEnricher,E as sizeEnricher,h as geoEnricher};
2
2
 
3
- //# debugId=BC77FE35BFD197A864756E2164756E21
4
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2VucmljaGVycy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7XG4gIEVucmljaGVyLFxuICBFbnJpY2hlckZpZWxkcyxcbiAgRW5yaWNoZXJSZXNwb25zZUlucHV0XG59IGZyb20gJy4vdHlwZXMvZW5yaWNoZXInXG5cbmV4cG9ydCB0eXBlIHtcbiAgRW5yaWNoZXIsXG4gIEVucmljaGVyRmllbGRzLFxuICBFbnJpY2hlckxpa2UsXG4gIEVucmljaGVyUmVzcG9uc2VJbnB1dFxufSBmcm9tICcuL3R5cGVzL2VucmljaGVyJ1xuXG5jb25zdCBIRVhfUkFESVggPSAxNlxuY29uc3QgTUFYX1RSQUNFU1RBVEVfTEVOR1RIID0gNTEyXG5cbi8vIHZlcnNpb24tdHJhY2VfaWQtcGFyZW50X2lkLWZsYWdzLCB3aXRoIGFuIG9wdGlvbmFsIHRhaWwgZm9yIHZlcnNpb25zID4gMDAuXG5jb25zdCBUUkFDRVBBUkVOVCA9XG4gIC9eKD88dmVyc2lvbj5bXFxkYS1mXXsyfSktKD88dHJhY2VJZD5bXFxkYS1mXXszMn0pLSg/PHNwYW5JZD5bXFxkYS1mXXsxNn0pLSg/PGZsYWdzPltcXGRhLWZdezJ9KSg/Oi0uKyk/JC91XG5jb25zdCBaRVJPX1RSQUNFX0lEID0gJzAnLnJlcGVhdCgzMilcbmNvbnN0IFpFUk9fU1BBTl9JRCA9ICcwJy5yZXBlYXQoMTYpXG5jb25zdCBJTlZBTElEX1ZFUlNJT04gPSAnZmYnXG5jb25zdCBDVVJSRU5UX1ZFUlNJT04gPSAnMDAnXG4vKiogYDAwLWAgKyAzMiArIGAtYCArIDE2ICsgYC1gICsgMjogdmVyc2lvbiAwMCBpcyBleGFjdGx5IHRoZXNlIGZvdXIgZmllbGRzLiAqL1xuY29uc3QgVkVSU0lPTl8wMF9MRU5HVEggPSA1NVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNlcGFyZW50RW5yaWNoZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEhlYWRlciB0byByZWFkIHRoZSB0cmFjZSBjb250ZXh0IGZyb20uXG4gICAqIEBkZWZhdWx0ICd0cmFjZXBhcmVudCdcbiAgICovXG4gIGhlYWRlcj86IHN0cmluZ1xuICAvKipcbiAgICogQWxzbyByZWNvcmQgdGhlIHJhdyBgdHJhY2VzdGF0ZWAgaGVhZGVyICh0cnVuY2F0ZWQgdG8gNTEyIGNoYXJhY3RlcnMpLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgdHJhY2VzdGF0ZT86IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBSZWFkcyBXM0MgdHJhY2UgY29udGV4dCBzdHJhaWdodCBvZmYgdGhlIHJlcXVlc3QgaGVhZGVycywgc28gbG9ncyBsaW5rIHRvXG4gKiB0cmFjZXMgaW4gU2VudHJ5LCBIeXBlckRYLCBvciBhbnkgT1RMUCBiYWNrZW5kIHdpdGhvdXQgYW4gT3BlblRlbGVtZXRyeSBTREtcbiAqIGluIHRoZSBwcm9jZXNzLlxuICpcbiAqIFVzZSBgbG9naXhseXNpYS9vdGVsYCBpbnN0ZWFkIHdoZW4geW91IGFscmVhZHkgcnVuIHRoZSBTREsgYW5kIHdhbnQgdGhlIGlkc1xuICogb2YgdGhlICphY3RpdmUgc3BhbiogcmF0aGVyIHRoYW4gdGhlIGlkcyB0aGUgY2FsbGVyIHByb3BhZ2F0ZWQuXG4gKlxuICogQWRkcyBgdHJhY2VfaWRgLCBgc3Bhbl9pZGAsIGB0cmFjZV9mbGFnc2AsIGFuZCBgdHJhY2Vfc2FtcGxlZGAuXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFjZXBhcmVudEVucmljaGVyID0gKFxuICBvcHRpb25zOiBUcmFjZXBhcmVudEVucmljaGVyT3B0aW9ucyA9IHt9XG4pOiBFbnJpY2hlciA9PiB7XG4gIGNvbnN0IGhlYWRlciA9IG9wdGlvbnMuaGVhZGVyID8/ICd0cmFjZXBhcmVudCdcblxuICByZXR1cm4ge1xuICAgIHJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgY29uc3QgcmF3ID0gcmVxdWVzdC5oZWFkZXJzLmdldChoZWFkZXIpXG4gICAgICBpZiAoIXJhdykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSByYXcudHJpbSgpXG4gICAgICBjb25zdCBtYXRjaCA9IFRSQUNFUEFSRU5ULmV4ZWModmFsdWUpXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBbLCB2ZXJzaW9uLCB0cmFjZUlkLCBzcGFuSWQsIGZsYWdzXSA9IG1hdGNoXG5cbiAgICAgIC8vIGBmZmAgaXMgcmVzZXJ2ZWQsIGFsbC16ZXJvIGlkcyBhcmUgaW52YWxpZCwgYW5kIGEgdmVyc2lvbi0wMCBoZWFkZXJcbiAgICAgIC8vIGNhcnJ5aW5nIGV4dHJhIGZpZWxkcyBpcyBtYWxmb3JtZWQgcmF0aGVyIHRoYW4gZm9yd2FyZC1jb21wYXRpYmxlLlxuICAgICAgaWYgKFxuICAgICAgICB2ZXJzaW9uID09PSBJTlZBTElEX1ZFUlNJT04gfHxcbiAgICAgICAgdHJhY2VJZCA9PT0gWkVST19UUkFDRV9JRCB8fFxuICAgICAgICBzcGFuSWQgPT09IFpFUk9fU1BBTl9JRCB8fFxuICAgICAgICAodmVyc2lvbiA9PT0gQ1VSUkVOVF9WRVJTSU9OICYmIHZhbHVlLmxlbmd0aCAhPT0gVkVSU0lPTl8wMF9MRU5HVEgpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIHNwYW5faWQ6IHNwYW5JZCxcbiAgICAgICAgdHJhY2VfZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0cmFjZV9pZDogdHJhY2VJZCxcbiAgICAgICAgLy8gYHNhbXBsZWRgIGlzIHRoZSBsb3cgYml0IG9mIHRoZSBmbGFncyBieXRlLCBzbyBhbiBvZGQgdmFsdWUgaXMgc2V0LlxuICAgICAgICB0cmFjZV9zYW1wbGVkOiBOdW1iZXIucGFyc2VJbnQoZmxhZ3MsIEhFWF9SQURJWCkgJSAyID09PSAxXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnRyYWNlc3RhdGUpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd0cmFjZXN0YXRlJylcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgZmllbGRzLnRyYWNlc3RhdGUgPSBzdGF0ZS5zbGljZSgwLCBNQVhfVFJBQ0VTVEFURV9MRU5HVEgpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpZWxkc1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBCT1QgPSAvYm90fGNyYXdsfHNwaWRlcnxzbHVycHxmYWNlYm9va2V4dGVybmFsaGl0fHByZXZpZXd8aGVhZGxlc3MvaXVcbmNvbnN0IFRBQkxFVCA9IC9pcGFkfHRhYmxldHxwbGF5Ym9va3xzaWxrfGtpbmRsZS9pdVxuY29uc3QgTU9CSUxFID0gL21vYml8aXBob25lfGlwb2R8d2luZG93cyBwaG9uZS9pdVxuY29uc3QgQU5EUk9JRF9NT0JJTEUgPSAvYW5kcm9pZC4qbW9iaWxlL2l1XG5cbi8qKiBGaXJzdCBtYXRjaCB3aW5zLCBzbyBtb3JlIHNwZWNpZmljIGVuZ2luZXMgYXJlIGxpc3RlZCBiZWZvcmUgdGhlaXIgYmFzZS4gKi9cbmNvbnN0IEJST1dTRVJTOiByZWFkb25seSBbbmFtZTogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHBdW10gPSBbXG4gIFsnRWRnZScsIC9lZGcoPzphfGlvcyk/XFwvKD88dmVyc2lvbj5bXFxkLl0rKS9pdV0sXG4gIFsnT3BlcmEnLCAvKD86b3ByfG9waW9zfG9wZXJhKVxcLyg/PHZlcnNpb24+W1xcZC5dKykvaXVdLFxuICBbJ1NhbXN1bmcgSW50ZXJuZXQnLCAvc2Ftc3VuZ2Jyb3dzZXJcXC8oPzx2ZXJzaW9uPltcXGQuXSspL2l1XSxcbiAgWydGaXJlZm94JywgLyg/OmZpcmVmb3h8Znhpb3MpXFwvKD88dmVyc2lvbj5bXFxkLl0rKS9pdV0sXG4gIFsnQ2hyb21lJywgLyg/OmNocm9tZXxjcmlvcylcXC8oPzx2ZXJzaW9uPltcXGQuXSspL2l1XSxcbiAgWydTYWZhcmknLCAvdmVyc2lvblxcLyg/PHZlcnNpb24+W1xcZC5dKykuKnNhZmFyaS9pdV1cbl1cblxuY29uc3QgT1BFUkFUSU5HX1NZU1RFTVM6IHJlYWRvbmx5IFtuYW1lOiBzdHJpbmcsIHBhdHRlcm46IFJlZ0V4cF1bXSA9IFtcbiAgWydpT1MnLCAvaXBob25lfGlwYWR8aXBvZC9pdV0sXG4gIFsnQW5kcm9pZCcsIC9hbmRyb2lkL2l1XSxcbiAgWydDaHJvbWVPUycsIC9jcm9zL2l1XSxcbiAgWydXaW5kb3dzJywgL3dpbmRvd3MgbnQvaXVdLFxuICBbJ21hY09TJywgL21hYyBvcyB4L2l1XSxcbiAgWydMaW51eCcsIC9saW51eC9pdV1cbl1cblxuY29uc3QgbWF0Y2hOYW1lID0gKFxuICBjYW5kaWRhdGVzOiByZWFkb25seSBbc3RyaW5nLCBSZWdFeHBdW10sXG4gIHZhbHVlOiBzdHJpbmdcbik6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBmb3IgKGNvbnN0IFtuYW1lLCBwYXR0ZXJuXSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWModmFsdWUpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4geyBuYW1lLCB2ZXJzaW9uOiBtYXRjaFsxXSB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHJlc29sdmVEZXZpY2UgPSAodmFsdWU6IHN0cmluZywgYm90OiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKGJvdCkge1xuICAgIHJldHVybiAnYm90J1xuICB9XG4gIGlmIChUQUJMRVQudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJ3RhYmxldCdcbiAgfVxuICBpZiAoTU9CSUxFLnRlc3QodmFsdWUpIHx8IEFORFJPSURfTU9CSUxFLnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuICdtb2JpbGUnXG4gIH1cbiAgcmV0dXJuICdkZXNrdG9wJ1xufVxuXG4vKipcbiAqIFR1cm5zIHRoZSBgdXNlci1hZ2VudGAgaGVhZGVyIGludG8gcXVlcnlhYmxlIGZpZWxkcyB1bmRlciBgdWFgOiBgYnJvd3NlcmAsXG4gKiBgYnJvd3NlclZlcnNpb25gLCBgb3NgLCBgZGV2aWNlYCAoYGRlc2t0b3BgIHwgYG1vYmlsZWAgfCBgdGFibGV0YCB8IGBib3RgKSxcbiAqIGFuZCBgYm90YC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgYSBoZXVyaXN0aWMg4oCUIHVzZXIgYWdlbnRzIGFyZSBub3QgYSBwYXJzZWFibGUgZ3JhbW1hci4gSXQgaXNcbiAqIGJ1aWx0IGZvciBncm91cGluZyB0cmFmZmljIGluIGEgZGFzaGJvYXJkLCBub3QgZm9yIG1ha2luZyBhY2Nlc3MgZGVjaXNpb25zLlxuICovXG5leHBvcnQgY29uc3QgdXNlckFnZW50RW5yaWNoZXIgPSAoKTogRW5yaWNoZXIgPT4gKHtcbiAgcmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd1c2VyLWFnZW50JylcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBib3QgPSBCT1QudGVzdCh2YWx1ZSlcbiAgICBjb25zdCBicm93c2VyID0gbWF0Y2hOYW1lKEJST1dTRVJTLCB2YWx1ZSlcbiAgICBjb25zdCBvcyA9IG1hdGNoTmFtZShPUEVSQVRJTkdfU1lTVEVNUywgdmFsdWUpXG5cbiAgICByZXR1cm4ge1xuICAgICAgdWE6IHtcbiAgICAgICAgYm90LFxuICAgICAgICAuLi4oYnJvd3NlciA/IHsgYnJvd3NlcjogYnJvd3Nlci5uYW1lIH0gOiB7fSksXG4gICAgICAgIC4uLihicm93c2VyPy52ZXJzaW9uID8geyBicm93c2VyVmVyc2lvbjogYnJvd3Nlci52ZXJzaW9uIH0gOiB7fSksXG4gICAgICAgIGRldmljZTogcmVzb2x2ZURldmljZSh2YWx1ZSwgYm90KSxcbiAgICAgICAgLi4uKG9zID8geyBvczogb3MubmFtZSB9IDoge30pXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuXG4vKiogSGVhZGVyIGNhbmRpZGF0ZXMgcGVyIGdlbyBmaWVsZCwgaW4gcHJpb3JpdHkgb3JkZXIgYWNyb3NzIHBsYXRmb3Jtcy4gKi9cbmNvbnN0IEdFT19IRUFERVJTOiByZWFkb25seSBbZmllbGQ6IHN0cmluZywgaGVhZGVyczogcmVhZG9ubHkgc3RyaW5nW11dW10gPSBbXG4gIFsnY2l0eScsIFsneC12ZXJjZWwtaXAtY2l0eScsICdjZi1pcGNpdHknXV0sXG4gIFsnY291bnRyeScsIFsneC12ZXJjZWwtaXAtY291bnRyeScsICdjZi1pcGNvdW50cnknXV0sXG4gIFsncmVnaW9uJywgWyd4LXZlcmNlbC1pcC1jb3VudHJ5LXJlZ2lvbicsICdjZi1yZWdpb24tY29kZScsICdjZi1yZWdpb24nXV0sXG4gIFsndGltZXpvbmUnLCBbJ3gtdmVyY2VsLWlwLXRpbWV6b25lJywgJ2NmLXRpbWV6b25lJ11dXG5dXG5cbmNvbnN0IEdFT19OVU1FUklDX0hFQURFUlM6IHJlYWRvbmx5IFtcbiAgZmllbGQ6IHN0cmluZyxcbiAgaGVhZGVyczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHJhbmdlOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdXG5dW10gPSBbXG4gIFsnbGF0aXR1ZGUnLCBbJ3gtdmVyY2VsLWlwLWxhdGl0dWRlJywgJ2NmLWlwbGF0aXR1ZGUnXSwgWy05MCwgOTBdXSxcbiAgWydsb25naXR1ZGUnLCBbJ3gtdmVyY2VsLWlwLWxvbmdpdHVkZScsICdjZi1pcGxvbmdpdHVkZSddLCBbLTE4MCwgMTgwXV1cbl1cblxuY29uc3QgTkVUTElGWV9HRU9fSEVBREVSID0gJ3gtbmYtZ2VvJ1xuY29uc3QgR0VPX1NUUklOR19NQVggPSAxMjhcbmNvbnN0IEdFT19SQVdfSEVBREVSX01BWCA9IDIwNDhcbi8qKiBJU08tMzE2Ni1pc2ggY291bnRyeS9yZWdpb24gY29kZXM6IHNob3J0IGFscGhhbnVtZXJpYyB0b2tlbnMsIG5ldmVyIGZyZWUgdGV4dC4gKi9cbmNvbnN0IEdFT19DT0RFX1JFR0VYID0gL15bQS1aYS16MC05LV17MSwxMH0kL3VcblxuY29uc3QgZmlyc3RIZWFkZXIgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGhlYWRlcnM6IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBmb3IgKGNvbnN0IGhlYWRlciBvZiBoZWFkZXJzKSB7XG4gICAgY29uc3QgdmFsdWUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KGhlYWRlcilcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfVxufVxuXG4vKiogVmVyY2VsIHBlcmNlbnQtZW5jb2RlcyBjaXR5IG5hbWVzLCBzbyBgUyVDMyVBM28lMjBQYXVsb2AgbXVzdCBiZSBkZWNvZGVkLiAqL1xuY29uc3QgZGVjb2RlSGVhZGVyVmFsdWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkuc2xpY2UoMCwgR0VPX1NUUklOR19NQVgpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB2YWx1ZS5zbGljZSgwLCBHRU9fU1RSSU5HX01BWClcbiAgfVxufVxuXG5jb25zdCBpc0luUmFuZ2UgPSAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4XG5cbmludGVyZmFjZSBOZXRsaWZ5R2VvIHtcbiAgY2l0eT86IHN0cmluZ1xuICBjb3VudHJ5PzogeyBjb2RlPzogc3RyaW5nIH1cbiAgbGF0aXR1ZGU/OiBudW1iZXJcbiAgbG9uZ2l0dWRlPzogbnVtYmVyXG4gIHN1YmRpdmlzaW9uPzogeyBjb2RlPzogc3RyaW5nIH1cbiAgdGltZXpvbmU/OiBzdHJpbmdcbn1cblxuY29uc3QgcmVhZE5ldGxpZnlHZW8gPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcmF3ID0gcmVxdWVzdC5oZWFkZXJzLmdldChORVRMSUZZX0dFT19IRUFERVIpXG4gIGlmICghcmF3IHx8IHJhdy5sZW5ndGggPiBHRU9fUkFXX0hFQURFUl9NQVgpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCBwYXJzZWQ6IHVua25vd25cbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGF0b2IocmF3KSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAocGFyc2VkID09PSBudWxsIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBkYXRhID0gcGFyc2VkIGFzIE5ldGxpZnlHZW9cbiAgY29uc3QgZ2VvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGlmIChkYXRhLmNpdHkpIHtcbiAgICBnZW8uY2l0eSA9IGRhdGEuY2l0eS5zbGljZSgwLCBHRU9fU1RSSU5HX01BWClcbiAgfVxuICBpZiAoZGF0YS5jb3VudHJ5Py5jb2RlICYmIEdFT19DT0RFX1JFR0VYLnRlc3QoZGF0YS5jb3VudHJ5LmNvZGUpKSB7XG4gICAgZ2VvLmNvdW50cnkgPSBkYXRhLmNvdW50cnkuY29kZVxuICB9XG4gIGlmIChkYXRhLnN1YmRpdmlzaW9uPy5jb2RlICYmIEdFT19DT0RFX1JFR0VYLnRlc3QoZGF0YS5zdWJkaXZpc2lvbi5jb2RlKSkge1xuICAgIGdlby5yZWdpb24gPSBkYXRhLnN1YmRpdmlzaW9uLmNvZGVcbiAgfVxuICBpZiAoZGF0YS50aW1lem9uZSkge1xuICAgIGdlby50aW1lem9uZSA9IGRhdGEudGltZXpvbmUuc2xpY2UoMCwgR0VPX1NUUklOR19NQVgpXG4gIH1cbiAgaWYgKHR5cGVvZiBkYXRhLmxhdGl0dWRlID09PSAnbnVtYmVyJyAmJiBpc0luUmFuZ2UoZGF0YS5sYXRpdHVkZSwgLTkwLCA5MCkpIHtcbiAgICBnZW8ubGF0aXR1ZGUgPSBkYXRhLmxhdGl0dWRlXG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBkYXRhLmxvbmdpdHVkZSA9PT0gJ251bWJlcicgJiZcbiAgICBpc0luUmFuZ2UoZGF0YS5sb25naXR1ZGUsIC0xODAsIDE4MClcbiAgKSB7XG4gICAgZ2VvLmxvbmdpdHVkZSA9IGRhdGEubG9uZ2l0dWRlXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXMoZ2VvKS5sZW5ndGggPiAwID8gZ2VvIDogdW5kZWZpbmVkXG59XG5cbi8qKiBGaWVsZHMgd2hvc2UgdmFsdWUgbXVzdCBsb29rIGxpa2UgYSBzaG9ydCBjb3VudHJ5L3JlZ2lvbiBjb2RlLCBub3QgZnJlZSB0ZXh0LiAqL1xuY29uc3QgR0VPX0NPREVfRklFTERTID0gbmV3IFNldChbJ2NvdW50cnknLCAncmVnaW9uJ10pXG5cbmNvbnN0IHJlYWRHZW9TdHJpbmdGaWVsZHMgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGdlbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IFtmaWVsZCwgaGVhZGVyc10gb2YgR0VPX0hFQURFUlMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGZpcnN0SGVhZGVyKHJlcXVlc3QsIGhlYWRlcnMpXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUhlYWRlclZhbHVlKHZhbHVlKVxuICAgIGlmICghR0VPX0NPREVfRklFTERTLmhhcyhmaWVsZCkgfHwgR0VPX0NPREVfUkVHRVgudGVzdChkZWNvZGVkKSkge1xuICAgICAgZ2VvW2ZpZWxkXSA9IGRlY29kZWRcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcmVhZEdlb051bWVyaWNGaWVsZHMgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGdlbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IFtmaWVsZCwgaGVhZGVycywgW21pbiwgbWF4XV0gb2YgR0VPX05VTUVSSUNfSEVBREVSUykge1xuICAgIGNvbnN0IHZhbHVlID0gZmlyc3RIZWFkZXIocmVxdWVzdCwgaGVhZGVycylcbiAgICBjb25zdCBwYXJzZWQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gTnVtYmVyLk5hTiA6IE51bWJlcih2YWx1ZSlcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgaXNJblJhbmdlKHBhcnNlZCwgbWluLCBtYXgpKSB7XG4gICAgICBnZW9bZmllbGRdID0gcGFyc2VkXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGdlbyBoZWFkZXJzIHRoZSBlZGdlIGFscmVhZHkgYXR0YWNoZWQg4oCUIFZlcmNlbCwgQ2xvdWRmbGFyZSwgb3JcbiAqIE5ldGxpZnkg4oCUIGludG8gYGdlby5jaXR5YCwgYGdlby5jb3VudHJ5YCwgYGdlby5yZWdpb25gLCBgZ2VvLnRpbWV6b25lYCxcbiAqIGBnZW8ubGF0aXR1ZGVgLCBhbmQgYGdlby5sb25naXR1ZGVgLlxuICpcbiAqIE5vdGhpbmcgaXMgZGVyaXZlZCBmcm9tIHRoZSBJUCBhZGRyZXNzIGl0c2VsZiwgc28gYmVoaW5kIGEgcGxhdGZvcm0gdGhhdFxuICogZG9lcyBub3Qgc2V0IHRoZXNlIGhlYWRlcnMgdGhlIGVucmljaGVyIHNpbXBseSBhZGRzIG5vdGhpbmcuXG4gKlxuICogVGhlc2UgaGVhZGVycyBhcmUgY2xpZW50LXNldHRhYmxlIHVubGVzcyBhbiBlZGdlIGluIGZyb250IG9mIHRoZSBhcHBcbiAqIG92ZXJ3cml0ZXMgdGhlbSBvbiBldmVyeSByZXF1ZXN0IOKAlCB0cnVzdCB0aGUgdmFsdWVzIG9ubHkgYmVoaW5kIHN1Y2ggYW5cbiAqIGVkZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBnZW9FbnJpY2hlciA9ICgpOiBFbnJpY2hlciA9PiAoe1xuICByZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICBjb25zdCBnZW86IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cblxuICAgIHJlYWRHZW9TdHJpbmdGaWVsZHMocmVxdWVzdCwgZ2VvKVxuICAgIHJlYWRHZW9OdW1lcmljRmllbGRzKHJlcXVlc3QsIGdlbylcblxuICAgIGlmIChPYmplY3Qua2V5cyhnZW8pLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7IGdlbyB9XG4gICAgfVxuXG4gICAgY29uc3QgbmV0bGlmeSA9IHJlYWROZXRsaWZ5R2VvKHJlcXVlc3QpXG4gICAgcmV0dXJuIG5ldGxpZnkgPyB7IGdlbzogbmV0bGlmeSB9IDogdW5kZWZpbmVkXG4gIH1cbn0pXG5cbmNvbnN0IHJlYWRDb250ZW50TGVuZ3RoID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAwKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKVxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgcGFyc2VkID49IDAgPyBwYXJzZWQgOiB1bmRlZmluZWRcbn1cblxuY29uc3QgZmluZEhlYWRlciA9IChcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG5hbWU6IHN0cmluZ1xuKTogdW5rbm93biA9PiB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSBuYW1lKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZWNvcmRzIHBheWxvYWQgc2l6ZXMgYXMgYHJlcXVlc3RCeXRlc2AgYW5kIGByZXNwb25zZUJ5dGVzYC5cbiAqXG4gKiBCb3RoIGNvbWUgZnJvbSBgY29udGVudC1sZW5ndGhgLCB3aGljaCBpcyB0aGUgb25seSBzaXplIHRoZSBwbHVnaW4gY2FuIHJlYWRcbiAqIHdpdGhvdXQgYnVmZmVyaW5nIGEgYm9keS4gQSBjaHVua2VkIG9yIHN0cmVhbWVkIHJlc3BvbnNlIGhhcyBub1xuICogYGNvbnRlbnQtbGVuZ3RoYCwgc28gYHJlc3BvbnNlQnl0ZXNgIGlzIG9taXR0ZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHNpemVFbnJpY2hlciA9ICgpOiBFbnJpY2hlciA9PiAoe1xuICByZXF1ZXN0KHJlcXVlc3QpOiBFbnJpY2hlckZpZWxkcyB7XG4gICAgY29uc3QgYnl0ZXMgPSByZWFkQ29udGVudExlbmd0aChyZXF1ZXN0LmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKVxuICAgIHJldHVybiBieXRlcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogeyByZXF1ZXN0Qnl0ZXM6IGJ5dGVzIH1cbiAgfSxcbiAgcmVzcG9uc2UoaW5wdXQ6IEVucmljaGVyUmVzcG9uc2VJbnB1dCk6IEVucmljaGVyRmllbGRzIHtcbiAgICBjb25zdCBieXRlcyA9IHJlYWRDb250ZW50TGVuZ3RoKGZpbmRIZWFkZXIoaW5wdXQuaGVhZGVycywgJ2NvbnRlbnQtbGVuZ3RoJykpXG4gICAgcmV0dXJuIGJ5dGVzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IHJlc3BvbnNlQnl0ZXM6IGJ5dGVzIH1cbiAgfVxufSlcbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQWlCQSxJQUFNLEVBQ0osd0dBQ0ksRUFBZ0IsSUFBSSxPQUFPLEVBQUUsRUFDN0IsRUFBZSxJQUFJLE9BQU8sRUFBRSxFQTZCM0IsSUFBTSxFQUFzQixDQUNqQyxFQUFzQyxDQUFDLElBQzFCLENBQ2IsSUFBTSxFQUFTLEVBQVEsUUFBVSxjQUVqQyxNQUFPLENBQ0wsT0FBTyxDQUFDLEVBQVMsQ0FDZixJQUFNLEVBQU0s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VUFBWSxFQUFLLFVBR3ZCLE9BQU8sT0FBTyxLQUFLLENBQUcsRUFBRSxPQUFTLEVBQUksRUFBTSxRQUl2QyxFQUFrQixJQUFJLElBQUksQ0FBQyxVQUFXLFFBQVEsQ0FBQyxFQUUvQyxFQUFzQixDQUMxQixFQUNBLElBQ1MsQ0FDVCxRQUFZLEVBQU8sS0FBWSxFQUFhLENBQzFDLElBQU0sRUFBUSxFQUFZLEVBQVMsQ0FBTyxFQUMxQyxHQUFJLENBQUMsRUFDSCxTQUVGLElBQU0sRUFBVSxFQUFrQixDQUFLLEVBQ3ZDLEdBQUksQ0FBQyxFQUFnQixJQUFJLENBQUssR0FBSyxFQUFlLEtBQUssQ0FBTyxFQUM1RCxFQUFJLEdBQVMsSUFLYixFQUF1QixDQUMzQixFQUNBLElBQ1MsQ0FDVCxRQUFZLEVBQU8sR0FBVSxFQUFLLE1BQVMsRUFBcUIsQ0FDOUQsSUFBTSxFQUFRLEVBQVksRUFBUyxDQUFPLEVBQ3BDLEVBQVMsSUFBVSxPQUFZLE9BQU8sSUFBTSxPQUFPLENBQUssRUFDOUQsR0FBSSxPQUFPLFNBQVMsQ0FBTSxHQUFLLEVBQVUsRUFBUSxFQUFLLENBQUcsRUFDdkQsRUFBSSxHQUFTLElBaUJOLEVBQWMsS0FBaUIsQ0FDMUMsT0FBTyxDQUFDLEVBQVMsQ0FDZixJQUFNLEVBQStCLENBQUMsRUFLdEMsR0FIQSxFQUFvQixFQUFTLENBQUcsRUFDaEMsRUFBcUIsRUFBUyxDQUFHLEVBRTdCLE9BQU8sS0FBSyxDQUFHLEVBQUUsT0FBUyxFQUM1QixNQUFPLENBQUUsS0FBSSxFQUdmLElBQU0sRUFBVSxFQUFlLENBQU8sRUFDdEMsT0FBTyxFQUFVLENBQUUsSUFBSyxDQUFRLEVBQUksT0FFeEMsR0FFTSxFQUFvQixDQUFDLElBQXVDLENBQ2hFLEdBQUksT0FBTyxJQUFVLFVBQVksT0FBTyxTQUFTLENBQUssR0FBSyxHQUFTLEVBQ2xFLE9BQU8sRUFFVCxHQUFJLE9BQU8sSUFBVSxVQUFZLEVBQU0sU0FBVyxFQUNoRCxPQUVGLElBQU0sRUFBUyxPQUFPLENBQUssRUFDM0IsT0FBTyxPQUFPLFNBQVMsQ0FBTSxHQUFLLEdBQVUsRUFBSSxFQUFTLFFBR3JELEVBQWEsQ0FDakIsRUFDQSxJQUNZLENBQ1osUUFBWSxFQUFLLEtBQVUsT0FBTyxRQUFRLENBQU8sRUFDL0MsR0FBSSxFQUFJLFlBQVksSUFBTSxFQUN4QixPQUFPLEdBWUEsRUFBZSxLQUFpQixDQUMzQyxPQUFPLENBQUMsRUFBeUIsQ0FDL0IsSUFBTSxFQUFRLEVBQWtCLEVBQVEsUUFBUSxJQUFJLGdCQUFnQixDQUFDLEVBQ3JFLE9BQU8sSUFBVSxPQUFZLE9BQVksQ0FBRSxhQUFjLENBQU0sR0FFakUsUUFBUSxDQUFDLEVBQThDLENBQ3JELElBQU0sRUFBUSxFQUFrQixFQUFXLEVBQU0sUUFBUyxnQkFBZ0IsQ0FBQyxFQUMzRSxPQUFPLElBQVUsT0FBWSxPQUFZLENBQUUsY0FBZSxDQUFNLEVBRXBFIiwKICAiZGVidWdJZCI6ICJCQzc3RkUzNUJGRDE5N0E4NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
3
+ //# debugId=F9439F8C6145769D64756E2164756E21
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2VucmljaGVycy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7XG4gIEVucmljaGVyLFxuICBFbnJpY2hlckZpZWxkcyxcbiAgRW5yaWNoZXJSZXNwb25zZUlucHV0XG59IGZyb20gJy4vdHlwZXMvZW5yaWNoZXInXG5cbmV4cG9ydCB0eXBlIHtcbiAgRW5yaWNoZXIsXG4gIEVucmljaGVyRmllbGRzLFxuICBFbnJpY2hlckxpa2UsXG4gIEVucmljaGVyUmVzcG9uc2VJbnB1dFxufSBmcm9tICcuL3R5cGVzL2VucmljaGVyJ1xuXG5jb25zdCBIRVhfUkFESVggPSAxNlxuY29uc3QgTUFYX1RSQUNFU1RBVEVfTEVOR1RIID0gNTEyXG5cbi8vIHZlcnNpb24tdHJhY2VfaWQtcGFyZW50X2lkLWZsYWdzLCB3aXRoIGFuIG9wdGlvbmFsIHRhaWwgZm9yIHZlcnNpb25zID4gMDAuXG5jb25zdCBUUkFDRVBBUkVOVCA9XG4gIC9eKD88dmVyc2lvbj5bXFxkYS1mXXsyfSktKD88dHJhY2VJZD5bXFxkYS1mXXszMn0pLSg/PHNwYW5JZD5bXFxkYS1mXXsxNn0pLSg/PGZsYWdzPltcXGRhLWZdezJ9KSg/Oi0uKyk/JC91XG5jb25zdCBaRVJPX1RSQUNFX0lEID0gJzAnLnJlcGVhdCgzMilcbmNvbnN0IFpFUk9fU1BBTl9JRCA9ICcwJy5yZXBlYXQoMTYpXG5jb25zdCBJTlZBTElEX1ZFUlNJT04gPSAnZmYnXG5jb25zdCBDVVJSRU5UX1ZFUlNJT04gPSAnMDAnXG4vKiogYDAwLWAgKyAzMiArIGAtYCArIDE2ICsgYC1gICsgMjogdmVyc2lvbiAwMCBpcyBleGFjdGx5IHRoZXNlIGZvdXIgZmllbGRzLiAqL1xuY29uc3QgVkVSU0lPTl8wMF9MRU5HVEggPSA1NVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNlcGFyZW50RW5yaWNoZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEhlYWRlciB0byByZWFkIHRoZSB0cmFjZSBjb250ZXh0IGZyb20uXG4gICAqIEBkZWZhdWx0ICd0cmFjZXBhcmVudCdcbiAgICovXG4gIGhlYWRlcj86IHN0cmluZ1xuICAvKipcbiAgICogQWxzbyByZWNvcmQgdGhlIHJhdyBgdHJhY2VzdGF0ZWAgaGVhZGVyICh0cnVuY2F0ZWQgdG8gNTEyIGNoYXJhY3RlcnMpLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgdHJhY2VzdGF0ZT86IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBSZWFkcyBXM0MgdHJhY2UgY29udGV4dCBzdHJhaWdodCBvZmYgdGhlIHJlcXVlc3QgaGVhZGVycywgc28gbG9ncyBsaW5rIHRvXG4gKiB0cmFjZXMgaW4gU2VudHJ5LCBIeXBlckRYLCBvciBhbnkgT1RMUCBiYWNrZW5kIHdpdGhvdXQgYW4gT3BlblRlbGVtZXRyeSBTREtcbiAqIGluIHRoZSBwcm9jZXNzLlxuICpcbiAqIFVzZSBgbG9naXhseXNpYS9vdGVsYCBpbnN0ZWFkIHdoZW4geW91IGFscmVhZHkgcnVuIHRoZSBTREsgYW5kIHdhbnQgdGhlIGlkc1xuICogb2YgdGhlICphY3RpdmUgc3BhbiogcmF0aGVyIHRoYW4gdGhlIGlkcyB0aGUgY2FsbGVyIHByb3BhZ2F0ZWQuXG4gKlxuICogQWRkcyBgdHJhY2VfaWRgLCBgc3Bhbl9pZGAsIGB0cmFjZV9mbGFnc2AsIGFuZCBgdHJhY2Vfc2FtcGxlZGAuXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFjZXBhcmVudEVucmljaGVyID0gKFxuICBvcHRpb25zOiBUcmFjZXBhcmVudEVucmljaGVyT3B0aW9ucyA9IHt9XG4pOiBFbnJpY2hlciA9PiB7XG4gIGNvbnN0IGhlYWRlciA9IG9wdGlvbnMuaGVhZGVyID8/ICd0cmFjZXBhcmVudCdcblxuICByZXR1cm4ge1xuICAgIHJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgY29uc3QgcmF3ID0gcmVxdWVzdC5oZWFkZXJzLmdldChoZWFkZXIpXG4gICAgICBpZiAoIXJhdykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSByYXcudHJpbSgpXG4gICAgICBjb25zdCBtYXRjaCA9IFRSQUNFUEFSRU5ULmV4ZWModmFsdWUpXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBbLCB2ZXJzaW9uLCB0cmFjZUlkLCBzcGFuSWQsIGZsYWdzXSA9IG1hdGNoXG5cbiAgICAgIC8vIGBmZmAgaXMgcmVzZXJ2ZWQsIGFsbC16ZXJvIGlkcyBhcmUgaW52YWxpZCwgYW5kIGEgdmVyc2lvbi0wMCBoZWFkZXJcbiAgICAgIC8vIGNhcnJ5aW5nIGV4dHJhIGZpZWxkcyBpcyBtYWxmb3JtZWQgcmF0aGVyIHRoYW4gZm9yd2FyZC1jb21wYXRpYmxlLlxuICAgICAgaWYgKFxuICAgICAgICB2ZXJzaW9uID09PSBJTlZBTElEX1ZFUlNJT04gfHxcbiAgICAgICAgdHJhY2VJZCA9PT0gWkVST19UUkFDRV9JRCB8fFxuICAgICAgICBzcGFuSWQgPT09IFpFUk9fU1BBTl9JRCB8fFxuICAgICAgICAodmVyc2lvbiA9PT0gQ1VSUkVOVF9WRVJTSU9OICYmIHZhbHVlLmxlbmd0aCAhPT0gVkVSU0lPTl8wMF9MRU5HVEgpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIHNwYW5faWQ6IHNwYW5JZCxcbiAgICAgICAgdHJhY2VfZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0cmFjZV9pZDogdHJhY2VJZCxcbiAgICAgICAgLy8gYHNhbXBsZWRgIGlzIHRoZSBsb3cgYml0IG9mIHRoZSBmbGFncyBieXRlLCBzbyBhbiBvZGQgdmFsdWUgaXMgc2V0LlxuICAgICAgICB0cmFjZV9zYW1wbGVkOiBOdW1iZXIucGFyc2VJbnQoZmxhZ3MsIEhFWF9SQURJWCkgJSAyID09PSAxXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnRyYWNlc3RhdGUpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd0cmFjZXN0YXRlJylcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgZmllbGRzLnRyYWNlc3RhdGUgPSBzdGF0ZS5zbGljZSgwLCBNQVhfVFJBQ0VTVEFURV9MRU5HVEgpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpZWxkc1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBCT1QgPSAvYm90fGNyYXdsfHNwaWRlcnxzbHVycHxmYWNlYm9va2V4dGVybmFsaGl0fHByZXZpZXd8aGVhZGxlc3MvaXVcbmNvbnN0IFRBQkxFVCA9IC9pcGFkfHRhYmxldHxwbGF5Ym9va3xzaWxrfGtpbmRsZS9pdVxuY29uc3QgTU9CSUxFID0gL21vYml8aXBob25lfGlwb2R8d2luZG93cyBwaG9uZS9pdVxuY29uc3QgQU5EUk9JRF9NT0JJTEUgPSAvYW5kcm9pZC4qbW9iaWxlL2l1XG5cbi8qKiBGaXJzdCBtYXRjaCB3aW5zLCBzbyBtb3JlIHNwZWNpZmljIGVuZ2luZXMgYXJlIGxpc3RlZCBiZWZvcmUgdGhlaXIgYmFzZS4gKi9cbmNvbnN0IEJST1dTRVJTOiByZWFkb25seSBbbmFtZTogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHBdW10gPSBbXG4gIFsnRWRnZScsIC9lZGcoPzphfGlvcyk/XFwvKD88dmVyc2lvbj5bXFxkLl0rKS9pdV0sXG4gIFsnT3BlcmEnLCAvKD86b3ByfG9waW9zfG9wZXJhKVxcLyg/PHZlcnNpb24+W1xcZC5dKykvaXVdLFxuICBbJ1NhbXN1bmcgSW50ZXJuZXQnLCAvc2Ftc3VuZ2Jyb3dzZXJcXC8oPzx2ZXJzaW9uPltcXGQuXSspL2l1XSxcbiAgWydGaXJlZm94JywgLyg/OmZpcmVmb3h8Znhpb3MpXFwvKD88dmVyc2lvbj5bXFxkLl0rKS9pdV0sXG4gIFsnQ2hyb21lJywgLyg/OmNocm9tZXxjcmlvcylcXC8oPzx2ZXJzaW9uPltcXGQuXSspL2l1XSxcbiAgWydTYWZhcmknLCAvdmVyc2lvblxcLyg/PHZlcnNpb24+W1xcZC5dKykuKnNhZmFyaS9pdV1cbl1cblxuY29uc3QgT1BFUkFUSU5HX1NZU1RFTVM6IHJlYWRvbmx5IFtuYW1lOiBzdHJpbmcsIHBhdHRlcm46IFJlZ0V4cF1bXSA9IFtcbiAgWydpT1MnLCAvaXBob25lfGlwYWR8aXBvZC9pdV0sXG4gIFsnQW5kcm9pZCcsIC9hbmRyb2lkL2l1XSxcbiAgWydDaHJvbWVPUycsIC9jcm9zL2l1XSxcbiAgWydXaW5kb3dzJywgL3dpbmRvd3MgbnQvaXVdLFxuICBbJ21hY09TJywgL21hYyBvcyB4L2l1XSxcbiAgWydMaW51eCcsIC9saW51eC9pdV1cbl1cblxuY29uc3QgbWF0Y2hOYW1lID0gKFxuICBjYW5kaWRhdGVzOiByZWFkb25seSBbc3RyaW5nLCBSZWdFeHBdW10sXG4gIHZhbHVlOiBzdHJpbmdcbik6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBmb3IgKGNvbnN0IFtuYW1lLCBwYXR0ZXJuXSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWModmFsdWUpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4geyBuYW1lLCB2ZXJzaW9uOiBtYXRjaFsxXSB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHJlc29sdmVEZXZpY2UgPSAodmFsdWU6IHN0cmluZywgYm90OiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKGJvdCkge1xuICAgIHJldHVybiAnYm90J1xuICB9XG4gIGlmIChUQUJMRVQudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJ3RhYmxldCdcbiAgfVxuICBpZiAoTU9CSUxFLnRlc3QodmFsdWUpIHx8IEFORFJPSURfTU9CSUxFLnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuICdtb2JpbGUnXG4gIH1cbiAgcmV0dXJuICdkZXNrdG9wJ1xufVxuXG4vKipcbiAqIFR1cm5zIHRoZSBgdXNlci1hZ2VudGAgaGVhZGVyIGludG8gcXVlcnlhYmxlIGZpZWxkcyB1bmRlciBgdWFgOiBgYnJvd3NlcmAsXG4gKiBgYnJvd3NlclZlcnNpb25gLCBgb3NgLCBgZGV2aWNlYCAoYGRlc2t0b3BgIHwgYG1vYmlsZWAgfCBgdGFibGV0YCB8IGBib3RgKSxcbiAqIGFuZCBgYm90YC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgYSBoZXVyaXN0aWMg4oCUIHVzZXIgYWdlbnRzIGFyZSBub3QgYSBwYXJzZWFibGUgZ3JhbW1hci4gSXQgaXNcbiAqIGJ1aWx0IGZvciBncm91cGluZyB0cmFmZmljIGluIGEgZGFzaGJvYXJkLCBub3QgZm9yIG1ha2luZyBhY2Nlc3MgZGVjaXNpb25zLlxuICovXG5leHBvcnQgY29uc3QgdXNlckFnZW50RW5yaWNoZXIgPSAoKTogRW5yaWNoZXIgPT4gKHtcbiAgcmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd1c2VyLWFnZW50JylcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBib3QgPSBCT1QudGVzdCh2YWx1ZSlcbiAgICBjb25zdCBicm93c2VyID0gbWF0Y2hOYW1lKEJST1dTRVJTLCB2YWx1ZSlcbiAgICBjb25zdCBvcyA9IG1hdGNoTmFtZShPUEVSQVRJTkdfU1lTVEVNUywgdmFsdWUpXG5cbiAgICByZXR1cm4ge1xuICAgICAgdWE6IHtcbiAgICAgICAgYm90LFxuICAgICAgICAuLi4oYnJvd3NlciA/IHsgYnJvd3NlcjogYnJvd3Nlci5uYW1lIH0gOiB7fSksXG4gICAgICAgIC4uLihicm93c2VyPy52ZXJzaW9uID8geyBicm93c2VyVmVyc2lvbjogYnJvd3Nlci52ZXJzaW9uIH0gOiB7fSksXG4gICAgICAgIGRldmljZTogcmVzb2x2ZURldmljZSh2YWx1ZSwgYm90KSxcbiAgICAgICAgLi4uKG9zID8geyBvczogb3MubmFtZSB9IDoge30pXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuXG4vKiogSGVhZGVyIGNhbmRpZGF0ZXMgcGVyIGdlbyBmaWVsZCwgaW4gcHJpb3JpdHkgb3JkZXIgYWNyb3NzIHBsYXRmb3Jtcy4gKi9cbmNvbnN0IEdFT19IRUFERVJTOiByZWFkb25seSBbZmllbGQ6IHN0cmluZywgaGVhZGVyczogcmVhZG9ubHkgc3RyaW5nW11dW10gPSBbXG4gIFsnY2l0eScsIFsneC12ZXJjZWwtaXAtY2l0eScsICdjZi1pcGNpdHknXV0sXG4gIFsnY291bnRyeScsIFsneC12ZXJjZWwtaXAtY291bnRyeScsICdjZi1pcGNvdW50cnknXV0sXG4gIFsncmVnaW9uJywgWyd4LXZlcmNlbC1pcC1jb3VudHJ5LXJlZ2lvbicsICdjZi1yZWdpb24tY29kZScsICdjZi1yZWdpb24nXV0sXG4gIFsndGltZXpvbmUnLCBbJ3gtdmVyY2VsLWlwLXRpbWV6b25lJywgJ2NmLXRpbWV6b25lJ11dXG5dXG5cbmNvbnN0IEdFT19OVU1FUklDX0hFQURFUlM6IHJlYWRvbmx5IFtcbiAgZmllbGQ6IHN0cmluZyxcbiAgaGVhZGVyczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHJhbmdlOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdXG5dW10gPSBbXG4gIFsnbGF0aXR1ZGUnLCBbJ3gtdmVyY2VsLWlwLWxhdGl0dWRlJywgJ2NmLWlwbGF0aXR1ZGUnXSwgWy05MCwgOTBdXSxcbiAgWydsb25naXR1ZGUnLCBbJ3gtdmVyY2VsLWlwLWxvbmdpdHVkZScsICdjZi1pcGxvbmdpdHVkZSddLCBbLTE4MCwgMTgwXV1cbl1cblxuY29uc3QgTkVUTElGWV9HRU9fSEVBREVSID0gJ3gtbmYtZ2VvJ1xuY29uc3QgR0VPX1NUUklOR19NQVggPSAxMjhcbmNvbnN0IEdFT19SQVdfSEVBREVSX01BWCA9IDIwNDhcbi8qKiBJU08tMzE2Ni1pc2ggY291bnRyeS9yZWdpb24gY29kZXM6IHNob3J0IGFscGhhbnVtZXJpYyB0b2tlbnMsIG5ldmVyIGZyZWUgdGV4dC4gKi9cbmNvbnN0IEdFT19DT0RFX1JFR0VYID0gL15bQS1aYS16MC05LV17MSwxMH0kL3VcblxuY29uc3QgZmlyc3RIZWFkZXIgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGhlYWRlcnM6IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBmb3IgKGNvbnN0IGhlYWRlciBvZiBoZWFkZXJzKSB7XG4gICAgY29uc3QgdmFsdWUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KGhlYWRlcilcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfVxufVxuXG4vKiogVmVyY2VsIHBlcmNlbnQtZW5jb2RlcyBjaXR5IG5hbWVzLCBzbyBgUyVDMyVBM28lMjBQYXVsb2AgbXVzdCBiZSBkZWNvZGVkLiAqL1xuY29uc3QgZGVjb2RlSGVhZGVyVmFsdWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkuc2xpY2UoMCwgR0VPX1NUUklOR19NQVgpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB2YWx1ZS5zbGljZSgwLCBHRU9fU1RSSU5HX01BWClcbiAgfVxufVxuXG5jb25zdCBpc0luUmFuZ2UgPSAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4XG5cbmludGVyZmFjZSBOZXRsaWZ5R2VvIHtcbiAgY2l0eT86IHN0cmluZ1xuICBjb3VudHJ5PzogeyBjb2RlPzogc3RyaW5nIH1cbiAgbGF0aXR1ZGU/OiBudW1iZXJcbiAgbG9uZ2l0dWRlPzogbnVtYmVyXG4gIHN1YmRpdmlzaW9uPzogeyBjb2RlPzogc3RyaW5nIH1cbiAgdGltZXpvbmU/OiBzdHJpbmdcbn1cblxuLyoqIEEgbm9uLWVtcHR5IHN0cmluZyBmaWVsZCwgYm91bmRlZDsgYW55IG90aGVyIHR5cGUgaXMgaWdub3JlZC4gKi9cbmNvbnN0IGdlb1RleHQgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwXG4gICAgPyB2YWx1ZS5zbGljZSgwLCBHRU9fU1RSSU5HX01BWClcbiAgICA6IHVuZGVmaW5lZFxuXG4vKiogQSBzdHJpbmcgdGhhdCBpcyBhIHNob3J0IGNvdW50cnkgb3IgcmVnaW9uIGNvZGU7IGFueSBvdGhlciB2YWx1ZSBpcyBpZ25vcmVkLiAqL1xuY29uc3QgZ2VvQ29kZSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIEdFT19DT0RFX1JFR0VYLnRlc3QodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWRcblxuY29uc3QgcmVhZE5ldGxpZnlHZW8gPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcmF3ID0gcmVxdWVzdC5oZWFkZXJzLmdldChORVRMSUZZX0dFT19IRUFERVIpXG4gIGlmICghcmF3IHx8IHJhdy5sZW5ndGggPiBHRU9fUkFXX0hFQURFUl9NQVgpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCBwYXJzZWQ6IHVua25vd25cbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGF0b2IocmF3KSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAocGFyc2VkID09PSBudWxsIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBkYXRhID0gcGFyc2VkIGFzIE5ldGxpZnlHZW9cbiAgY29uc3QgZ2VvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGNvbnN0IGNpdHkgPSBnZW9UZXh0KGRhdGEuY2l0eSlcbiAgaWYgKGNpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGdlby5jaXR5ID0gY2l0eVxuICB9XG4gIGNvbnN0IGNvdW50cnkgPSBnZW9Db2RlKGRhdGEuY291bnRyeT8uY29kZSlcbiAgaWYgKGNvdW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgIGdlby5jb3VudHJ5ID0gY291bnRyeVxuICB9XG4gIGNvbnN0IHJlZ2lvbiA9IGdlb0NvZGUoZGF0YS5zdWJkaXZpc2lvbj8uY29kZSlcbiAgaWYgKHJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZ2VvLnJlZ2lvbiA9IHJlZ2lvblxuICB9XG4gIGNvbnN0IHRpbWV6b25lID0gZ2VvVGV4dChkYXRhLnRpbWV6b25lKVxuICBpZiAodGltZXpvbmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGdlby50aW1lem9uZSA9IHRpbWV6b25lXG4gIH1cbiAgaWYgKHR5cGVvZiBkYXRhLmxhdGl0dWRlID09PSAnbnVtYmVyJyAmJiBpc0luUmFuZ2UoZGF0YS5sYXRpdHVkZSwgLTkwLCA5MCkpIHtcbiAgICBnZW8ubGF0aXR1ZGUgPSBkYXRhLmxhdGl0dWRlXG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBkYXRhLmxvbmdpdHVkZSA9PT0gJ251bWJlcicgJiZcbiAgICBpc0luUmFuZ2UoZGF0YS5sb25naXR1ZGUsIC0xODAsIDE4MClcbiAgKSB7XG4gICAgZ2VvLmxvbmdpdHVkZSA9IGRhdGEubG9uZ2l0dWRlXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXMoZ2VvKS5sZW5ndGggPiAwID8gZ2VvIDogdW5kZWZpbmVkXG59XG5cbi8qKiBGaWVsZHMgd2hvc2UgdmFsdWUgbXVzdCBsb29rIGxpa2UgYSBzaG9ydCBjb3VudHJ5L3JlZ2lvbiBjb2RlLCBub3QgZnJlZSB0ZXh0LiAqL1xuY29uc3QgR0VPX0NPREVfRklFTERTID0gbmV3IFNldChbJ2NvdW50cnknLCAncmVnaW9uJ10pXG5cbmNvbnN0IHJlYWRHZW9TdHJpbmdGaWVsZHMgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGdlbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IFtmaWVsZCwgaGVhZGVyc10gb2YgR0VPX0hFQURFUlMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGZpcnN0SGVhZGVyKHJlcXVlc3QsIGhlYWRlcnMpXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUhlYWRlclZhbHVlKHZhbHVlKVxuICAgIGlmICghR0VPX0NPREVfRklFTERTLmhhcyhmaWVsZCkgfHwgR0VPX0NPREVfUkVHRVgudGVzdChkZWNvZGVkKSkge1xuICAgICAgZ2VvW2ZpZWxkXSA9IGRlY29kZWRcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcmVhZEdlb051bWVyaWNGaWVsZHMgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGdlbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IFtmaWVsZCwgaGVhZGVycywgW21pbiwgbWF4XV0gb2YgR0VPX05VTUVSSUNfSEVBREVSUykge1xuICAgIGNvbnN0IHZhbHVlID0gZmlyc3RIZWFkZXIocmVxdWVzdCwgaGVhZGVycylcbiAgICBjb25zdCBwYXJzZWQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gTnVtYmVyLk5hTiA6IE51bWJlcih2YWx1ZSlcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgaXNJblJhbmdlKHBhcnNlZCwgbWluLCBtYXgpKSB7XG4gICAgICBnZW9bZmllbGRdID0gcGFyc2VkXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGdlbyBoZWFkZXJzIHRoZSBlZGdlIGFscmVhZHkgYXR0YWNoZWQg4oCUIFZlcmNlbCwgQ2xvdWRmbGFyZSwgb3JcbiAqIE5ldGxpZnkg4oCUIGludG8gYGdlby5jaXR5YCwgYGdlby5jb3VudHJ5YCwgYGdlby5yZWdpb25gLCBgZ2VvLnRpbWV6b25lYCxcbiAqIGBnZW8ubGF0aXR1ZGVgLCBhbmQgYGdlby5sb25naXR1ZGVgLlxuICpcbiAqIE5vdGhpbmcgaXMgZGVyaXZlZCBmcm9tIHRoZSBJUCBhZGRyZXNzIGl0c2VsZiwgc28gYmVoaW5kIGEgcGxhdGZvcm0gdGhhdFxuICogZG9lcyBub3Qgc2V0IHRoZXNlIGhlYWRlcnMgdGhlIGVucmljaGVyIHNpbXBseSBhZGRzIG5vdGhpbmcuXG4gKlxuICogVGhlc2UgaGVhZGVycyBhcmUgY2xpZW50LXNldHRhYmxlIHVubGVzcyBhbiBlZGdlIGluIGZyb250IG9mIHRoZSBhcHBcbiAqIG92ZXJ3cml0ZXMgdGhlbSBvbiBldmVyeSByZXF1ZXN0IOKAlCB0cnVzdCB0aGUgdmFsdWVzIG9ubHkgYmVoaW5kIHN1Y2ggYW5cbiAqIGVkZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBnZW9FbnJpY2hlciA9ICgpOiBFbnJpY2hlciA9PiAoe1xuICByZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICBjb25zdCBnZW86IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cblxuICAgIHJlYWRHZW9TdHJpbmdGaWVsZHMocmVxdWVzdCwgZ2VvKVxuICAgIHJlYWRHZW9OdW1lcmljRmllbGRzKHJlcXVlc3QsIGdlbylcblxuICAgIGlmIChPYmplY3Qua2V5cyhnZW8pLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7IGdlbyB9XG4gICAgfVxuXG4gICAgY29uc3QgbmV0bGlmeSA9IHJlYWROZXRsaWZ5R2VvKHJlcXVlc3QpXG4gICAgcmV0dXJuIG5ldGxpZnkgPyB7IGdlbzogbmV0bGlmeSB9IDogdW5kZWZpbmVkXG4gIH1cbn0pXG5cbmNvbnN0IHJlYWRDb250ZW50TGVuZ3RoID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAwKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKVxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgcGFyc2VkID49IDAgPyBwYXJzZWQgOiB1bmRlZmluZWRcbn1cblxuY29uc3QgZmluZEhlYWRlciA9IChcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG5hbWU6IHN0cmluZ1xuKTogdW5rbm93biA9PiB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSBuYW1lKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZWNvcmRzIHBheWxvYWQgc2l6ZXMgYXMgYHJlcXVlc3RCeXRlc2AgYW5kIGByZXNwb25zZUJ5dGVzYC5cbiAqXG4gKiBCb3RoIGNvbWUgZnJvbSBgY29udGVudC1sZW5ndGhgLCB3aGljaCBpcyB0aGUgb25seSBzaXplIHRoZSBwbHVnaW4gY2FuIHJlYWRcbiAqIHdpdGhvdXQgYnVmZmVyaW5nIGEgYm9keS4gQSBjaHVua2VkIG9yIHN0cmVhbWVkIHJlc3BvbnNlIGhhcyBub1xuICogYGNvbnRlbnQtbGVuZ3RoYCwgc28gYHJlc3BvbnNlQnl0ZXNgIGlzIG9taXR0ZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHNpemVFbnJpY2hlciA9ICgpOiBFbnJpY2hlciA9PiAoe1xuICByZXF1ZXN0KHJlcXVlc3QpOiBFbnJpY2hlckZpZWxkcyB7XG4gICAgY29uc3QgYnl0ZXMgPSByZWFkQ29udGVudExlbmd0aChyZXF1ZXN0LmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKVxuICAgIHJldHVybiBieXRlcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogeyByZXF1ZXN0Qnl0ZXM6IGJ5dGVzIH1cbiAgfSxcbiAgcmVzcG9uc2UoaW5wdXQ6IEVucmljaGVyUmVzcG9uc2VJbnB1dCk6IEVucmljaGVyRmllbGRzIHtcbiAgICBjb25zdCBieXRlcyA9IHJlYWRDb250ZW50TGVuZ3RoKGZpbmRIZWFkZXIoaW5wdXQuaGVhZGVycywgJ2NvbnRlbnQtbGVuZ3RoJykpXG4gICAgcmV0dXJuIGJ5dGVzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IHJlc3BvbnNlQnl0ZXM6IGJ5dGVzIH1cbiAgfVxufSlcbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQWlCQSxJQUFNLEVBQ0osd0dBQ0ksRUFBZ0IsSUFBSSxPQUFPLEVBQUUsRUFDN0IsRUFBZSxJQUFJLE9BQU8sRUFBRSxFQTZCM0IsSUFBTSxFQUFzQixDQUNqQyxFQUFzQyxDQUFDLElBQzFCLENBQ2IsSUFBTSxFQUFTLEVBQVEsUUFBVSxjQUVqQyxNQUFPLENBQ0wsT0FBTyxDQUFDLEVBQVMsQ0FDZixJQUFNLEVBQU0sRUFBUSxRQUFRLElBQUksQ0FBTSxFQUN0QyxHQUFJLENBQUMsRUFDSCxPQUdGLElBQU0sRUFBUSxFQUFJLEtBQUssRUFDakIsRUFBUSxFQUFZLEtBQUssQ0FBSyxFQUNwQyxHQUFJLENBQUMsRUFDSCxPQUdGLEtBQVMsRUFBUyxFQUFTLEVBQVEsR0FBUyxFQUk1QyxHQUNFLElBbkRnQixNQW9EaEIsSUFBWSxHQUNaLElBQVcsR0FDVixJQXJEZSxNQXFEZ0IsRUFBTSxTQW5EcEIsR0FxRGxCLE9BR0YsSUFBTSxFQUFrQyxDQUN0QyxRQUFTLEVBQ1QsWUFBYSxFQUNiLFNBQVUsRUFFVixjQUFlLE9BQU8sU0FBUyxFQXhFckIsRUF3RXFDLEVBQUksSUFBTSxDQUMzRCxFQUVBLEdBQUksRUFBUSxXQUFZLENBQ3RCLElBQU0sRUFBUSxFQUFRLFFBQVEsSUFBSSxZQUFZLEVBQzlDLEdBQUksRUFDRixFQUFPLFdBQWEsRUFBTSxNQUFNLEVBN0VaLEdBNkVvQyxF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
package/dist/hyperdx.d.ts CHANGED
@@ -29,17 +29,26 @@ interface BatchTransportOptions {
29
29
  */
30
30
  maxBatchSize?: number;
31
31
  /**
32
- * Batches allowed to be waiting on the backend at once. Once the limit is
33
- * reached, new batches are dropped and reported instead of buffered, so an
34
- * unreachable backend cannot grow memory without bound.
32
+ * The most entries one request carries. Lower it for a backend with a
33
+ * per-request item limit. The Sentry adapter defaults to 100.
34
+ * @default 500
35
+ */
36
+ maxEntriesPerRequest?: number;
37
+ /**
38
+ * Bound on the entries that wait behind the request in flight, as a
39
+ * multiple of `maxBatchSize`: at most `maxPendingBatches × maxBatchSize`
40
+ * entries wait, and entries beyond that are dropped and reported.
35
41
  * @default 32
36
42
  */
37
43
  maxPendingBatches?: number;
38
44
  /**
39
- * Called when a batch fails after retries, or is dropped because too
40
- * many batches are pending. When omitted, failures go to stderr, rate
41
- * limited to once every 5 seconds. Pass the same function you give
42
- * `config.onError` to see transport failures in one place.
45
+ * Called when a request fails after retries, or when entries are dropped
46
+ * because too many were already waiting. Failures of a request that a
47
+ * `log()` or `flush()` call started are rejected to that caller instead.
48
+ * When omitted, failures go to stderr, rate limited to once every 5
49
+ * seconds. To see every transport failure in one place, forward them to
50
+ * the function you give `config.onError`, as
51
+ * `error => handle({ error, sink: 'transport' })`.
43
52
  */
44
53
  onError?: (error: unknown) => void;
45
54
  /**
@@ -55,6 +64,8 @@ interface BatchTransportOptions {
55
64
  }
56
65
  /** A {@link Transport} that batches entries and can be flushed on demand. */
57
66
  interface AdapterTransport extends Transport {
67
+ /** Stops accepting entries, then flushes the ones already accepted. Idempotent. */
68
+ close: () => Promise<void>;
58
69
  /** Sends any buffered entries immediately. Call before process exit. */
59
70
  flush: () => Promise<void>;
60
71
  }
package/dist/hyperdx.js CHANGED
@@ -1,4 +1,4 @@
1
- import{a as V}from"./shared/Logixlysia-b7f18pfw.js";import{c as G,d as z,e as Q}from"./shared/Logixlysia-kwnc1c9b.js";import"./shared/Logixlysia-1ap5daz6.js";var Z="https://in-otel.hyperdx.io",w=(j={})=>{let B=j.apiKey??z("HYPERDX_API_KEY");if(!B)throw Q("HyperDX","missing API key. Set HYPERDX_API_KEY or pass apiKey to createHyperDXTransport()");let Y=G(j.endpoint??z("HYPERDX_OTLP_ENDPOINT")??Z);return V({headers:{authorization:B},name:"HyperDX",options:j,resourceAttributes:j.resourceAttributes??{},serviceName:j.serviceName??z("HYPERDX_SERVICE_NAME")??z("OTEL_SERVICE_NAME")??"logixlysia",url:`${Y}/v1/logs`})};export{w as createHyperDXTransport};
1
+ import{a as V}from"./shared/Logixlysia-pa8v7y86.js";import{c as G,d as z,e as Q}from"./shared/Logixlysia-xb08zg3q.js";import"./shared/Logixlysia-tqpczh9a.js";var Z="https://in-otel.hyperdx.io",w=(j={})=>{let B=j.apiKey??z("HYPERDX_API_KEY");if(!B)throw Q("HyperDX","missing API key. Set HYPERDX_API_KEY or pass apiKey to createHyperDXTransport()");let Y=G(j.endpoint??z("HYPERDX_OTLP_ENDPOINT")??Z);return V({headers:{authorization:B},name:"HyperDX",options:j,resourceAttributes:j.resourceAttributes??{},serviceName:j.serviceName??z("HYPERDX_SERVICE_NAME")??z("OTEL_SERVICE_NAME")??"logixlysia",url:`${Y}/v1/logs`})};export{w as createHyperDXTransport};
2
2
 
3
3
  //# debugId=F0CC0AB3AC4FB4E264756E2164756E21
4
4
  //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2h5cGVyZHgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgY3JlYXRlT3RscENvcmUgfSBmcm9tICcuL2FkYXB0ZXJzL290bHAtY29yZSdcbmltcG9ydCB7XG4gIGVudlN0cmluZyxcbiAgc3RyaXBUcmFpbGluZ1NsYXNoZXMsXG4gIHRyYW5zcG9ydEVycm9yXG59IGZyb20gJy4vYWRhcHRlcnMvc2hhcmVkJ1xuaW1wb3J0IHR5cGUgeyBBZGFwdGVyVHJhbnNwb3J0LCBCYXRjaFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL2FkYXB0ZXJzL3NoYXJlZCdcblxuY29uc3QgREVGQVVMVF9FTkRQT0lOVCA9ICdodHRwczovL2luLW90ZWwuaHlwZXJkeC5pbydcblxuZXhwb3J0IGludGVyZmFjZSBIeXBlckRYVHJhbnNwb3J0T3B0aW9ucyBleHRlbmRzIEJhdGNoVHJhbnNwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIeXBlckRYIGluZ2VzdGlvbiBBUEkga2V5LCBzZW50IGFzIHRoZSBgYXV0aG9yaXphdGlvbmAgaGVhZGVyLlxuICAgKiBGYWxscyBiYWNrIHRvIHRoZSBgSFlQRVJEWF9BUElfS0VZYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIGFwaUtleT86IHN0cmluZ1xuICAvKipcbiAgICogT1RMUCBIVFRQIGJhc2UgVVJMIOKAlCB0aGUgYWRhcHRlciBhcHBlbmRzIGAvdjEvbG9nc2AuIEZvciBzZWxmLWhvc3RlZFxuICAgKiBjb2xsZWN0b3JzIHBhc3MgdGhlIGJhc2UgVVJMIG9ubHkgKHBvcnQgNDMxOCBieSBkZWZhdWx0KS5cbiAgICogRmFsbHMgYmFjayB0byBgSFlQRVJEWF9PVExQX0VORFBPSU5UYC5cbiAgICogQGRlZmF1bHQgJ2h0dHBzOi8vaW4tb3RlbC5oeXBlcmR4LmlvJ1xuICAgKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmdcbiAgLyoqIEV4dHJhIE9UTFAgcmVzb3VyY2UgYXR0cmlidXRlcyBtZXJnZWQgbmV4dCB0byBgc2VydmljZS5uYW1lYC4gKi9cbiAgcmVzb3VyY2VBdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAvKipcbiAgICogVmFsdWUgb2YgdGhlIGBzZXJ2aWNlLm5hbWVgIHJlc291cmNlIGF0dHJpYnV0ZS5cbiAgICogRmFsbHMgYmFjayB0byBgSFlQRVJEWF9TRVJWSUNFX05BTUVgLCB0aGVuIGBPVEVMX1NFUlZJQ0VfTkFNRWAuXG4gICAqIEBkZWZhdWx0ICdsb2dpeGx5c2lhJ1xuICAgKi9cbiAgc2VydmljZU5hbWU/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHJhbnNwb3J0IHRoYXQgc2hpcHMgbG9ncyB0byBIeXBlckRYIGFzIE9UTFAgSlNPTlxuICogKGBFeHBvcnRMb2dzU2VydmljZVJlcXVlc3RgKSBvdmVyIEhUVFAuIE1ldGEgZmllbGRzIGJlY29tZSBkb3Qtbm90YXRpb24gbG9nXG4gKiBhdHRyaWJ1dGVzIChgcmVxdWVzdC5tZXRob2RgLCBgY29udGV4dC5yZXF1ZXN0SWRgLCDigKYpIHNvIHRoZXkgYXJlIHNlYXJjaGFibGVcbiAqIGluIHRoZSBIeXBlckRYIFVJLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIG5vIEFQSSBrZXkgaXMgY29uZmlndXJlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUh5cGVyRFhUcmFuc3BvcnQgPSAoXG4gIG9wdGlvbnM6IEh5cGVyRFhUcmFuc3BvcnRPcHRpb25zID0ge31cbik6IEFkYXB0ZXJUcmFuc3BvcnQgPT4ge1xuICBjb25zdCBhcGlLZXkgPSBvcHRpb25zLmFwaUtleSA/PyBlbnZTdHJpbmcoJ0hZUEVSRFhfQVBJX0tFWScpXG4gIGlmICghYXBpS2V5KSB7XG4gICAgdGhyb3cgdHJhbnNwb3J0RXJyb3IoXG4gICAgICAnSHlwZXJEWCcsXG4gICAgICAnbWlzc2luZyBBUEkga2V5LiBTZXQgSFlQRVJEWF9BUElfS0VZIG9yIHBhc3MgYXBpS2V5IHRvIGNyZWF0ZUh5cGVyRFhUcmFuc3BvcnQoKSdcbiAgICApXG4gIH1cblxuICBjb25zdCBlbmRwb2ludCA9IHN0cmlwVHJhaWxpbmdTbGFzaGVzKFxuICAgIG9wdGlvbnMuZW5kcG9pbnQgPz8gZW52U3RyaW5nKCdIWVBFUkRYX09UTFBfRU5EUE9JTlQnKSA/PyBERUZBVUxUX0VORFBPSU5UXG4gIClcblxuICByZXR1cm4gY3JlYXRlT3RscENvcmUoe1xuICAgIGhlYWRlcnM6IHsgYXV0aG9yaXphdGlvbjogYXBpS2V5IH0sXG4gICAgbmFtZTogJ0h5cGVyRFgnLFxuICAgIG9wdGlvbnMsXG4gICAgcmVzb3VyY2VBdHRyaWJ1dGVzOiBvcHRpb25zLnJlc291cmNlQXR0cmlidXRlcyA/PyB7fSxcbiAgICBzZXJ2aWNlTmFtZTpcbiAgICAgIG9wdGlvbnMuc2VydmljZU5hbWUgPz9cbiAgICAgIGVudlN0cmluZygnSFlQRVJEWF9TRVJWSUNFX05BTUUnKSA/P1xuICAgICAgZW52U3RyaW5nKCdPVEVMX1NFUlZJQ0VfTkFNRScpID8/XG4gICAgICAnbG9naXhseXNpYScsXG4gICAgdXJsOiBgJHtlbmRwb2ludH0vdjEvbG9nc2BcbiAgfSlcbn1cblxuZXhwb3J0IHR5cGUgeyBBZGFwdGVyVHJhbnNwb3J0IH0gZnJvbSAnLi9hZGFwdGVycy9zaGFyZWQnXG4iCiAgXSwKICAibWFwcGluZ3MiOiAia0pBUUEsVUFBTSxRQUFtQiw2QkFpQ1osRUFBeUIsQ0FDcEMsRUFBbUMsQ0FBQyxJQUNmLENBQ3JCLElBQU0sRUFBUyxFQUFRLFFBQVUsRUFBVSxpQkFBaUIsRUFDNUQsR0FBSSxDQUFDLEVBQ0gsTUFBTSxFQUNKLFVBQ0EsaUZBQ0YsRUFHRixJQUFNLEVBQVcsRUFDZixFQUFRLFVBQVksRUFBVSx1QkFBdUIsR0FBSyxDQUM1RCxFQUVBLE9BQU8sRUFBZSxDQUNwQixRQUFTLENBQUUsY0FBZSxDQUFPLEVBQ2pDLEtBQU0sVUFDTixVQUNBLG1CQUFvQixFQUFRLG9CQUFzQixDQUFDLEVBQ25ELFlBQ0UsRUFBUSxhQUNSLEVBQVUsc0JBQXNCLEdBQ2hDLEVBQVUsbUJBQW1CLEdBQzdCLGFBQ0YsSUFBSyxHQUFHLFdBQ1YsQ0FBQyIsCiAgImRlYnVnSWQiOiAiRjBDQzBBQjNBQzRGQjRFMjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/dist/index.d.ts CHANGED
@@ -110,6 +110,8 @@ type RequestInfo = Request;
110
110
  type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
111
111
  interface StoreData {
112
112
  beforeTime: bigint;
113
+ /** The status the client received, when the caller resolved it. `handleHttpError` prefers it over the thrown value. */
114
+ status?: number;
113
115
  }
114
116
  interface LogixlysiaStore {
115
117
  beforeTime?: bigint;
@@ -315,7 +317,8 @@ interface OutputConfig {
315
317
  * Called when a sink (transport, file, rotation) or an enricher fails, or
316
318
  * when building or printing a log record fails (`sink: 'format'`). Errors
317
319
  * thrown by the hook itself are swallowed. When absent, failures go to
318
- * stderr (rate-limited for transports, enrichers and formatting).
320
+ * stderr (rate-limited for transports, file writes, rotation, enrichers
321
+ * and formatting).
319
322
  */
320
323
  onError?: (context: SinkErrorContext) => void;
321
324
  transports?: Transport[];
@@ -428,9 +431,9 @@ interface WsHandlerHooks<
428
431
  TMessage = unknown,
429
432
  TWs extends WebSocketLike = WebSocketLike
430
433
  > {
431
- close?: (ws: TWs, code?: number, reason?: string) => void;
432
- message?: (ws: TWs, message: TMessage) => void;
433
- open?: (ws: TWs) => void;
434
+ close?: (ws: TWs, code?: number, reason?: string) => unknown;
435
+ message?: (ws: TWs, message: TMessage) => unknown;
436
+ open?: (ws: TWs) => unknown;
434
437
  }
435
438
  declare const createWsHandlerWrapper: (options: Options, logger: Logger, contextStore: RequestContextStore) => <
436
439
  TMessage,
@@ -454,6 +457,7 @@ interface ResolvedRequestIdConfig {
454
457
  enabled: boolean;
455
458
  generator: () => string;
456
459
  header: string;
460
+ onError?: (context: SinkErrorContext) => void;
457
461
  }
458
462
  /**
459
463
  * Normalises the `requestId` option into a concrete config object.
@@ -462,7 +466,7 @@ interface ResolvedRequestIdConfig {
462
466
  * - `true` → default config
463
467
  * - `RequestIdConfig` → merged with defaults; `enabled: false` inside the object disables the feature
464
468
  */
465
- declare const resolveRequestIdConfig: (raw?: boolean | RequestIdConfig) => ResolvedRequestIdConfig | null;
469
+ declare const resolveRequestIdConfig: (raw?: boolean | RequestIdConfig, onError?: (context: SinkErrorContext) => void) => ResolvedRequestIdConfig | null;
466
470
  /**
467
471
  * Reads an existing request ID from the incoming request header, or generates a
468
472
  * new one using the configured generator.
@@ -471,6 +475,10 @@ declare const resolveRequestIdConfig: (raw?: boolean | RequestIdConfig) => Resol
471
475
  * `.`, `_`, `-`, 1-128 chars) before being trusted — request IDs flow into log
472
476
  * lines, response headers, and context trees, so malformed or oversized
473
477
  * values are replaced with a freshly generated one rather than echoed back.
478
+ *
479
+ * Generated values must pass the same check. This runs in `onRequest`, where
480
+ * a throw would log an error for every request, so a generator that throws
481
+ * or returns an invalid id is reported and replaced with a random UUID.
474
482
  */
475
483
  declare const getOrCreateRequestId: (request: Request, config: ResolvedRequestIdConfig) => string;
476
484
  /**
@@ -553,4 +561,4 @@ declare const flushLogixlysia: (options: Options, { close }?: {
553
561
  close?: boolean;
554
562
  }) => Promise<void>;
555
563
  declare const logixlysia: typeof createLogixlysiaPlugin;
556
- export { useLogger, resolveSampling, resolveRequestIdConfig, resolveOptions, logixlysia, getOrCreateRequestId, flushLogixlysia, createLogixlysiaPlugin as default, createWsHandlerWrapper, createPluginLogger, createLogger, WsHandlerHooks, Transport, TailSamplingConfig, StoreData, SamplingRuntime, SamplingDecision, SamplingConfig, ResolvedRequestIdConfig, RequestScopedLogger, RequestOutcome, RequestIdConfig, Pino, Options, LogixlysiaStore, LogixlysiaSingleton, LogixlysiaPlugin, LogixlysiaContext, Logixlysia, Logger, LogPreset, LogLevel, LogFields, HttpErrorPayload, HttpErrorInit, HttpError, HeadSamplingConfig, EnricherResponseInput, EnricherLike, EnricherFields, Enricher, EmptyElysiaSlot };
564
+ export { useLogger, resolveSampling, resolveRequestIdConfig, resolveOptions, logixlysia, getOrCreateRequestId, flushLogixlysia, createLogixlysiaPlugin as default, createWsHandlerWrapper, createPluginLogger, createLogger, WsHandlerHooks, WebSocketLike, Transport, TailSamplingConfig, StoreData, SinkErrorContext, SamplingRuntime, SamplingDecision, SamplingConfig, ResolvedRequestIdConfig, RequestScopedLogger, RequestOutcome, RequestIdConfig, Pino, Options, LogixlysiaStore, LogixlysiaSingleton, LogixlysiaPlugin, LogixlysiaContext, LogixlysiaConfig, Logixlysia, Logger, LogRotationConfig, LogPreset, LogLevel, LogFilter, LogFields, HttpErrorPayload, HttpErrorInit, HttpError, HeadSamplingConfig, EnricherResponseInput, EnricherLike, EnricherFields, Enricher, EmptyElysiaSlot };