@workflow/web-shared 5.0.0-beta.13 → 5.0.0-beta.14

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.
Files changed (32) hide show
  1. package/dist/components/new-trace-viewer/components/event-list.js +3 -3
  2. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  3. package/dist/components/new-trace-viewer/components/timeline.js +4 -4
  4. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  5. package/dist/components/sidebar/attribute-panel.js +8 -4
  6. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  7. package/dist/components/sidebar/entity-detail-panel.js +12 -11
  8. package/dist/components/sidebar/events-list.d.ts +3 -1
  9. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  10. package/dist/components/sidebar/events-list.js +4 -3
  11. package/dist/components/sidebar/span-detail-merge.d.ts +16 -0
  12. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  13. package/dist/components/sidebar/span-detail-merge.js +53 -0
  14. package/dist/components/trace-viewer/util/timing.d.ts +2 -2
  15. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  16. package/dist/components/trace-viewer/util/timing.js +3 -3
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +2 -2
  20. package/dist/lib/utils.d.ts +11 -0
  21. package/dist/lib/utils.d.ts.map +1 -1
  22. package/dist/lib/utils.js +49 -1
  23. package/package.json +3 -3
  24. package/src/components/new-trace-viewer/components/event-list.tsx +2 -2
  25. package/src/components/new-trace-viewer/components/timeline.tsx +7 -3
  26. package/src/components/sidebar/attribute-panel.tsx +7 -3
  27. package/src/components/sidebar/entity-detail-panel.tsx +28 -13
  28. package/src/components/sidebar/events-list.tsx +34 -25
  29. package/src/components/sidebar/span-detail-merge.ts +65 -0
  30. package/src/components/trace-viewer/util/timing.ts +2 -2
  31. package/src/index.ts +1 -0
  32. package/src/lib/utils.ts +57 -0
@@ -1,9 +1,11 @@
1
1
  import { type Event } from '@workflow/world';
2
- export declare function EventsList({ events, isLoading, error, onLoadEventData, encryptionKey, }: {
2
+ export declare function EventsList({ events, isLoading, error, onLoadEventData, onStreamClick, onRunClick, encryptionKey, }: {
3
3
  events: Event[];
4
4
  isLoading?: boolean;
5
5
  error?: Error | null;
6
6
  onLoadEventData?: (correlationId: string, eventId: string) => Promise<unknown | null>;
7
+ onStreamClick?: (streamId: string) => void;
8
+ onRunClick?: (runId: string) => void;
7
9
  /** When provided, signals that decryption is active (triggers re-load of expanded events) */
8
10
  encryptionKey?: Uint8Array;
9
11
  }): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA2PpE,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiB,EACjB,KAAK,EACL,eAAe,EACf,aAAa,GACd,EAAE;IACD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,6FAA6F;IAC7F,aAAa,CAAC,EAAE,UAAU,CAAC;CAC5B,2CA6CA"}
1
+ {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA4PpE,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiB,EACjB,KAAK,EACL,eAAe,EACf,aAAa,EACb,UAAU,EACV,aAAa,GACd,EAAE;IACD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,6FAA6F;IAC7F,aAAa,CAAC,EAAE,UAAU,CAAC;CAC5B,2CAiDA"}
@@ -3,6 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { EVENT_DATA_REF_FIELDS } from '@workflow/world';
4
4
  import { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';
5
5
  import { hasEncryptedFields, isExpiredMarker } from '../../lib/hydration';
6
+ import { RunClickContext, StreamClickContext } from '../ui/data-inspector';
6
7
  import { ErrorCard } from '../ui/error-card';
7
8
  import { ErrorStackBlock, isStructuredError } from '../ui/error-stack-block';
8
9
  import { Skeleton } from '../ui/skeleton';
@@ -144,13 +145,13 @@ function EventDataBlock({ eventType, data, }) {
144
145
  // generic JSON viewer.
145
146
  return _jsx(CopyableDataBlock, { data: data });
146
147
  }
147
- export function EventsList({ events, isLoading = false, error, onLoadEventData, encryptionKey, }) {
148
+ export function EventsList({ events, isLoading = false, error, onLoadEventData, onStreamClick, onRunClick, encryptionKey, }) {
148
149
  // Sort by createdAt
149
150
  const sortedEvents = useMemo(() => [...events].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()), [events]);
150
151
  const hasEvents = sortedEvents.length > 0 && !error;
151
152
  if (!hasEvents && !isLoading) {
152
153
  return _jsx(DetailCard, { summary: "Events", disabled: true });
153
154
  }
154
- return (_jsx(DetailCard, { summary: "Events", contentClassName: "mb-0", defaultOpen: true, children: isLoading ? (_jsx("div", { className: "flex flex-col -mx-4", children: [0, 1, 2].map((i) => (_jsxs("div", { className: "flex items-center justify-between gap-3 bg-background-200 px-4 py-2", children: [_jsx(Skeleton, { className: "h-4 w-32 rounded" }), _jsx(Skeleton, { className: "h-3 w-16 rounded" })] }, i))) })) : (_jsx("div", { className: "flex flex-col -mx-4", children: sortedEvents.map((event) => (_jsx(EventItem, { event: event, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey }, event.eventId))) })) }));
155
+ return (_jsx(RunClickContext.Provider, { value: onRunClick, children: _jsx(StreamClickContext.Provider, { value: onStreamClick, children: _jsx(DetailCard, { summary: "Events", contentClassName: "mb-0", defaultOpen: true, children: isLoading ? (_jsx("div", { className: "flex flex-col -mx-4", children: [0, 1, 2].map((i) => (_jsxs("div", { className: "flex items-center justify-between gap-3 bg-background-200 px-4 py-2", children: [_jsx(Skeleton, { className: "h-4 w-32 rounded" }), _jsx(Skeleton, { className: "h-3 w-16 rounded" })] }, i))) })) : (_jsx("div", { className: "flex flex-col -mx-4", children: sortedEvents.map((event) => (_jsx(EventItem, { event: event, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey }, event.eventId))) })) }) }) }));
155
156
  }
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyL2V2ZW50cy1saXN0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUFFLHFCQUFxQixFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7QUFFcEU7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQy9CLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLGVBQWU7SUFDZixjQUFjO0lBQ2QsZUFBZTtJQUNmLGFBQWE7SUFDYixlQUFlO0lBQ2YsWUFBWTtJQUNaLGNBQWM7SUFDZCxnQkFBZ0I7Q0FDakIsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxFQUNqQixLQUFLLEVBQ0wsZUFBZSxFQUNmLGFBQWEs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YUFFL0UsS0FBQyxRQUFRLElBQUMsU0FBUyxFQUFDLGtCQUFrQixHQUFHLEVBQ3pDLEtBQUMsUUFBUSxJQUFDLFNBQVMsRUFBQyxrQkFBa0IsR0FBRyxLQUpwQyxDQUFDLENBS0YsQ0FDUCxDQUFDLEdBQ0UsQ0FDUCxDQUFDLENBQUMsQ0FBQyxDQUNGLGNBQUssU0FBUyxFQUFDLHFCQUFxQixZQUNqQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUMzQixLQUFDLFNBQVMsSUFFUixLQUFLLEVBQUUsS0FBSyxFQUNaLGVBQWUsRUFBRSxlQUFlLEVBQ2hDLGFBQWEsRUFBRSxhQUFhLElBSHZCLEtBQUssQ0FBQyxPQUFPLENBSWxCLENBQ0gsQ0FBQyxHQUNFLENBQ1AsR0FDVSxDQUNkLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgeyBFVkVOVF9EQVRBX1JFRl9GSUVMRFMsIHR5cGUgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUxheW91dEVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGhhc0VuY3J5cHRlZEZpZWxkcywgaXNFeHBpcmVkTWFya2VyIH0gZnJvbSAnLi4vLi4vbGliL2h5ZHJhdGlvbic7XG5pbXBvcnQgeyBFcnJvckNhcmQgfSBmcm9tICcuLi91aS9lcnJvci1jYXJkJztcbmltcG9ydCB7IEVycm9yU3RhY2tCbG9jaywgaXNTdHJ1Y3R1cmVkRXJyb3IgfSBmcm9tICcuLi91aS9lcnJvci1zdGFjay1ibG9jayc7XG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gJy4uL3VpL3NrZWxldG9uJztcbmltcG9ydCB7IENvcHlhYmxlRGF0YUJsb2NrLCBFbmNyeXB0ZWREYXRhQmxvY2sgfSBmcm9tICcuL2NvcHlhYmxlLWRhdGEtYmxvY2snO1xuaW1wb3J0IHsgRGV0YWlsQ2FyZCB9IGZyb20gJy4vZGV0YWlsLWNhcmQnO1xuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHdob3NlIGV2ZW50RGF0YSBjb250YWlucyBhbiBlcnJvciBmaWVsZCB3aXRoIGEgU3RydWN0dXJlZEVycm9yLlxuICovXG5jb25zdCBFUlJPUl9FVkVOVF9UWVBFUyA9IG5ldyBTZXQoWydzdGVwX2ZhaWxlZCcsICdzdGVwX3JldHJ5aW5nJ10pO1xuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoYXQgY2FycnkgdXNlci1zZXJpYWxpemVkIGRhdGEgaW4gdGhlaXIgZXZlbnREYXRhIGZpZWxkLlxuICovXG5jb25zdCBEQVRBX0VWRU5UX1RZUEVTID0gbmV3IFNldChbXG4gICdzdGVwX2NyZWF0ZWQnLFxuICAnc3RlcF9jb21wbGV0ZWQnLFxuICAnc3RlcF9mYWlsZWQnLFxuICAnc3RlcF9yZXRyeWluZycsXG4gICdob29rX2NyZWF0ZWQnLFxuICAnaG9va19yZWNlaXZlZCcsXG4gICdydW5fY3JlYXRlZCcsXG4gICdydW5fY29tcGxldGVkJyxcbiAgJ3J1bl9mYWlsZWQnLFxuICAnd2FpdF9jcmVhdGVkJyxcbiAgJ3dhaXRfY29tcGxldGVkJyxcbl0pO1xuXG4vKipcbiAqIEEgc2luZ2xlIGV2ZW50IHJvdyB0aGF0IGNhbiBsYXp5LWxvYWQgaXRzIGV2ZW50RGF0YSB3aGVuIGV4cGFuZGVkLlxuICovXG5mdW5jdGlvbiBFdmVudEl0ZW0oe1xuICBldmVudCxcbiAgb25Mb2FkRXZlbnREYXRhLFxuICBlbmNyeXB0aW9uS2V5LFxufToge1xuICBldmVudDogRXZlbnQ7XG4gIG9uTG9hZEV2ZW50RGF0YT86IChcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmcsXG4gICAgZXZlbnRJZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gIC8qKiBXaGVuIHRoaXMgY2hhbmdlcyAoZS5nLiwgRGVjcnlwdCB3YXMgY2xpY2tlZCksIGludmFsaWRhdGUgY2FjaGVkIGRhdGEgKi9cbiAgZW5jcnlwdGlvbktleT86IFVpbnQ4QXJyYXk7XG59KSB7XG4gIGNvbnN0IFtsb2FkZWREYXRhLCBzZXRMb2FkZWREYXRhXSA9IHVzZVN0YXRlPHVua25vd24gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCB3YXNFeHBhbmRlZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIC8qKiBNaXJyb3JzIHdoZXRoZXIgd2UgaGF2ZSBhIGZldGNoZWQgcGF5bG9hZDsgYXZvaWRzIHN0YWxlIGBsb2FkZWREYXRhYCBpbiBsb2FkIGNsb3N1cmUuICovXG4gIGNvbnN0IGxvYWRlZERhdGFSZWYgPSB1c2VSZWY8dW5rbm93biB8IG51bGw+KG51bGwpO1xuXG4gIC8vIENoZWNrIGlmIHRoZSBldmVudCBhbHJlYWR5IGhhcyBldmVudERhdGEgZnJvbSB0aGUgc3RvcmVcbiAgY29uc3QgZXhpc3RpbmdEYXRhID1cbiAgICAnZXZlbnREYXRhJyBpbiBldmVudCAmJiBldmVudC5ldmVudERhdGEgIT0gbnVsbCA/IGV2ZW50LmV2ZW50RGF0YSA6IG51bGw7XG4gIGNvbnN0IG1lcmdlZERpc3BsYXkgPSBsb2FkZWREYXRhID8/IGV4aXN0aW5nRGF0YTtcbiAgY29uc3QgY2FuSGF2ZURhdGEgPSBEQVRBX0VWRU5UX1RZUEVTLmhhcyhldmVudC5ldmVudFR5cGUpO1xuXG4gIGNvbnN0IGxvYWRFdmVudERhdGEgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAob3B0aW9ucz86IHsgZm9yY2U/OiBib29sZWFuIH0pID0+IHtcbiAgICAgIGlmICghb25Mb2FkRXZlbnREYXRhIHx8ICFldmVudC5jb3JyZWxhdGlvbklkIHx8ICFldmVudC5ldmVudElkKSByZXR1cm47XG4gICAgICBpZiAoIW9wdGlvbnM/LmZvcmNlICYmIGxvYWRlZERhdGFSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0TG9hZEVycm9yKG51bGwpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgb25Mb2FkRXZlbnREYXRhKGV2ZW50LmNvcnJlbGF0aW9uSWQsIGV2ZW50LmV2ZW50SWQpO1xuICAgICAgICBsb2FkZWREYXRhUmVmLmN1cnJlbnQgPSBkYXRhO1xuICAgICAgICBzZXRMb2FkZWREYXRhKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNldExvYWRFcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtvbkxvYWRFdmVudERhdGEsIGV2ZW50LmNvcnJlbGF0aW9uSWQsIGV2ZW50LmV2ZW50SWRdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlRXhwYW5kID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc0xvYWRpbmcpIHJldHVybjtcbiAgICB3YXNFeHBhbmRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBhd2FpdCBsb2FkRXZlbnREYXRhKCk7XG4gIH0sIFtpc0xvYWRpbmcsIGxvYWRFdmVudERhdGFdKTtcblxuICAvLyBXaGVuIHRoZSBlbmNyeXB0aW9uIGtleSBjaGFuZ2VzIGFuZCB0aGlzIGV2ZW50IHdhcyBwcmV2aW91c2x5IGV4cGFuZGVkLFxuICAvLyByZS1sb2FkIHRoZSBkYXRhIHNvIGl0IGdldHMgZGVjcnlwdGVkXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmNyeXB0aW9uS2V5IHx8ICF3YXNFeHBhbmRlZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgbG9hZGVkRGF0YVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICBzZXRMb2FkZWREYXRhKG51bGwpO1xuICAgIHZvaWQgbG9hZEV2ZW50RGF0YSh7IGZvcmNlOiB0cnVlIH0pO1xuICB9LCBbZW5jcnlwdGlvbktleSwgbG9hZEV2ZW50RGF0YV0pO1xuXG4gIGNvbnN0IGNyZWF0ZWRBdCA9IG5ldyBEYXRlKGV2ZW50LmNyZWF0ZWRBdCk7XG4gIGNvbnN0IGNyZWF0ZWRBdFRpbWUgPSBjcmVhdGVkQXQudG9Mb2NhbGVUaW1lU3RyaW5nKHVuZGVmaW5lZCwge1xuICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgfSk7XG5cbiAgY29uc3QgZGlzcGxheVBheWxvYWQgPSBpc0xvYWRpbmcgPyBsb2FkZWREYXRhIDogbWVyZ2VkRGlzcGxheTtcblxuICByZXR1cm4gKFxuICAgIDxEZXRhaWxDYXJkXG4gICAgICB2YXJpYW50PVwiY2FyZFwiXG4gICAgICBzdW1tYXJ5Q2xhc3NOYW1lPVwicHgtMyBweS0yXCJcbiAgICAgIHN1bW1hcnk9e1xuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTNcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktMTAwMCB0ZXh0LWxhYmVsLTEyIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAge2V2ZW50LmV2ZW50VHlwZX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic2hyaW5rLTAgdGV4dC1sYWJlbC0xMyB0ZXh0LWdyYXktOTAwXCI+XG4gICAgICAgICAgICB7Y3JlYXRlZEF0VGltZX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgb25Ub2dnbGU9e1xuICAgICAgICBjYW5IYXZlRGF0YVxuICAgICAgICAgID8gKG9wZW4pID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9wZW4pIGhhbmRsZUV4cGFuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgPlxuICAgICAgey8qIEV2ZW50IGF0dHJpYnV0ZXMgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgYmctYmFja2dyb3VuZC0yMDAgWyY6aGFzKCtfKildOmJvcmRlci1iIFsmOmhhcygrXyopXTpib3JkZXItZ3JheS1hbHBoYS00MDBcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTIgcHktMiBweC0zXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sYWJlbC0xMiB0ZXh0LWdyYXktOTAwXCI+RXZlbnQgSUQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF4LXctWzcwJV0gdHJ1bmNhdGUgdGV4dC1yaWdodCB0ZXh0LWxhYmVsLTEyIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAge2V2ZW50LmV2ZW50SWR9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge2V2ZW50LmNvcnJlbGF0aW9uSWQgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHB5LTIgcHgtM1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sYWJlbC0xMiB0ZXh0LWdyYXktOTAwXCI+Q29ycmVsYXRpb24gSUQ8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXgtdy1bNzAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTIgZm9udC1tb25vXCI+XG4gICAgICAgICAgICAgIHtldmVudC5jb3JyZWxhdGlvbklkfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBMb2FkaW5nIHN0YXRlICovfVxuICAgICAge2lzTG9hZGluZyAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0zXCI+XG4gICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtNCB3LVszNSVdXCIgLz5cbiAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwibXQtMiBoLTQgdy1bOTAlXVwiIC8+XG4gICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cIm10LTIgaC00IHctWzc1JV1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG5cbiAgICAgIHsvKiBFcnJvciBzdGF0ZSAqL31cbiAgICAgIHtsb2FkRXJyb3IgJiYgKFxuICAgICAgICA8RXJyb3JDYXJkXG4gICAgICAgICAgdGl0bGU9XCJGYWlsZWQgdG8gbG9hZCBldmVudCBkYXRhXCJcbiAgICAgICAgICBkZXRhaWxzPXtsb2FkRXJyb3J9XG4gICAgICAgICAgY2xhc3NOYW1lPVwibXQtMlwiXG4gICAgICAgIC8+XG4gICAgICApfVxuXG4gICAgICB7LyogRXZlbnQgZGF0YSAqL31cbiAgICAgIHtkaXNwbGF5UGF5bG9hZCAhPSBudWxsICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJbJj5kaXZdOmJvcmRlci1ub25lIFsmPmRpdl06cm91bmRlZC1ub25lXCI+XG4gICAgICAgICAgPEV2ZW50RGF0YUJsb2NrIGV2ZW50VHlwZT17ZXZlbnQuZXZlbnRUeXBlfSBkYXRhPXtkaXNwbGF5UGF5bG9hZH0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvRGV0YWlsQ2FyZD5cbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBldmVudERhdGEgb2JqZWN0IGhhcyBvbmx5IGV4cGlyZWQgbWFya2VyIHZhbHVlcyBpbiByZWYvcGF5bG9hZFxuICogZmllbGRzIGZvciB0aGlzIGV2ZW50IHR5cGUgKHNlZSB7QGxpbmsgRVZFTlRfREFUQV9SRUZfRklFTERTfSkuIE90aGVyIGtleXNcbiAqIChlLmcuIGByZXN1bWVBdGAsIGBzdGVwTmFtZWApIGFyZSBpZ25vcmVkLlxuICovXG5mdW5jdGlvbiBoYXNPbmx5RXhwaXJlZEZpZWxkcyhkYXRhOiB1bmtub3duLCBldmVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByZWZLZXlzID0gRVZFTlRfREFUQV9SRUZfRklFTERTW2V2ZW50VHlwZV0gPz8gW107XG4gIGNvbnN0IHByZXNlbnRLZXlzID0gcmVmS2V5cy5maWx0ZXIoKGspID0+IGsgaW4gcmVjb3JkKTtcbiAgcmV0dXJuIChcbiAgICBwcmVzZW50S2V5cy5sZW5ndGggPiAwICYmXG4gICAgcHJlc2VudEtleXMuZXZlcnkoKGspID0+IGlzRXhwaXJlZE1hcmtlcihyZWNvcmRba10pKVxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgZXZlbnQgZGF0YSwgdXNpbmcgRXJyb3JTdGFja0Jsb2NrIGZvciBlcnJvciBldmVudHMgdGhhdCBjb250YWluIGFcbiAqIHN0cnVjdHVyZWQgZXJyb3IsIGFuZCBDb3B5YWJsZURhdGFCbG9jayBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIEV2ZW50RGF0YUJsb2NrKHtcbiAgZXZlbnRUeXBlLFxuICBkYXRhLFxufToge1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgZGF0YTogdW5rbm93bjtcbn0pIHtcbiAgLy8gRXhwaXJlZCBkYXRhIOKAlCBzaG93IGEgc2ltcGxlIG1lc3NhZ2UgaW5zdGVhZCBvZiB0aGUgcmF3IHN0dWIuXG4gIC8vIENoZWNrIGJvdGggdGhlIHRvcC1sZXZlbCBldmVudERhdGEgYW5kIG5lc3RlZCBzdWItZmllbGRzIChyZXN1bHQsIGlucHV0LCBldGMuKVxuICAvLyBzaW5jZSB0aGUgc2VydmVyIHN0dWJzIGVhY2ggcmVmIGZpZWxkIGluZGVwZW5kZW50bHkuXG4gIGlmIChpc0V4cGlyZWRNYXJrZXIoZGF0YSkgfHwgaGFzT25seUV4cGlyZWRGaWVsZHMoZGF0YSwgZXZlbnRUeXBlKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcm91bmRlZC1tZCBib3JkZXIgcHgtMyBweS0yIHRleHQteHNcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS0zMDApJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5EYXRhIGV4cGlyZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgaWYgKGhhc0VuY3J5cHRlZEZpZWxkcyh7IGV2ZW50VHlwZSwgZXZlbnREYXRhOiBkYXRhIH0pKSB7XG4gICAgcmV0dXJuIDxFbmNyeXB0ZWREYXRhQmxvY2sgLz47XG4gIH1cblxuICAvLyBGb3IgZXJyb3IgZXZlbnRzIChzdGVwX2ZhaWxlZCwgc3RlcF9yZXRyeWluZyksIHRoZSBldmVudERhdGEgaGFzIHRoZSBzaGFwZVxuICAvLyB7IGVycm9yOiBTdHJ1Y3R1cmVkRXJyb3IsIHN0YWNrPzogc3RyaW5nLCAuLi4gfS4gQ2hlY2sgYm90aCB0aGUgdG9wLWxldmVsXG4gIC8vIHZhbHVlIGFuZCB0aGUgbmVzdGVkIGBlcnJvcmAgZmllbGQgZm9yIGEgc3RhY2sgdHJhY2UuXG4gIGlmIChcbiAgICBFUlJPUl9FVkVOVF9UWVBFUy5oYXMoZXZlbnRUeXBlKSAmJlxuICAgIGRhdGEgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0J1xuICApIHtcbiAgICBjb25zdCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gQ2hlY2sgdGhlIG5lc3RlZCBgZXJyb3JgIGZpZWxkIGZpcnN0ICh0aGUgU3RydWN0dXJlZEVycm9yKVxuICAgIGlmIChpc1N0cnVjdHVyZWRFcnJvcihyZWNvcmQuZXJyb3IpKSB7XG4gICAgICByZXR1cm4gPEVycm9yU3RhY2tCbG9jayB2YWx1ZT17cmVjb3JkLmVycm9yfSAvPjtcbiAgICB9XG5cbiAgICAvLyBTb21lIGVycm9yIGZvcm1hdHMgcHV0IHRoZSBtZXNzYWdlL3N0YWNrIGF0IHRoZSB0b3AgbGV2ZWwgb2YgZXZlbnREYXRhLlxuICAgIGlmIChpc1N0cnVjdHVyZWRFcnJvcihyZWNvcmQpKSB7XG4gICAgICByZXR1cm4gPEVycm9yU3RhY2tCbG9jayB2YWx1ZT17cmVjb3JkfSAvPjtcbiAgICB9XG4gIH1cblxuICAvLyBGb3Igbm9uLWVycm9yIGV2ZW50cyBvciBlcnJvcnMgd2l0aG91dCBhIHN0YWNrLCBmYWxsIGJhY2sgdG8gdGhlXG4gIC8vIGdlbmVyaWMgSlNPTiB2aWV3ZXIuXG4gIHJldHVybiA8Q29weWFibGVEYXRhQmxvY2sgZGF0YT17ZGF0YX0gLz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBFdmVudHNMaXN0KHtcbiAgZXZlbnRzLFxuICBpc0xvYWRpbmcgPSBmYWxzZSxcbiAgZXJyb3IsXG4gIG9uTG9hZEV2ZW50RGF0YSxcbiAgZW5jcnlwdGlvbktleSxcbn06IHtcbiAgZXZlbnRzOiBFdmVudFtdO1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICBlcnJvcj86IEVycm9yIHwgbnVsbDtcbiAgb25Mb2FkRXZlbnREYXRhPzogKFxuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgICBldmVudElkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPHVua25vd24gfCBudWxsPjtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHNpZ25hbHMgdGhhdCBkZWNyeXB0aW9uIGlzIGFjdGl2ZSAodHJpZ2dlcnMgcmUtbG9hZCBvZiBleHBhbmRlZCBldmVudHMpICovXG4gIGVuY3J5cHRpb25LZXk/OiBVaW50OEFycmF5O1xufSkge1xuICAvLyBTb3J0IGJ5IGNyZWF0ZWRBdFxuICBjb25zdCBzb3J0ZWRFdmVudHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBbLi4uZXZlbnRzXS5zb3J0KFxuICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICBuZXcgRGF0ZShhLmNyZWF0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYi5jcmVhdGVkQXQpLmdldFRpbWUoKVxuICAgICAgKSxcbiAgICBbZXZlbnRzXVxuICApO1xuXG4gIGNvbnN0IGhhc0V2ZW50cyA9IHNvcnRlZEV2ZW50cy5sZW5ndGggPiAwICYmICFlcnJvcjtcblxuICBpZiAoIWhhc0V2ZW50cyAmJiAhaXNMb2FkaW5nKSB7XG4gICAgcmV0dXJuIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJFdmVudHNcIiBkaXNhYmxlZCAvPjtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkV2ZW50c1wiIGNvbnRlbnRDbGFzc05hbWU9XCJtYi0wXCIgZGVmYXVsdE9wZW4+XG4gICAgICB7aXNMb2FkaW5nID8gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgLW14LTRcIj5cbiAgICAgICAgICB7WzAsIDEsIDJdLm1hcCgoaSkgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMyBiZy1iYWNrZ3JvdW5kLTIwMCBweC00IHB5LTJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC00IHctMzIgcm91bmRlZFwiIC8+XG4gICAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTMgdy0xNiByb3VuZGVkXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCAtbXgtNFwiPlxuICAgICAgICAgIHtzb3J0ZWRFdmVudHMubWFwKChldmVudCkgPT4gKFxuICAgICAgICAgICAgPEV2ZW50SXRlbVxuICAgICAgICAgICAgICBrZXk9e2V2ZW50LmV2ZW50SWR9XG4gICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAgb25Mb2FkRXZlbnREYXRhPXtvbkxvYWRFdmVudERhdGF9XG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXk9e2VuY3J5cHRpb25LZXl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9EZXRhaWxDYXJkPlxuICApO1xufVxuIl19
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyL2V2ZW50cy1saXN0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUFFLHFCQUFxQixFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBRXBFOztHQUVHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixlQUFlO0lBQ2YsY0FBYztJQUNkLGVBQWU7SUFDZixhQUFhO0lBQ2IsZUFBZTtJQUNmLFlBQVk7SUFDWixjQUFjO0lBQ2QsZ0JBQWdCO0NBQ2pCLENBQUMsQ0FBQztBQUVIOztH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LFdBQVcsa0JBQzdELFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDWCxjQUFLLFNBQVMsRUFBQyxxQkFBcUIsWUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDcEIsZUFFRSxTQUFTLEVBQUMscUVBQXFFLGFBRS9FLEtBQUMsUUFBUSxJQUFDLFNBQVMsRUFBQyxrQkFBa0IsR0FBRyxFQUN6QyxLQUFDLFFBQVEsSUFBQyxTQUFTLEVBQUMsa0JBQWtCLEdBQUcsS0FKcEMsQ0FBQyxDQUtGLENBQ1AsQ0FBQyxHQUNFLENBQ1AsQ0FBQyxDQUFDLENBQUMsQ0FDRixjQUFLLFNBQVMsRUFBQyxxQkFBcUIsWUFDakMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FDM0IsS0FBQyxTQUFTLElBRVIsS0FBSyxFQUFFLEtBQUssRUFDWixlQUFlLEVBQUUsZUFBZSxFQUNoQyxhQUFhLEVBQUUsYUFBYSxJQUh2QixLQUFLLENBQUMsT0FBTyxDQUlsQixDQUNILENBQUMsR0FDRSxDQUNQLEdBQ1UsR0FDZSxHQUNMLENBQzVCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgeyBFVkVOVF9EQVRBX1JFRl9GSUVMRFMsIHR5cGUgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUxheW91dEVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGhhc0VuY3J5cHRlZEZpZWxkcywgaXNFeHBpcmVkTWFya2VyIH0gZnJvbSAnLi4vLi4vbGliL2h5ZHJhdGlvbic7XG5pbXBvcnQgeyBSdW5DbGlja0NvbnRleHQsIFN0cmVhbUNsaWNrQ29udGV4dCB9IGZyb20gJy4uL3VpL2RhdGEtaW5zcGVjdG9yJztcbmltcG9ydCB7IEVycm9yQ2FyZCB9IGZyb20gJy4uL3VpL2Vycm9yLWNhcmQnO1xuaW1wb3J0IHsgRXJyb3JTdGFja0Jsb2NrLCBpc1N0cnVjdHVyZWRFcnJvciB9IGZyb20gJy4uL3VpL2Vycm9yLXN0YWNrLWJsb2NrJztcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSAnLi4vdWkvc2tlbGV0b24nO1xuaW1wb3J0IHsgQ29weWFibGVEYXRhQmxvY2ssIEVuY3J5cHRlZERhdGFCbG9jayB9IGZyb20gJy4vY29weWFibGUtZGF0YS1ibG9jayc7XG5pbXBvcnQgeyBEZXRhaWxDYXJkIH0gZnJvbSAnLi9kZXRhaWwtY2FyZCc7XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgd2hvc2UgZXZlbnREYXRhIGNvbnRhaW5zIGFuIGVycm9yIGZpZWxkIHdpdGggYSBTdHJ1Y3R1cmVkRXJyb3IuXG4gKi9cbmNvbnN0IEVSUk9SX0VWRU5UX1RZUEVTID0gbmV3IFNldChbJ3N0ZXBfZmFpbGVkJywgJ3N0ZXBfcmV0cnlpbmcnXSk7XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgdGhhdCBjYXJyeSB1c2VyLXNlcmlhbGl6ZWQgZGF0YSBpbiB0aGVpciBldmVudERhdGEgZmllbGQuXG4gKi9cbmNvbnN0IERBVEFfRVZFTlRfVFlQRVMgPSBuZXcgU2V0KFtcbiAgJ3N0ZXBfY3JlYXRlZCcsXG4gICdzdGVwX2NvbXBsZXRlZCcsXG4gICdzdGVwX2ZhaWxlZCcsXG4gICdzdGVwX3JldHJ5aW5nJyxcbiAgJ2hvb2tfY3JlYXRlZCcsXG4gICdob29rX3JlY2VpdmVkJyxcbiAgJ3J1bl9jcmVhdGVkJyxcbiAgJ3J1bl9jb21wbGV0ZWQnLFxuICAncnVuX2ZhaWxlZCcsXG4gICd3YWl0X2NyZWF0ZWQnLFxuICAnd2FpdF9jb21wbGV0ZWQnLFxuXSk7XG5cbi8qKlxuICogQSBzaW5nbGUgZXZlbnQgcm93IHRoYXQgY2FuIGxhenktbG9hZCBpdHMgZXZlbnREYXRhIHdoZW4gZXhwYW5kZWQuXG4gKi9cbmZ1bmN0aW9uIEV2ZW50SXRlbSh7XG4gIGV2ZW50LFxuICBvbkxvYWRFdmVudERhdGEsXG4gIGVuY3J5cHRpb25LZXksXG59OiB7XG4gIGV2ZW50OiBFdmVudDtcbiAgb25Mb2FkRXZlbnREYXRhPzogKFxuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgICBldmVudElkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPHVua25vd24gfCBudWxsPjtcbiAgLyoqIFdoZW4gdGhpcyBjaGFuZ2VzIChlLmcuLCBEZWNyeXB0IHdhcyBjbGlja2VkKSwgaW52YWxpZGF0ZSBjYWNoZWQgZGF0YSAqL1xuICBlbmNyeXB0aW9uS2V5PzogVWludDhBcnJheTtcbn0pIHtcbiAgY29uc3QgW2xvYWRlZERhdGEsIHNldExvYWRlZERhdGFdID0gdXNlU3RhdGU8dW5rbm93biB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbbG9hZEVycm9yLCBzZXRMb2FkRXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHdhc0V4cGFuZGVkUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgLyoqIE1pcnJvcnMgd2hldGhlciB3ZSBoYXZlIGEgZmV0Y2hlZCBwYXlsb2FkOyBhdm9pZHMgc3RhbGUgYGxvYWRlZERhdGFgIGluIGxvYWQgY2xvc3VyZS4gKi9cbiAgY29uc3QgbG9hZGVkRGF0YVJlZiA9IHVzZVJlZjx1bmtub3duIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IGFscmVhZHkgaGFzIGV2ZW50RGF0YSBmcm9tIHRoZSBzdG9yZVxuICBjb25zdCBleGlzdGluZ0RhdGEgPVxuICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmIGV2ZW50LmV2ZW50RGF0YSAhPSBudWxsID8gZXZlbnQuZXZlbnREYXRhIDogbnVsbDtcbiAgY29uc3QgbWVyZ2VkRGlzcGxheSA9IGxvYWRlZERhdGEgPz8gZXhpc3RpbmdEYXRhO1xuICBjb25zdCBjYW5IYXZlRGF0YSA9IERBVEFfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSk7XG5cbiAgY29uc3QgbG9hZEV2ZW50RGF0YSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChvcHRpb25zPzogeyBmb3JjZT86IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgaWYgKCFvbkxvYWRFdmVudERhdGEgfHwgIWV2ZW50LmNvcnJlbGF0aW9uSWQgfHwgIWV2ZW50LmV2ZW50SWQpIHJldHVybjtcbiAgICAgIGlmICghb3B0aW9ucz8uZm9yY2UgJiYgbG9hZGVkRGF0YVJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRMb2FkRXJyb3IobnVsbCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBvbkxvYWRFdmVudERhdGEoZXZlbnQuY29ycmVsYXRpb25JZCwgZXZlbnQuZXZlbnRJZCk7XG4gICAgICAgIGxvYWRlZERhdGFSZWYuY3VycmVudCA9IGRhdGE7XG4gICAgICAgIHNldExvYWRlZERhdGEoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0TG9hZEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW29uTG9hZEV2ZW50RGF0YSwgZXZlbnQuY29ycmVsYXRpb25JZCwgZXZlbnQuZXZlbnRJZF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVFeHBhbmQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzTG9hZGluZykgcmV0dXJuO1xuICAgIHdhc0V4cGFuZGVkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIGF3YWl0IGxvYWRFdmVudERhdGEoKTtcbiAgfSwgW2lzTG9hZGluZywgbG9hZEV2ZW50RGF0YV0pO1xuXG4gIC8vIFdoZW4gdGhlIGVuY3J5cHRpb24ga2V5IGNoYW5nZXMgYW5kIHRoaXMgZXZlbnQgd2FzIHByZXZpb3VzbHkgZXhwYW5kZWQsXG4gIC8vIHJlLWxvYWQgdGhlIGRhdGEgc28gaXQgZ2V0cyBkZWNyeXB0ZWRcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuY3J5cHRpb25LZXkgfHwgIXdhc0V4cGFuZGVkUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBsb2FkZWREYXRhUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIHNldExvYWRlZERhdGEobnVsbCk7XG4gICAgdm9pZCBsb2FkRXZlbnREYXRhKHsgZm9yY2U6IHRydWUgfSk7XG4gIH0sIFtlbmNyeXB0aW9uS2V5LCBsb2FkRXZlbnREYXRhXSk7XG5cbiAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUoZXZlbnQuY3JlYXRlZEF0KTtcbiAgY29uc3QgY3JlYXRlZEF0VGltZSA9IGNyZWF0ZWRBdC50b0xvY2FsZVRpbWVTdHJpbmcodW5kZWZpbmVkLCB7XG4gICAgaG91cjogJ251bWVyaWMnLFxuICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgIHNlY29uZDogJ251bWVyaWMnLFxuICB9KTtcblxuICBjb25zdCBkaXNwbGF5UGF5bG9hZCA9IGlzTG9hZGluZyA/IGxvYWRlZERhdGEgOiBtZXJnZWREaXNwbGF5O1xuXG4gIHJldHVybiAoXG4gICAgPERldGFpbENhcmRcbiAgICAgIHZhcmlhbnQ9XCJjYXJkXCJcbiAgICAgIHN1bW1hcnlDbGFzc05hbWU9XCJweC0zIHB5LTJcIlxuICAgICAgc3VtbWFyeT17XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtM1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtZ3JheS0xMDAwIHRleHQtbGFiZWwtMTIgZm9udC1tb25vXCI+XG4gICAgICAgICAgICB7ZXZlbnQuZXZlbnRUeXBlfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzaHJpbmstMCB0ZXh0LWxhYmVsLTEzIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgIHtjcmVhdGVkQXRUaW1lfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBvblRvZ2dsZT17XG4gICAgICAgIGNhbkhhdmVEYXRhXG4gICAgICAgICAgPyAob3BlbikgPT4ge1xuICAgICAgICAgICAgICBpZiAob3BlbikgaGFuZGxlRXhwYW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICA+XG4gICAgICB7LyogRXZlbnQgYXR0cmlidXRlcyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBiZy1iYWNrZ3JvdW5kLTIwMCBbJjpoYXMoK18qKV06Ym9yZGVyLWIgWyY6aGFzKCtfKildOmJvcmRlci1ncmF5LWFscGhhLTQwMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMiBweS0yIHB4LTNcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTEyIHRleHQtZ3JheS05MDBcIj5FdmVudCBJRDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXgtdy1bNzAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTIgZm9udC1tb25vXCI+XG4gICAgICAgICAgICB7ZXZlbnQuZXZlbnRJZH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7ZXZlbnQuY29ycmVsYXRpb25JZCAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTIgcHktMiBweC0zXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTEyIHRleHQtZ3JheS05MDBcIj5Db3JyZWxhdGlvbiBJRDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1heC13LVs3MCVdIHRydW5jYXRlIHRleHQtcmlnaHQgdGV4dC1sYWJlbC0xMiBmb250LW1vbm9cIj5cbiAgICAgICAgICAgICAge2V2ZW50LmNvcnJlbGF0aW9uSWR9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIExvYWRpbmcgc3RhdGUgKi99XG4gICAgICB7aXNMb2FkaW5nICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTNcIj5cbiAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC00IHctWzM1JV1cIiAvPlxuICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJtdC0yIGgtNCB3LVs5MCVdXCIgLz5cbiAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwibXQtMiBoLTQgdy1bNzUlXVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgey8qIEVycm9yIHN0YXRlICovfVxuICAgICAge2xvYWRFcnJvciAmJiAoXG4gICAgICAgIDxFcnJvckNhcmRcbiAgICAgICAgICB0aXRsZT1cIkZhaWxlZCB0byBsb2FkIGV2ZW50IGRhdGFcIlxuICAgICAgICAgIGRldGFpbHM9e2xvYWRFcnJvcn1cbiAgICAgICAgICBjbGFzc05hbWU9XCJtdC0yXCJcbiAgICAgICAgLz5cbiAgICAgICl9XG5cbiAgICAgIHsvKiBFdmVudCBkYXRhICovfVxuICAgICAge2Rpc3BsYXlQYXlsb2FkICE9IG51bGwgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIlsmPmRpdl06Ym9yZGVyLW5vbmUgWyY+ZGl2XTpyb3VuZGVkLW5vbmVcIj5cbiAgICAgICAgICA8RXZlbnREYXRhQmxvY2sgZXZlbnRUeXBlPXtldmVudC5ldmVudFR5cGV9IGRhdGE9e2Rpc3BsYXlQYXlsb2FkfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9EZXRhaWxDYXJkPlxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGV2ZW50RGF0YSBvYmplY3QgaGFzIG9ubHkgZXhwaXJlZCBtYXJrZXIgdmFsdWVzIGluIHJlZi9wYXlsb2FkXG4gKiBmaWVsZHMgZm9yIHRoaXMgZXZlbnQgdHlwZSAoc2VlIHtAbGluayBFVkVOVF9EQVRBX1JFRl9GSUVMRFN9KS4gT3RoZXIga2V5c1xuICogKGUuZy4gYHJlc3VtZUF0YCwgYHN0ZXBOYW1lYCkgYXJlIGlnbm9yZWQuXG4gKi9cbmZ1bmN0aW9uIGhhc09ubHlFeHBpcmVkRmllbGRzKGRhdGE6IHVua25vd24sIGV2ZW50VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlY29yZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHJlZktleXMgPSBFVkVOVF9EQVRBX1JFRl9GSUVMRFNbZXZlbnRUeXBlXSA/PyBbXTtcbiAgY29uc3QgcHJlc2VudEtleXMgPSByZWZLZXlzLmZpbHRlcigoaykgPT4gayBpbiByZWNvcmQpO1xuICByZXR1cm4gKFxuICAgIHByZXNlbnRLZXlzLmxlbmd0aCA+IDAgJiZcbiAgICBwcmVzZW50S2V5cy5ldmVyeSgoaykgPT4gaXNFeHBpcmVkTWFya2VyKHJlY29yZFtrXSkpXG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVycyBldmVudCBkYXRhLCB1c2luZyBFcnJvclN0YWNrQmxvY2sgZm9yIGVycm9yIGV2ZW50cyB0aGF0IGNvbnRhaW4gYVxuICogc3RydWN0dXJlZCBlcnJvciwgYW5kIENvcHlhYmxlRGF0YUJsb2NrIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gRXZlbnREYXRhQmxvY2soe1xuICBldmVudFR5cGUsXG4gIGRhdGEsXG59OiB7XG4gIGV2ZW50VHlwZTogc3RyaW5nO1xuICBkYXRhOiB1bmtub3duO1xufSkge1xuICAvLyBFeHBpcmVkIGRhdGEg4oCUIHNob3cgYSBzaW1wbGUgbWVzc2FnZSBpbnN0ZWFkIG9mIHRoZSByYXcgc3R1Yi5cbiAgLy8gQ2hlY2sgYm90aCB0aGUgdG9wLWxldmVsIGV2ZW50RGF0YSBhbmQgbmVzdGVkIHN1Yi1maWVsZHMgKHJlc3VsdCwgaW5wdXQsIGV0Yy4pXG4gIC8vIHNpbmNlIHRoZSBzZXJ2ZXIgc3R1YnMgZWFjaCByZWYgZmllbGQgaW5kZXBlbmRlbnRseS5cbiAgaWYgKGlzRXhwaXJlZE1hcmtlcihkYXRhKSB8fCBoYXNPbmx5RXhwaXJlZEZpZWxkcyhkYXRhLCBldmVudFR5cGUpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSByb3VuZGVkLW1kIGJvcmRlciBweC0zIHB5LTIgdGV4dC14c1wiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTMwMCknLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPkRhdGEgZXhwaXJlZDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBpZiAoaGFzRW5jcnlwdGVkRmllbGRzKHsgZXZlbnRUeXBlLCBldmVudERhdGE6IGRhdGEgfSkpIHtcbiAgICByZXR1cm4gPEVuY3J5cHRlZERhdGFCbG9jayAvPjtcbiAgfVxuXG4gIC8vIEZvciBlcnJvciBldmVudHMgKHN0ZXBfZmFpbGVkLCBzdGVwX3JldHJ5aW5nKSwgdGhlIGV2ZW50RGF0YSBoYXMgdGhlIHNoYXBlXG4gIC8vIHsgZXJyb3I6IFN0cnVjdHVyZWRFcnJvciwgc3RhY2s/OiBzdHJpbmcsIC4uLiB9LiBDaGVjayBib3RoIHRoZSB0b3AtbGV2ZWxcbiAgLy8gdmFsdWUgYW5kIHRoZSBuZXN0ZWQgYGVycm9yYCBmaWVsZCBmb3IgYSBzdGFjayB0cmFjZS5cbiAgaWYgKFxuICAgIEVSUk9SX0VWRU5UX1RZUEVTLmhhcyhldmVudFR5cGUpICYmXG4gICAgZGF0YSAhPSBudWxsICYmXG4gICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnXG4gICkge1xuICAgIGNvbnN0IHJlY29yZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBDaGVjayB0aGUgbmVzdGVkIGBlcnJvcmAgZmllbGQgZmlyc3QgKHRoZSBTdHJ1Y3R1cmVkRXJyb3IpXG4gICAgaWYgKGlzU3RydWN0dXJlZEVycm9yKHJlY29yZC5lcnJvcikpIHtcbiAgICAgIHJldHVybiA8RXJyb3JTdGFja0Jsb2NrIHZhbHVlPXtyZWNvcmQuZXJyb3J9IC8+O1xuICAgIH1cblxuICAgIC8vIFNvbWUgZXJyb3IgZm9ybWF0cyBwdXQgdGhlIG1lc3NhZ2Uvc3RhY2sgYXQgdGhlIHRvcCBsZXZlbCBvZiBldmVudERhdGEuXG4gICAgaWYgKGlzU3RydWN0dXJlZEVycm9yKHJlY29yZCkpIHtcbiAgICAgIHJldHVybiA8RXJyb3JTdGFja0Jsb2NrIHZhbHVlPXtyZWNvcmR9IC8+O1xuICAgIH1cbiAgfVxuXG4gIC8vIEZvciBub24tZXJyb3IgZXZlbnRzIG9yIGVycm9ycyB3aXRob3V0IGEgc3RhY2ssIGZhbGwgYmFjayB0byB0aGVcbiAgLy8gZ2VuZXJpYyBKU09OIHZpZXdlci5cbiAgcmV0dXJuIDxDb3B5YWJsZURhdGFCbG9jayBkYXRhPXtkYXRhfSAvPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50c0xpc3Qoe1xuICBldmVudHMsXG4gIGlzTG9hZGluZyA9IGZhbHNlLFxuICBlcnJvcixcbiAgb25Mb2FkRXZlbnREYXRhLFxuICBvblN0cmVhbUNsaWNrLFxuICBvblJ1bkNsaWNrLFxuICBlbmNyeXB0aW9uS2V5LFxufToge1xuICBldmVudHM6IEV2ZW50W107XG4gIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIGVycm9yPzogRXJyb3IgfCBudWxsO1xuICBvbkxvYWRFdmVudERhdGE/OiAoXG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nLFxuICAgIGV2ZW50SWQ6IHN0cmluZ1xuICApID0+IFByb21pc2U8dW5rbm93biB8IG51bGw+O1xuICBvblN0cmVhbUNsaWNrPzogKHN0cmVhbUlkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uUnVuQ2xpY2s/OiAocnVuSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHNpZ25hbHMgdGhhdCBkZWNyeXB0aW9uIGlzIGFjdGl2ZSAodHJpZ2dlcnMgcmUtbG9hZCBvZiBleHBhbmRlZCBldmVudHMpICovXG4gIGVuY3J5cHRpb25LZXk/OiBVaW50OEFycmF5O1xufSkge1xuICAvLyBTb3J0IGJ5IGNyZWF0ZWRBdFxuICBjb25zdCBzb3J0ZWRFdmVudHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBbLi4uZXZlbnRzXS5zb3J0KFxuICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICBuZXcgRGF0ZShhLmNyZWF0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYi5jcmVhdGVkQXQpLmdldFRpbWUoKVxuICAgICAgKSxcbiAgICBbZXZlbnRzXVxuICApO1xuXG4gIGNvbnN0IGhhc0V2ZW50cyA9IHNvcnRlZEV2ZW50cy5sZW5ndGggPiAwICYmICFlcnJvcjtcblxuICBpZiAoIWhhc0V2ZW50cyAmJiAhaXNMb2FkaW5nKSB7XG4gICAgcmV0dXJuIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJFdmVudHNcIiBkaXNhYmxlZCAvPjtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFJ1bkNsaWNrQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17b25SdW5DbGlja30+XG4gICAgICA8U3RyZWFtQ2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtvblN0cmVhbUNsaWNrfT5cbiAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkV2ZW50c1wiIGNvbnRlbnRDbGFzc05hbWU9XCJtYi0wXCIgZGVmYXVsdE9wZW4+XG4gICAgICAgICAge2lzTG9hZGluZyA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCAtbXgtNFwiPlxuICAgICAgICAgICAgICB7WzAsIDEsIDJdLm1hcCgoaSkgPT4gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMyBiZy1iYWNrZ3JvdW5kLTIwMCBweC00IHB5LTJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTQgdy0zMiByb3VuZGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTMgdy0xNiByb3VuZGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIC1teC00XCI+XG4gICAgICAgICAgICAgIHtzb3J0ZWRFdmVudHMubWFwKChldmVudCkgPT4gKFxuICAgICAgICAgICAgICAgIDxFdmVudEl0ZW1cbiAgICAgICAgICAgICAgICAgIGtleT17ZXZlbnQuZXZlbnRJZH1cbiAgICAgICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAgICAgIG9uTG9hZEV2ZW50RGF0YT17b25Mb2FkRXZlbnREYXRhfVxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleT17ZW5jcnlwdGlvbktleX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgIDwvU3RyZWFtQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvUnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuIl19
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Returns true when the fetched `detail` belongs to the current selection.
3
+ * The fetch lags selection, so it can briefly hold a previously selected span
4
+ * (even a different resource type); reject it before merging or its fields
5
+ * union into the wrong panel. Steps/hooks/waits carry their parent `runId`, so
6
+ * a `run` selection excludes objects identifiable as a child resource.
7
+ */
8
+ export declare function spanDetailMatchesSelection(detail: unknown, resource: string | undefined, resourceId: string | undefined): boolean;
9
+ /**
10
+ * Merges fetched `detail` over the span's own data. The detail supplies the
11
+ * heavy fields the trace strips (input/output/error/metadata, sleep resumeAt);
12
+ * the span's identity, status, and event-derived timestamps stay authoritative
13
+ * so they don't flicker to the backend row's millisecond-different values.
14
+ */
15
+ export declare function mergeSpanDetail(spanData: unknown, detail: unknown): unknown;
16
+ //# sourceMappingURL=span-detail-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-detail-merge.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/span-detail-merge.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAsBT;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAkB3E"}
@@ -0,0 +1,53 @@
1
+ const hasField = (value, key) => key in value;
2
+ /**
3
+ * Returns true when the fetched `detail` belongs to the current selection.
4
+ * The fetch lags selection, so it can briefly hold a previously selected span
5
+ * (even a different resource type); reject it before merging or its fields
6
+ * union into the wrong panel. Steps/hooks/waits carry their parent `runId`, so
7
+ * a `run` selection excludes objects identifiable as a child resource.
8
+ */
9
+ export function spanDetailMatchesSelection(detail, resource, resourceId) {
10
+ if (!detail || typeof detail !== 'object' || !resource || !resourceId) {
11
+ return false;
12
+ }
13
+ switch (resource) {
14
+ case 'step':
15
+ return hasField(detail, 'stepId') && detail.stepId === resourceId;
16
+ case 'hook':
17
+ return hasField(detail, 'hookId') && detail.hookId === resourceId;
18
+ case 'sleep':
19
+ return hasField(detail, 'waitId') && detail.waitId === resourceId;
20
+ case 'run':
21
+ return (hasField(detail, 'runId') &&
22
+ !('stepId' in detail) &&
23
+ !('hookId' in detail) &&
24
+ !('waitId' in detail) &&
25
+ detail.runId === resourceId);
26
+ default:
27
+ return false;
28
+ }
29
+ }
30
+ /**
31
+ * Merges fetched `detail` over the span's own data. The detail supplies the
32
+ * heavy fields the trace strips (input/output/error/metadata, sleep resumeAt);
33
+ * the span's identity, status, and event-derived timestamps stay authoritative
34
+ * so they don't flicker to the backend row's millisecond-different values.
35
+ */
36
+ export function mergeSpanDetail(spanData, detail) {
37
+ if (!detail || typeof detail !== 'object') {
38
+ return spanData;
39
+ }
40
+ if (!spanData || typeof spanData !== 'object') {
41
+ return detail;
42
+ }
43
+ // Skip `undefined` span fields so they don't clobber a value the detail
44
+ // legitimately provides (e.g. a step's optional startedAt).
45
+ const merged = { ...detail };
46
+ for (const [key, value] of Object.entries(spanData)) {
47
+ if (value !== undefined) {
48
+ merged[key] = value;
49
+ }
50
+ }
51
+ return merged;
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhbi1kZXRhaWwtbWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyL3NwYW4tZGV0YWlsLW1lcmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sUUFBUSxHQUFHLENBQ2YsS0FBYSxFQUNiLEdBQVcsRUFDdUIsRUFBRSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7QUFFcEQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUN4QyxNQUFlLEVBQ2YsUUFBNEIsRUFDNUIsVUFBOEI7SUFFOUIsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssTUFBTTtZQUNULE9BQU8sUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQztRQUNwRSxLQUFLLE1BQU07WUFDVCxPQUFPLFFBQVEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUM7UUFDcEUsS0FBSyxPQUFPO1lBQ1YsT0FBTyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDO1FBQ3BFLEtBQUssS0FBSztZQUNSLE9BQU8sQ0FDTCxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztnQkFDekIsQ0FBQyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7Z0JBQ3JCLENBQUMsQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDO2dCQUNyQixDQUFDLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQztnQkFDckIsTUFBTSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQzVCLENBQUM7UUFDSjtZQUNFLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFFBQWlCLEVBQUUsTUFBZTtJQUNoRSxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRCx3RUFBd0U7SUFDeEUsNERBQTREO0lBQzVELE1BQU0sTUFBTSxHQUE0QixFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDdEQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQ3ZDLFFBQW1DLENBQ3BDLEVBQUUsQ0FBQztRQUNGLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaGFzRmllbGQgPSAoXG4gIHZhbHVlOiBvYmplY3QsXG4gIGtleTogc3RyaW5nXG4pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiBrZXkgaW4gdmFsdWU7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIGZldGNoZWQgYGRldGFpbGAgYmVsb25ncyB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gKiBUaGUgZmV0Y2ggbGFncyBzZWxlY3Rpb24sIHNvIGl0IGNhbiBicmllZmx5IGhvbGQgYSBwcmV2aW91c2x5IHNlbGVjdGVkIHNwYW5cbiAqIChldmVuIGEgZGlmZmVyZW50IHJlc291cmNlIHR5cGUpOyByZWplY3QgaXQgYmVmb3JlIG1lcmdpbmcgb3IgaXRzIGZpZWxkc1xuICogdW5pb24gaW50byB0aGUgd3JvbmcgcGFuZWwuIFN0ZXBzL2hvb2tzL3dhaXRzIGNhcnJ5IHRoZWlyIHBhcmVudCBgcnVuSWRgLCBzb1xuICogYSBgcnVuYCBzZWxlY3Rpb24gZXhjbHVkZXMgb2JqZWN0cyBpZGVudGlmaWFibGUgYXMgYSBjaGlsZCByZXNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYW5EZXRhaWxNYXRjaGVzU2VsZWN0aW9uKFxuICBkZXRhaWw6IHVua25vd24sXG4gIHJlc291cmNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHJlc291cmNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghZGV0YWlsIHx8IHR5cGVvZiBkZXRhaWwgIT09ICdvYmplY3QnIHx8ICFyZXNvdXJjZSB8fCAhcmVzb3VyY2VJZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzd2l0Y2ggKHJlc291cmNlKSB7XG4gICAgY2FzZSAnc3RlcCc6XG4gICAgICByZXR1cm4gaGFzRmllbGQoZGV0YWlsLCAnc3RlcElkJykgJiYgZGV0YWlsLnN0ZXBJZCA9PT0gcmVzb3VyY2VJZDtcbiAgICBjYXNlICdob29rJzpcbiAgICAgIHJldHVybiBoYXNGaWVsZChkZXRhaWwsICdob29rSWQnKSAmJiBkZXRhaWwuaG9va0lkID09PSByZXNvdXJjZUlkO1xuICAgIGNhc2UgJ3NsZWVwJzpcbiAgICAgIHJldHVybiBoYXNGaWVsZChkZXRhaWwsICd3YWl0SWQnKSAmJiBkZXRhaWwud2FpdElkID09PSByZXNvdXJjZUlkO1xuICAgIGNhc2UgJ3J1bic6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBoYXNGaWVsZChkZXRhaWwsICdydW5JZCcpICYmXG4gICAgICAgICEoJ3N0ZXBJZCcgaW4gZGV0YWlsKSAmJlxuICAgICAgICAhKCdob29rSWQnIGluIGRldGFpbCkgJiZcbiAgICAgICAgISgnd2FpdElkJyBpbiBkZXRhaWwpICYmXG4gICAgICAgIGRldGFpbC5ydW5JZCA9PT0gcmVzb3VyY2VJZFxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogTWVyZ2VzIGZldGNoZWQgYGRldGFpbGAgb3ZlciB0aGUgc3BhbidzIG93biBkYXRhLiBUaGUgZGV0YWlsIHN1cHBsaWVzIHRoZVxuICogaGVhdnkgZmllbGRzIHRoZSB0cmFjZSBzdHJpcHMgKGlucHV0L291dHB1dC9lcnJvci9tZXRhZGF0YSwgc2xlZXAgcmVzdW1lQXQpO1xuICogdGhlIHNwYW4ncyBpZGVudGl0eSwgc3RhdHVzLCBhbmQgZXZlbnQtZGVyaXZlZCB0aW1lc3RhbXBzIHN0YXkgYXV0aG9yaXRhdGl2ZVxuICogc28gdGhleSBkb24ndCBmbGlja2VyIHRvIHRoZSBiYWNrZW5kIHJvdydzIG1pbGxpc2Vjb25kLWRpZmZlcmVudCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVNwYW5EZXRhaWwoc3BhbkRhdGE6IHVua25vd24sIGRldGFpbDogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoIWRldGFpbCB8fCB0eXBlb2YgZGV0YWlsICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBzcGFuRGF0YTtcbiAgfVxuICBpZiAoIXNwYW5EYXRhIHx8IHR5cGVvZiBzcGFuRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZGV0YWlsO1xuICB9XG4gIC8vIFNraXAgYHVuZGVmaW5lZGAgc3BhbiBmaWVsZHMgc28gdGhleSBkb24ndCBjbG9iYmVyIGEgdmFsdWUgdGhlIGRldGFpbFxuICAvLyBsZWdpdGltYXRlbHkgcHJvdmlkZXMgKGUuZy4gYSBzdGVwJ3Mgb3B0aW9uYWwgc3RhcnRlZEF0KS5cbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uZGV0YWlsIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIHNwYW5EYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVyZ2VkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlZDtcbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
- import { formatDuration } from '../../../lib/utils';
2
- export { formatDuration };
1
+ import { formatDuration, formatDurationPrecise } from '../../../lib/utils';
2
+ export { formatDuration, formatDurationPrecise };
3
3
  export declare function getHighResInMs([seconds, nanoseconds]: [
4
4
  number,
5
5
  number
@@ -1 +1 @@
1
- {"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/util/timing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,wBAAgB,cAAc,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE;IACrD,MAAM;IACN,MAAM;CACP,GAAG,MAAM,CAET;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE3D;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GAAI,IAAI,MAAM,KAAG,MAC7B,CAAC;AAE3B,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM3D"}
1
+ {"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/util/timing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,CAAC;AAEjD,wBAAgB,cAAc,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE;IACrD,MAAM;IACN,MAAM;CACP,GAAG,MAAM,CAET;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE3D;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GAAI,IAAI,MAAM,KAAG,MAC7B,CAAC;AAE3B,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM3D"}
@@ -1,5 +1,5 @@
1
- import { formatDuration } from '../../../lib/utils';
2
- export { formatDuration };
1
+ import { formatDuration, formatDurationPrecise } from '../../../lib/utils';
2
+ export { formatDuration, formatDurationPrecise };
3
3
  export function getHighResInMs([seconds, nanoseconds]) {
4
4
  return seconds * 1000 + nanoseconds / 1e6;
5
5
  }
@@ -29,4 +29,4 @@ export function formatWallClockTime(epochMs) {
29
29
  const s = String(d.getSeconds()).padStart(2, '0');
30
30
  return `${h}:${m}:${s}`;
31
31
  }
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHJhY2Utdmlld2VyL3V0aWwvdGltaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFFMUIsTUFBTSxVQUFVLGNBQWMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBR25EO0lBQ0MsT0FBTyxPQUFPLEdBQUcsSUFBSSxHQUFHLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsRUFBVTtJQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsRUFBVSxFQUFVLEVBQUUsQ0FDOUQsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUUzQixNQUFNLFVBQVUsbUJBQW1CLENBQUMsRUFBVTtJQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLElBQUksU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3JCLE9BQU8sR0FBRyxTQUFTLElBQUksQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFlO0lBQ2pELE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2xpYi91dGlscyc7XG5cbmV4cG9ydCB7IGZvcm1hdER1cmF0aW9uIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIaWdoUmVzSW5Ncyhbc2Vjb25kcywgbmFub3NlY29uZHNdOiBbXG4gIG51bWJlcixcbiAgbnVtYmVyLFxuXSk6IG51bWJlciB7XG4gIHJldHVybiBzZWNvbmRzICogMTAwMCArIG5hbm9zZWNvbmRzIC8gMWU2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TXNJbkhpZ2hSZXMobXM6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICByZXR1cm4gW01hdGguZmxvb3IobXMgLyAxMDAwKSwgKG1zICUgMTAwMCkgKiAxMDAwXTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIGEgZHVyYXRpb24gZm9yIHRpbWVsaW5lIGRpc3BsYXkgKGNvbXBhY3QgZm9ybWF0KS5cbiAqIEBkZXByZWNhdGVkIFVzZSBmb3JtYXREdXJhdGlvbihtcywgdHJ1ZSkgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdER1cmF0aW9uRm9yVGltZWxpbmUgPSAobXM6IG51bWJlcik6IHN0cmluZyA9PlxuICBmb3JtYXREdXJhdGlvbihtcywgdHJ1ZSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUaW1lU2VsZWN0aW9uKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCByb3VuZGVkTXMgPSBNYXRoLnJvdW5kKG1zKTtcbiAgaWYgKHJvdW5kZWRNcyA8IDEwMDApIHtcbiAgICByZXR1cm4gYCR7cm91bmRlZE1zfW1zYDtcbiAgfVxuICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIDEwMDApfXNgO1xufVxuXG4vKipcbiAqIEZvcm1hdCBhbiBlcG9jaC1taWxsaXNlY29uZCB0aW1lc3RhbXAgYXMgYSBsb2NhbCB3YWxsLWNsb2NrIHRpbWUuXG4gKiBSZXR1cm5zIGEgY29tcGFjdCBISDpNTTpTUy5tbW0gc3RyaW5nICgyNC1ob3VyIGZvcm1hdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRXYWxsQ2xvY2tUaW1lKGVwb2NoTXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZShlcG9jaE1zKTtcbiAgY29uc3QgaCA9IFN0cmluZyhkLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IG0gPSBTdHJpbmcoZC5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IHMgPSBTdHJpbmcoZC5nZXRTZWNvbmRzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIHJldHVybiBgJHtofToke219OiR7c31gO1xufVxuIl19
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHJhY2Utdmlld2VyL3V0aWwvdGltaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLENBQUM7QUFFakQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBR25EO0lBQ0MsT0FBTyxPQUFPLEdBQUcsSUFBSSxHQUFHLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsRUFBVTtJQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsRUFBVSxFQUFVLEVBQUUsQ0FDOUQsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUUzQixNQUFNLFVBQVUsbUJBQW1CLENBQUMsRUFBVTtJQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLElBQUksU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3JCLE9BQU8sR0FBRyxTQUFTLElBQUksQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFlO0lBQ2pELE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXREdXJhdGlvbiwgZm9ybWF0RHVyYXRpb25QcmVjaXNlIH0gZnJvbSAnLi4vLi4vLi4vbGliL3V0aWxzJztcblxuZXhwb3J0IHsgZm9ybWF0RHVyYXRpb24sIGZvcm1hdER1cmF0aW9uUHJlY2lzZSB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGlnaFJlc0luTXMoW3NlY29uZHMsIG5hbm9zZWNvbmRzXTogW1xuICBudW1iZXIsXG4gIG51bWJlcixcbl0pOiBudW1iZXIge1xuICByZXR1cm4gc2Vjb25kcyAqIDEwMDAgKyBuYW5vc2Vjb25kcyAvIDFlNjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1zSW5IaWdoUmVzKG1zOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgcmV0dXJuIFtNYXRoLmZsb29yKG1zIC8gMTAwMCksIChtcyAlIDEwMDApICogMTAwMF07XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIGR1cmF0aW9uIGZvciB0aW1lbGluZSBkaXNwbGF5IChjb21wYWN0IGZvcm1hdCkuXG4gKiBAZGVwcmVjYXRlZCBVc2UgZm9ybWF0RHVyYXRpb24obXMsIHRydWUpIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXREdXJhdGlvbkZvclRpbWVsaW5lID0gKG1zOiBudW1iZXIpOiBzdHJpbmcgPT5cbiAgZm9ybWF0RHVyYXRpb24obXMsIHRydWUpO1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGltZVNlbGVjdGlvbihtczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgcm91bmRlZE1zID0gTWF0aC5yb3VuZChtcyk7XG4gIGlmIChyb3VuZGVkTXMgPCAxMDAwKSB7XG4gICAgcmV0dXJuIGAke3JvdW5kZWRNc31tc2A7XG4gIH1cbiAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyAxMDAwKX1zYDtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYW4gZXBvY2gtbWlsbGlzZWNvbmQgdGltZXN0YW1wIGFzIGEgbG9jYWwgd2FsbC1jbG9jayB0aW1lLlxuICogUmV0dXJucyBhIGNvbXBhY3QgSEg6TU06U1MubW1tIHN0cmluZyAoMjQtaG91ciBmb3JtYXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0V2FsbENsb2NrVGltZShlcG9jaE1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBkID0gbmV3IERhdGUoZXBvY2hNcyk7XG4gIGNvbnN0IGggPSBTdHJpbmcoZC5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBtID0gU3RyaW5nKGQuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBzID0gU3RyaW5nKGQuZ2V0U2Vjb25kcygpKS5wYWRTdGFydCgyLCAnMCcpO1xuICByZXR1cm4gYCR7aH06JHttfToke3N9YDtcbn1cbiJdfQ==
package/dist/index.d.ts CHANGED
@@ -14,5 +14,5 @@ export type { DecodedStreamChunkSource } from './lib/stream-display';
14
14
  export type { ToastAdapter } from './lib/toast';
15
15
  export { ToastProvider, useToast } from './lib/toast';
16
16
  export type { StreamStep } from './lib/utils';
17
- export { extractConversation, formatDuration, identifyStreamSteps, isDoStreamStep, } from './lib/utils';
17
+ export { extractConversation, formatDuration, formatDurationPrecise, identifyStreamSteps, isDoStreamStep, } from './lib/utils';
18
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EACb,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtE,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sDAAsD,CAAC;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EACb,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtE,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sDAAsD,CAAC;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -6,5 +6,5 @@ export { analyzeEvents, hasPendingHooksFromEvents, hasPendingStepsFromEvents, is
6
6
  export { materializeAll, materializeHooks, materializeSteps, materializeWaits, } from './lib/event-materialization';
7
7
  export { CLASS_INSTANCE_REF_TYPE, ClassInstanceRef, ENCRYPTED_PLACEHOLDER, extractStreamIds, getWebRevivers, hasEncryptedFields, hydrateResourceIO, hydrateResourceIOWithKey, isClassInstanceRef, isEncryptedMarker, isStreamId, isStreamRef, STREAM_REF_TYPE, truncateId, } from './lib/hydration';
8
8
  export { ToastProvider, useToast } from './lib/toast';
9
- export { extractConversation, formatDuration, identifyStreamSteps, isDoStreamStep, } from './lib/utils';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsR0FDbEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixzQkFBc0IsR0FDdkIsTUFBTSxzREFBc0QsQ0FBQztBQUU5RCxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLDhCQUE4QixHQUkvQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIseUJBQXlCLEdBQzFCLE1BQU0sc0JBQXNCLENBQUM7QUFPOUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YsVUFBVSxHQUNYLE1BQU0saUJBQWlCLENBQUM7QUFHekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdEQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLGNBQWMsR0FDZixNQUFNLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHtcbiAgSGVhbHRoQ2hlY2tFbmRwb2ludCxcbiAgSGVhbHRoQ2hlY2tSZXN1bHQsXG59IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuZXhwb3J0IHtcbiAgcGFyc2VTdGVwTmFtZSxcbiAgcGFyc2VXb3JrZmxvd05hbWUsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmV4cG9ydCB0eXBlIHsgRXZlbnQsIEhvb2ssIFN0ZXAsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cyc7XG5leHBvcnQge1xuICBob29rRXZlbnRzVG9Ib29rRW50aXR5LFxuICBzdGVwRXZlbnRzVG9TdGVwRW50aXR5LFxuICB3YWl0RXZlbnRzVG9XYWl0RW50aXR5LFxufSBmcm9tICcuL2NvbXBvbmVudHMvd29ya2Zsb3ctdHJhY2VzL3RyYWNlLXNwYW4tY29uc3RydWN0aW9uJztcbmV4cG9ydCB0eXBlIHsgRXZlbnRBbmFseXNpcyB9IGZyb20gJy4vbGliL2V2ZW50LWFuYWx5c2lzJztcbmV4cG9ydCB7XG4gIHBhcnNlRXhhY3RXb3JrZmxvd1NlYXJjaElkLFxuICBsb29rc0xpa2VXb3JrZmxvd0lkU2VhcmNoSW5wdXQsXG4gIHR5cGUgRXhhY3RXb3JrZmxvd1NlYXJjaElkLFxuICB0eXBlIEV4YWN0V29ya2Zsb3dTZWFyY2hJZEtpbmQsXG4gIHR5cGUgRXhhY3RJZFNlYXJjaFJlc3VsdCxcbn0gZnJvbSAnLi9saWIvZXhhY3QtZXZlbnQtc2VhcmNoLWlkJztcbmV4cG9ydCB7XG4gIGFuYWx5emVFdmVudHMsXG4gIGhhc1BlbmRpbmdIb29rc0Zyb21FdmVudHMsXG4gIGhhc1BlbmRpbmdTdGVwc0Zyb21FdmVudHMsXG4gIGlzVGVybWluYWxTdGF0dXMsXG4gIHNob3VsZFNob3dSZWVucXVldWVCdXR0b24sXG59IGZyb20gJy4vbGliL2V2ZW50LWFuYWx5c2lzJztcbmV4cG9ydCB0eXBlIHtcbiAgTWF0ZXJpYWxpemVkRW50aXRpZXMsXG4gIE1hdGVyaWFsaXplZEhvb2ssXG4gIE1hdGVyaWFsaXplZFN0ZXAsXG4gIE1hdGVyaWFsaXplZFdhaXQsXG59IGZyb20gJy4vbGliL2V2ZW50LW1hdGVyaWFsaXphdGlvbic7XG5leHBvcnQge1xuICBtYXRlcmlhbGl6ZUFsbCxcbiAgbWF0ZXJpYWxpemVIb29rcyxcbiAgbWF0ZXJpYWxpemVTdGVwcyxcbiAgbWF0ZXJpYWxpemVXYWl0cyxcbn0gZnJvbSAnLi9saWIvZXZlbnQtbWF0ZXJpYWxpemF0aW9uJztcbmV4cG9ydCB0eXBlIHsgUmV2aXZlcnMsIFN0cmVhbVJlZiB9IGZyb20gJy4vbGliL2h5ZHJhdGlvbic7XG5leHBvcnQge1xuICBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSxcbiAgQ2xhc3NJbnN0YW5jZVJlZixcbiAgRU5DUllQVEVEX1BMQUNFSE9MREVSLFxuICBleHRyYWN0U3RyZWFtSWRzLFxuICBnZXRXZWJSZXZpdmVycyxcbiAgaGFzRW5jcnlwdGVkRmllbGRzLFxuICBoeWRyYXRlUmVzb3VyY2VJTyxcbiAgaHlkcmF0ZVJlc291cmNlSU9XaXRoS2V5LFxuICBpc0NsYXNzSW5zdGFuY2VSZWYsXG4gIGlzRW5jcnlwdGVkTWFya2VyLFxuICBpc1N0cmVhbUlkLFxuICBpc1N0cmVhbVJlZixcbiAgU1RSRUFNX1JFRl9UWVBFLFxuICB0cnVuY2F0ZUlkLFxufSBmcm9tICcuL2xpYi9oeWRyYXRpb24nO1xuZXhwb3J0IHR5cGUgeyBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2UgfSBmcm9tICcuL2xpYi9zdHJlYW0tZGlzcGxheSc7XG5leHBvcnQgdHlwZSB7IFRvYXN0QWRhcHRlciB9IGZyb20gJy4vbGliL3RvYXN0JztcbmV4cG9ydCB7IFRvYXN0UHJvdmlkZXIsIHVzZVRvYXN0IH0gZnJvbSAnLi9saWIvdG9hc3QnO1xuZXhwb3J0IHR5cGUgeyBTdHJlYW1TdGVwIH0gZnJvbSAnLi9saWIvdXRpbHMnO1xuZXhwb3J0IHtcbiAgZXh0cmFjdENvbnZlcnNhdGlvbixcbiAgZm9ybWF0RHVyYXRpb24sXG4gIGlkZW50aWZ5U3RyZWFtU3RlcHMsXG4gIGlzRG9TdHJlYW1TdGVwLFxufSBmcm9tICcuL2xpYi91dGlscyc7XG4iXX0=
9
+ export { extractConversation, formatDuration, formatDurationPrecise, identifyStreamSteps, isDoStreamStep, } from './lib/utils';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsR0FDbEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixzQkFBc0IsR0FDdkIsTUFBTSxzREFBc0QsQ0FBQztBQUU5RCxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLDhCQUE4QixHQUkvQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIseUJBQXlCLEdBQzFCLE1BQU0sc0JBQXNCLENBQUM7QUFPOUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YsVUFBVSxHQUNYLE1BQU0saUJBQWlCLENBQUM7QUFHekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdEQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixjQUFjLEdBQ2YsTUFBTSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7XG4gIEhlYWx0aENoZWNrRW5kcG9pbnQsXG4gIEhlYWx0aENoZWNrUmVzdWx0LFxufSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lJztcbmV4cG9ydCB7XG4gIHBhcnNlU3RlcE5hbWUsXG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5leHBvcnQgdHlwZSB7IEV2ZW50LCBIb29rLCBTdGVwLCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMnO1xuZXhwb3J0IHtcbiAgaG9va0V2ZW50c1RvSG9va0VudGl0eSxcbiAgc3RlcEV2ZW50c1RvU3RlcEVudGl0eSxcbiAgd2FpdEV2ZW50c1RvV2FpdEVudGl0eSxcbn0gZnJvbSAnLi9jb21wb25lbnRzL3dvcmtmbG93LXRyYWNlcy90cmFjZS1zcGFuLWNvbnN0cnVjdGlvbic7XG5leHBvcnQgdHlwZSB7IEV2ZW50QW5hbHlzaXMgfSBmcm9tICcuL2xpYi9ldmVudC1hbmFseXNpcyc7XG5leHBvcnQge1xuICBwYXJzZUV4YWN0V29ya2Zsb3dTZWFyY2hJZCxcbiAgbG9va3NMaWtlV29ya2Zsb3dJZFNlYXJjaElucHV0LFxuICB0eXBlIEV4YWN0V29ya2Zsb3dTZWFyY2hJZCxcbiAgdHlwZSBFeGFjdFdvcmtmbG93U2VhcmNoSWRLaW5kLFxuICB0eXBlIEV4YWN0SWRTZWFyY2hSZXN1bHQsXG59IGZyb20gJy4vbGliL2V4YWN0LWV2ZW50LXNlYXJjaC1pZCc7XG5leHBvcnQge1xuICBhbmFseXplRXZlbnRzLFxuICBoYXNQZW5kaW5nSG9va3NGcm9tRXZlbnRzLFxuICBoYXNQZW5kaW5nU3RlcHNGcm9tRXZlbnRzLFxuICBpc1Rlcm1pbmFsU3RhdHVzLFxuICBzaG91bGRTaG93UmVlbnF1ZXVlQnV0dG9uLFxufSBmcm9tICcuL2xpYi9ldmVudC1hbmFseXNpcyc7XG5leHBvcnQgdHlwZSB7XG4gIE1hdGVyaWFsaXplZEVudGl0aWVzLFxuICBNYXRlcmlhbGl6ZWRIb29rLFxuICBNYXRlcmlhbGl6ZWRTdGVwLFxuICBNYXRlcmlhbGl6ZWRXYWl0LFxufSBmcm9tICcuL2xpYi9ldmVudC1tYXRlcmlhbGl6YXRpb24nO1xuZXhwb3J0IHtcbiAgbWF0ZXJpYWxpemVBbGwsXG4gIG1hdGVyaWFsaXplSG9va3MsXG4gIG1hdGVyaWFsaXplU3RlcHMsXG4gIG1hdGVyaWFsaXplV2FpdHMsXG59IGZyb20gJy4vbGliL2V2ZW50LW1hdGVyaWFsaXphdGlvbic7XG5leHBvcnQgdHlwZSB7IFJldml2ZXJzLCBTdHJlYW1SZWYgfSBmcm9tICcuL2xpYi9oeWRyYXRpb24nO1xuZXhwb3J0IHtcbiAgQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEUsXG4gIENsYXNzSW5zdGFuY2VSZWYsXG4gIEVOQ1JZUFRFRF9QTEFDRUhPTERFUixcbiAgZXh0cmFjdFN0cmVhbUlkcyxcbiAgZ2V0V2ViUmV2aXZlcnMsXG4gIGhhc0VuY3J5cHRlZEZpZWxkcyxcbiAgaHlkcmF0ZVJlc291cmNlSU8sXG4gIGh5ZHJhdGVSZXNvdXJjZUlPV2l0aEtleSxcbiAgaXNDbGFzc0luc3RhbmNlUmVmLFxuICBpc0VuY3J5cHRlZE1hcmtlcixcbiAgaXNTdHJlYW1JZCxcbiAgaXNTdHJlYW1SZWYsXG4gIFNUUkVBTV9SRUZfVFlQRSxcbiAgdHJ1bmNhdGVJZCxcbn0gZnJvbSAnLi9saWIvaHlkcmF0aW9uJztcbmV4cG9ydCB0eXBlIHsgRGVjb2RlZFN0cmVhbUNodW5rU291cmNlIH0gZnJvbSAnLi9saWIvc3RyZWFtLWRpc3BsYXknO1xuZXhwb3J0IHR5cGUgeyBUb2FzdEFkYXB0ZXIgfSBmcm9tICcuL2xpYi90b2FzdCc7XG5leHBvcnQgeyBUb2FzdFByb3ZpZGVyLCB1c2VUb2FzdCB9IGZyb20gJy4vbGliL3RvYXN0JztcbmV4cG9ydCB0eXBlIHsgU3RyZWFtU3RlcCB9IGZyb20gJy4vbGliL3V0aWxzJztcbmV4cG9ydCB7XG4gIGV4dHJhY3RDb252ZXJzYXRpb24sXG4gIGZvcm1hdER1cmF0aW9uLFxuICBmb3JtYXREdXJhdGlvblByZWNpc2UsXG4gIGlkZW50aWZ5U3RyZWFtU3RlcHMsXG4gIGlzRG9TdHJlYW1TdGVwLFxufSBmcm9tICcuL2xpYi91dGlscyc7XG4iXX0=
@@ -21,6 +21,17 @@ export declare function cn(...inputs: ClassValue[]): string;
21
21
  * - >= 1m: shows decomposed format with whole seconds (e.g., "1m 13s", "2m 13s")
22
22
  */
23
23
  export declare function formatDuration(ms: number, compact?: boolean): string;
24
+ /**
25
+ * Formats a duration in milliseconds without snapping to whole seconds.
26
+ *
27
+ * Unlike {@link formatDuration}, this never rounds a sub-minute value up to
28
+ * the next whole second (e.g. 1626ms renders as "1.63s", not "2s").
29
+ *
30
+ * - < 1s: shows whole milliseconds (e.g. "626ms")
31
+ * - 1s – 1m: shows seconds with two decimals (e.g. "1.63s", "45.20s")
32
+ * - >= 1m: decomposes into d/h/m with two-decimal seconds (e.g. "1m 13.45s")
33
+ */
34
+ export declare function formatDurationPrecise(ms: number): string;
24
35
  /**
25
36
  * Returns a formatted pagination display string
26
37
  * @param currentPage - The current page number
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAC;AAG7C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC;AAOD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,CAgDlE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,GACf,MAAM,CAKR;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,GAAG,YAAY,EAAE,GAAG,IAAI,CAmB7E;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAc/D"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAC;AAG7C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC;AAOD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,CAgDlE;AAUD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAqCxD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,GACf,MAAM,CAKR;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,GAAG,YAAY,EAAE,GAAG,IAAI,CAmB7E;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAc/D"}
package/dist/lib/utils.js CHANGED
@@ -66,6 +66,54 @@ export function formatDuration(ms, compact = false) {
66
66
  parts.push(`${seconds}s`);
67
67
  return parts.join(' ');
68
68
  }
69
+ // Locale-aware formatter that always renders exactly two fraction digits.
70
+ // Used for the seconds component of precise durations so values are never
71
+ // snapped to a whole second (and thousands separators stay correct).
72
+ const preciseSecondsFormatter = new Intl.NumberFormat(undefined, {
73
+ minimumFractionDigits: 2,
74
+ maximumFractionDigits: 2,
75
+ });
76
+ /**
77
+ * Formats a duration in milliseconds without snapping to whole seconds.
78
+ *
79
+ * Unlike {@link formatDuration}, this never rounds a sub-minute value up to
80
+ * the next whole second (e.g. 1626ms renders as "1.63s", not "2s").
81
+ *
82
+ * - < 1s: shows whole milliseconds (e.g. "626ms")
83
+ * - 1s – 1m: shows seconds with two decimals (e.g. "1.63s", "45.20s")
84
+ * - >= 1m: decomposes into d/h/m with two-decimal seconds (e.g. "1m 13.45s")
85
+ */
86
+ export function formatDurationPrecise(ms) {
87
+ if (ms === 0) {
88
+ return '0s';
89
+ }
90
+ if (ms < MS_IN_SECOND) {
91
+ const roundedMs = Math.round(ms);
92
+ if (roundedMs < MS_IN_SECOND) {
93
+ return `${roundedMs}ms`;
94
+ }
95
+ }
96
+ const normalizedMs = Math.round(ms / 10) * 10;
97
+ if (normalizedMs < MS_IN_MINUTE) {
98
+ return `${preciseSecondsFormatter.format(normalizedMs / MS_IN_SECOND)}s`;
99
+ }
100
+ const days = Math.floor(normalizedMs / MS_IN_DAY);
101
+ const hours = Math.floor((normalizedMs % MS_IN_DAY) / MS_IN_HOUR);
102
+ const minutes = Math.floor((normalizedMs % MS_IN_HOUR) / MS_IN_MINUTE);
103
+ const seconds = (normalizedMs % MS_IN_MINUTE) / MS_IN_SECOND;
104
+ const parts = [];
105
+ if (days > 0) {
106
+ parts.push(`${days}d`);
107
+ }
108
+ if (hours > 0) {
109
+ parts.push(`${hours}h`);
110
+ }
111
+ if (minutes > 0) {
112
+ parts.push(`${minutes}m`);
113
+ }
114
+ parts.push(`${preciseSecondsFormatter.format(seconds)}s`);
115
+ return parts.join(' ');
116
+ }
69
117
  /**
70
118
  * Returns a formatted pagination display string
71
119
  * @param currentPage - The current page number
@@ -124,4 +172,4 @@ export function identifyStreamSteps(steps) {
124
172
  };
125
173
  });
126
174
  }
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBbUIsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLFVBQVUsRUFBRSxDQUFDLEdBQUcsTUFBb0I7SUFDeEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEVBQVUsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUN4RCxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakMsT0FBTyxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztJQUUvRCxJQUFJLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUM3QixPQUFPLEdBQUcsSUFB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O0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdGVwIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgTW9kZWxNZXNzYWdlIH0gZnJvbSAnYWknO1xuaW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyB0d01lcmdlIH0gZnJvbSAndGFpbHdpbmQtbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gY24oLi4uaW5wdXRzOiBDbGFzc1ZhbHVlW10pIHtcbiAgcmV0dXJuIHR3TWVyZ2UoY2xzeChpbnB1dHMpKTtcbn1cblxuY29uc3QgTVNfSU5fU0VDT05EID0gMTAwMDtcbmNvbnN0IE1TX0lOX01JTlVURSA9IDYwICogTVNfSU5fU0VDT05EO1xuY29uc3QgTVNfSU5fSE9VUiA9IDYwICogTVNfSU5fTUlOVVRFO1xuY29uc3QgTVNfSU5fREFZID0gMjQgKiBNU19JTl9IT1VSO1xuXG4vKipcbiAqIEZvcm1hdHMgYSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgdG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIG1zIC0gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gY29tcGFjdCAtIElmIHRydWUsIHJldHVybnMgYSBjb21wYWN0IGZvcm1hdCAoZS5nLiwgXCIzODBtc1wiLCBcIjJtIDMwc1wiKS5cbiAqICAgICAgICAgICAgICAgICAgSWYgZmFsc2UgKGRlZmF1bHQpLCByZXR1cm5zIG11bHRpLXBhcnQgZm9ybWF0IChlLmcuLCBcIjFtIDEzc1wiLCBcIjJkIDVoIDNtIDEyc1wiKS5cbiAqXG4gKiBDb21wYWN0IGZvcm1hdCAodGltZWxpbmUgbWFya2Vycyk6XG4gKiAtIDwgMXM6IHNob3dzIG1pbGxpc2Vjb25kcyAoZS5nLiwgXCIzODBtc1wiKVxuICogLSA8IDFtOiBzaG93cyBzZWNvbmRzIChlLmcuLCBcIjQ1c1wiKVxuICogLSA8IDFoOiBzaG93cyBtaW51dGVzIGFuZCBzZWNvbmRzIChlLmcuLCBcIjJtIDMwc1wiKVxuICogLSA+PSAxaDogc2hvd3MgaG91cnMgYW5kIG1pbnV0ZXMgKGUuZy4sIFwiMmggMzBtXCIpXG4gKlxuICogRnVsbCBmb3JtYXQ6XG4gKiAtIDwgMXM6IHNob3dzIG1pbGxpc2Vjb25kcyAoZS5nLiwgXCIzODBtc1wiKVxuICogLSA8IDFtOiBzaG93cyBzZWNvbmRzIChlLmcuLCBcIjQ1c1wiKVxuICogLSA+PSAxbTogc2hvd3MgZGVjb21wb3NlZCBmb3JtYXQgd2l0aCB3aG9sZSBzZWNvbmRzIChlLmcuLCBcIjFtIDEzc1wiLCBcIjJtIDEzc1wiKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24obXM6IG51bWJlciwgY29tcGFjdCA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKG1zID09PSAwKSB7XG4gICAgcmV0dXJuICcwcyc7XG4gIH1cblxuICBpZiAobXMgPCBNU19JTl9TRUNPTkQpIHtcbiAgICBjb25zdCByb3VuZGVkTXMgPSBNYXRoLnJvdW5kKG1zKTtcbiAgICByZXR1cm4gcm91bmRlZE1zIDwgTVNfSU5fU0VDT05EID8gYCR7cm91bmRlZE1zfW1zYCA6ICcxcyc7XG4gIH1cblxuICBjb25zdCByb3VuZGVkTXMgPSBNYXRoLnJvdW5kKG1zIC8gTVNfSU5fU0VDT05EKSAqIE1TX0lOX1NFQ09ORDtcblxuICBpZiAocm91bmRlZE1zIDwgTVNfSU5fTUlOVVRFKSB7XG4gICAgcmV0dXJuIGAke01hdGguZmxvb3Iocm91bmRlZE1zIC8gTVNfSU5fU0VDT05EKX1zYDtcbiAgfVxuXG4gIC8vIENvbXBhY3QgZm9ybWF0OiBtdWx0aS11bml0IHdpdGhvdXQgZGVjaW1hbHMgKGUuZy4gXCI4bSAyMHNcIiwgXCIyaCAzMG1cIilcbiAgaWYgKGNvbXBhY3QpIHtcbiAgICBpZiAocm91bmRlZE1zIDwgTVNfSU5fSE9VUikge1xuICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3Iocm91bmRlZE1zIC8gTVNfSU5fTUlOVVRFKTtcbiAgICAgIGNvbnN0IHMgPSBNYXRoLmZsb29yKChyb3VuZGVkTXMgJSBNU19JTl9NSU5VVEUpIC8gTVNfSU5fU0VDT05EKTtcbiAgICAgIHJldHVybiBzID4gMCA/IGAke219bSAke3N9c2AgOiBgJHttfW1gO1xuICAgIH1cbiAgICBjb25zdCBoID0gTWF0aC5mbG9vcihyb3VuZGVkTXMgLyBNU19JTl9IT1VSKTtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fSE9VUikgLyBNU19JTl9NSU5VVEUpO1xuICAgIHJldHVybiBtID4gMCA/IGAke2h9aCAke219bWAgOiBgJHtofWhgO1xuICB9XG5cbiAgLy8gRnVsbCBmb3JtYXQ6IGRlY29tcG9zZSBpbnRvIGxhcmdlciB1bml0cyArIHdob2xlIHNlY29uZHMuXG4gIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHJvdW5kZWRNcyAvIE1TX0lOX0RBWSk7XG4gIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fREFZKSAvIE1TX0lOX0hPVVIpO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fSE9VUikgLyBNU19JTl9NSU5VVEUpO1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fTUlOVVRFKSAvIE1TX0lOX1NFQ09ORCk7XG5cbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGRheXMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHtkYXlzfWRgKTtcbiAgfVxuICBpZiAoaG91cnMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHtob3Vyc31oYCk7XG4gIH1cbiAgaWYgKG1pbnV0ZXMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHttaW51dGVzfW1gKTtcbiAgfVxuICBwYXJ0cy5wdXNoKGAke3NlY29uZHN9c2ApO1xuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZvcm1hdHRlZCBwYWdpbmF0aW9uIGRpc3BsYXkgc3RyaW5nXG4gKiBAcGFyYW0gY3VycmVudFBhZ2UgLSBUaGUgY3VycmVudCBwYWdlIG51bWJlclxuICogQHBhcmFtIHRvdGFsUGFnZXMgLSBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIHZpc2l0ZWQgc28gZmFyXG4gKiBAcGFyYW0gaGFzTW9yZSAtIFdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgcGFnZXMgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyBGb3JtYXR0ZWQgc3RyaW5nIGxpa2UgXCJQYWdlIDEgb2YgMytcIiBvciBcIlBhZ2UgMiBvZiAyXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2luYXRpb25EaXNwbGF5KFxuICBjdXJyZW50UGFnZTogbnVtYmVyLFxuICB0b3RhbFBhZ2VzOiBudW1iZXIsXG4gIGhhc01vcmU6IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIGlmIChoYXNNb3JlKSB7XG4gICAgcmV0dXJuIGBQYWdlICR7Y3VycmVudFBhZ2V9IG9mICR7dG90YWxQYWdlc30rYDtcbiAgfVxuICByZXR1cm4gYFBhZ2UgJHtjdXJyZW50UGFnZX0gb2YgJHt0b3RhbFBhZ2VzfWA7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIER1cmFibGUgQWdlbnQgVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzdGVwIGlzIGEgZG9TdHJlYW1TdGVwIChMTE0gY2FsbCB3aXRoIGNvbnZlcnNhdGlvbiBpbnB1dClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG9TdHJlYW1TdGVwKHN0ZXBOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0ZXBOYW1lLmVuZHNXaXRoKCcvL2RvU3RyZWFtU3RlcCcpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdGhlIGNvbnZlcnNhdGlvbiBmcm9tIGEgaHlkcmF0ZWQgZG9TdHJlYW1TdGVwIGlucHV0LlxuICogZG9TdHJlYW1TdGVwIHNpZ25hdHVyZTogKGNvbnZlcnNhdGlvblByb21wdCwgbW9kZWwsIHdyaXRhYmxlLCB0b29scywgb3B0aW9ucylcbiAqIFNvIGlucHV0WzBdIGlzIHRoZSBjb252ZXJzYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29udmVyc2F0aW9uKHN0ZXBJbnB1dDogdW5rbm93bik6IE1vZGVsTWVzc2FnZVtdIHwgbnVsbCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShzdGVwSW5wdXQpIHx8IHN0ZXBJbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0QXJnID0gc3RlcElucHV0WzBdO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShmaXJzdEFyZykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGl0IGxvb2tzIGxpa2UgTW9kZWxNZXNzYWdlW11cbiAgaWYgKFxuICAgICFmaXJzdEFyZy5ldmVyeSgobXNnKSA9PiBtc2cgJiYgdHlwZW9mIG1zZyA9PT0gJ29iamVjdCcgJiYgJ3JvbGUnIGluIG1zZylcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZmlyc3RBcmcgYXMgTW9kZWxNZXNzYWdlW107XG59XG5cbi8qKlxuICogQSBkb1N0cmVhbVN0ZXAgd2l0aCBpdHMgY29udmVyc2F0aW9uIGlucHV0IGV4dHJhY3RlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVN0ZXAge1xuICBzdGVwSWQ6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgY29udmVyc2F0aW9uOiBNb2RlbE1lc3NhZ2VbXTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGFsbCBzdHJlYW0gc3RlcHMgKGRvU3RyZWFtU3RlcCkgaW4gYSBydW4gYW5kIGV4dHJhY3RzIHRoZWlyIGNvbnZlcnNhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeVN0cmVhbVN0ZXBzKHN0ZXBzOiBTdGVwW10pOiBTdHJlYW1TdGVwW10ge1xuICByZXR1cm4gc3RlcHNcbiAgICAuZmlsdGVyKChzdGVwKSA9PiBpc0RvU3RyZWFtU3RlcChzdGVwLnN0ZXBOYW1lKSlcbiAgICAubWFwKChzdGVwKSA9PiB7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBzdGVwLnN0ZXBOYW1lLnNwbGl0KCcvLycpLnBvcCgpID8/ICd1bmtub3duJztcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGV4dHJhY3RDb252ZXJzYXRpb24oc3RlcC5pbnB1dCkgPz8gW107XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0ZXBJZDogc3RlcC5zdGVwSWQsXG4gICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICBjb252ZXJzYXRpb24sXG4gICAgICB9O1xuICAgIH0pO1xufVxuIl19
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBbUIsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLFVBQVUsRUFBRSxDQUFDLEdBQUcsTUFBb0I7SUFDeEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEVBQVUsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUN4RCxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakMsT0FBTyxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztJQUUvRCxJQUFJLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUM3QixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQztJQUNwRCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixJQUFJLFNBQVMsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDekMsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUN6QyxDQUFDO0lBRUQsNERBQTREO0lBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBRXRFLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNiLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFMUIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsMEVBQTBFO0FBQzFFLHFFQUFxRTtBQUNyRSxNQUFNLHVCQUF1QixHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUU7SUFDL0QscUJBQXFCLEVBQUUsQ0FBQztJQUN4QixxQkFBcUIsRUFBRSxDQUFDO0NBQ3pCLENBQUMsQ0FBQztBQUVIOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxFQUFVO0lBQzlDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDdEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztZQUM3QixPQUFPLEdBQUcsU0FBUyxJQUFJLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFOUMsSUFBSSxZQUFZLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDaEMsT0FBTyxHQUFHLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQztJQUMzRSxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDbEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNsRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztJQUU3RCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFFM0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDYixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTFELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxXQUFtQixFQUNuQixVQUFrQixFQUNsQixPQUFnQjtJQUVoQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osT0FBTyxRQUFRLFdBQVcsT0FBTyxVQUFVLEdBQUcsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsT0FBTyxRQUFRLFdBQVcsT0FBTyxVQUFVLEVBQUUsQ0FBQztBQUNoRCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLDBCQUEwQjtBQUMxQiwrRUFBK0U7QUFFL0U7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFFBQWdCO0lBQzdDLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFNBQWtCO0lBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTlCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLElBQ0UsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsRUFDekUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sUUFBMEIsQ0FBQztBQUNwQyxDQUFDO0FBWUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsS0FBYTtJQUMvQyxPQUFPLEtBQUs7U0FDVCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDL0MsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDWixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxTQUFTLENBQUM7UUFDbEUsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixXQUFXLEVBQUUsWUFBWTtZQUN6QixZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3RlcCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IE1vZGVsTWVzc2FnZSB9IGZyb20gJ2FpJztcbmltcG9ydCB7IHR5cGUgQ2xhc3NWYWx1ZSwgY2xzeCB9IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgdHdNZXJnZSB9IGZyb20gJ3RhaWx3aW5kLW1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNuKC4uLmlucHV0czogQ2xhc3NWYWx1ZVtdKSB7XG4gIHJldHVybiB0d01lcmdlKGNsc3goaW5wdXRzKSk7XG59XG5cbmNvbnN0IE1TX0lOX1NFQ09ORCA9IDEwMDA7XG5jb25zdCBNU19JTl9NSU5VVEUgPSA2MCAqIE1TX0lOX1NFQ09ORDtcbmNvbnN0IE1TX0lOX0hPVVIgPSA2MCAqIE1TX0lOX01JTlVURTtcbmNvbnN0IE1TX0lOX0RBWSA9IDI0ICogTVNfSU5fSE9VUjtcblxuLyoqXG4gKiBGb3JtYXRzIGEgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRvIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBtcyAtIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIGNvbXBhY3QgLSBJZiB0cnVlLCByZXR1cm5zIGEgY29tcGFjdCBmb3JtYXQgKGUuZy4sIFwiMzgwbXNcIiwgXCIybSAzMHNcIikuXG4gKiAgICAgICAgICAgICAgICAgIElmIGZhbHNlIChkZWZhdWx0KSwgcmV0dXJucyBtdWx0aS1wYXJ0IGZvcm1hdCAoZS5nLiwgXCIxbSAxM3NcIiwgXCIyZCA1aCAzbSAxMnNcIikuXG4gKlxuICogQ29tcGFjdCBmb3JtYXQgKHRpbWVsaW5lIG1hcmtlcnMpOlxuICogLSA8IDFzOiBzaG93cyBtaWxsaXNlY29uZHMgKGUuZy4sIFwiMzgwbXNcIilcbiAqIC0gPCAxbTogc2hvd3Mgc2Vjb25kcyAoZS5nLiwgXCI0NXNcIilcbiAqIC0gPCAxaDogc2hvd3MgbWludXRlcyBhbmQgc2Vjb25kcyAoZS5nLiwgXCIybSAzMHNcIilcbiAqIC0gPj0gMWg6IHNob3dzIGhvdXJzIGFuZCBtaW51dGVzIChlLmcuLCBcIjJoIDMwbVwiKVxuICpcbiAqIEZ1bGwgZm9ybWF0OlxuICogLSA8IDFzOiBzaG93cyBtaWxsaXNlY29uZHMgKGUuZy4sIFwiMzgwbXNcIilcbiAqIC0gPCAxbTogc2hvd3Mgc2Vjb25kcyAoZS5nLiwgXCI0NXNcIilcbiAqIC0gPj0gMW06IHNob3dzIGRlY29tcG9zZWQgZm9ybWF0IHdpdGggd2hvbGUgc2Vjb25kcyAoZS5nLiwgXCIxbSAxM3NcIiwgXCIybSAxM3NcIilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKG1zOiBudW1iZXIsIGNvbXBhY3QgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGlmIChtcyA9PT0gMCkge1xuICAgIHJldHVybiAnMHMnO1xuICB9XG5cbiAgaWYgKG1zIDwgTVNfSU5fU0VDT05EKSB7XG4gICAgY29uc3Qgcm91bmRlZE1zID0gTWF0aC5yb3VuZChtcyk7XG4gICAgcmV0dXJuIHJvdW5kZWRNcyA8IE1TX0lOX1NFQ09ORCA/IGAke3JvdW5kZWRNc31tc2AgOiAnMXMnO1xuICB9XG5cbiAgY29uc3Qgcm91bmRlZE1zID0gTWF0aC5yb3VuZChtcyAvIE1TX0lOX1NFQ09ORCkgKiBNU19JTl9TRUNPTkQ7XG5cbiAgaWYgKHJvdW5kZWRNcyA8IE1TX0lOX01JTlVURSkge1xuICAgIHJldHVybiBgJHtNYXRoLmZsb29yKHJvdW5kZWRNcyAvIE1TX0lOX1NFQ09ORCl9c2A7XG4gIH1cblxuICAvLyBDb21wYWN0IGZvcm1hdDogbXVsdGktdW5pdCB3aXRob3V0IGRlY2ltYWxzIChlLmcuIFwiOG0gMjBzXCIsIFwiMmggMzBtXCIpXG4gIGlmIChjb21wYWN0KSB7XG4gICAgaWYgKHJvdW5kZWRNcyA8IE1TX0lOX0hPVVIpIHtcbiAgICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKHJvdW5kZWRNcyAvIE1TX0lOX01JTlVURSk7XG4gICAgICBjb25zdCBzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fTUlOVVRFKSAvIE1TX0lOX1NFQ09ORCk7XG4gICAgICByZXR1cm4gcyA+IDAgPyBgJHttfW0gJHtzfXNgIDogYCR7bX1tYDtcbiAgICB9XG4gICAgY29uc3QgaCA9IE1hdGguZmxvb3Iocm91bmRlZE1zIC8gTVNfSU5fSE9VUik7XG4gICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKHJvdW5kZWRNcyAlIE1TX0lOX0hPVVIpIC8gTVNfSU5fTUlOVVRFKTtcbiAgICByZXR1cm4gbSA+IDAgPyBgJHtofWggJHttfW1gIDogYCR7aH1oYDtcbiAgfVxuXG4gIC8vIEZ1bGwgZm9ybWF0OiBkZWNvbXBvc2UgaW50byBsYXJnZXIgdW5pdHMgKyB3aG9sZSBzZWNvbmRzLlxuICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcihyb3VuZGVkTXMgLyBNU19JTl9EQVkpO1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoKHJvdW5kZWRNcyAlIE1TX0lOX0RBWSkgLyBNU19JTl9IT1VSKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHJvdW5kZWRNcyAlIE1TX0lOX0hPVVIpIC8gTVNfSU5fTUlOVVRFKTtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IoKHJvdW5kZWRNcyAlIE1TX0lOX01JTlVURSkgLyBNU19JTl9TRUNPTkQpO1xuXG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChkYXlzID4gMCkge1xuICAgIHBhcnRzLnB1c2goYCR7ZGF5c31kYCk7XG4gIH1cbiAgaWYgKGhvdXJzID4gMCkge1xuICAgIHBhcnRzLnB1c2goYCR7aG91cnN9aGApO1xuICB9XG4gIGlmIChtaW51dGVzID4gMCkge1xuICAgIHBhcnRzLnB1c2goYCR7bWludXRlc31tYCk7XG4gIH1cbiAgcGFydHMucHVzaChgJHtzZWNvbmRzfXNgKTtcblxuICByZXR1cm4gcGFydHMuam9pbignICcpO1xufVxuXG4vLyBMb2NhbGUtYXdhcmUgZm9ybWF0dGVyIHRoYXQgYWx3YXlzIHJlbmRlcnMgZXhhY3RseSB0d28gZnJhY3Rpb24gZGlnaXRzLlxuLy8gVXNlZCBmb3IgdGhlIHNlY29uZHMgY29tcG9uZW50IG9mIHByZWNpc2UgZHVyYXRpb25zIHNvIHZhbHVlcyBhcmUgbmV2ZXJcbi8vIHNuYXBwZWQgdG8gYSB3aG9sZSBzZWNvbmQgKGFuZCB0aG91c2FuZHMgc2VwYXJhdG9ycyBzdGF5IGNvcnJlY3QpLlxuY29uc3QgcHJlY2lzZVNlY29uZHNGb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQodW5kZWZpbmVkLCB7XG4gIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMixcbiAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyLFxufSk7XG5cbi8qKlxuICogRm9ybWF0cyBhIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyB3aXRob3V0IHNuYXBwaW5nIHRvIHdob2xlIHNlY29uZHMuXG4gKlxuICogVW5saWtlIHtAbGluayBmb3JtYXREdXJhdGlvbn0sIHRoaXMgbmV2ZXIgcm91bmRzIGEgc3ViLW1pbnV0ZSB2YWx1ZSB1cCB0b1xuICogdGhlIG5leHQgd2hvbGUgc2Vjb25kIChlLmcuIDE2MjZtcyByZW5kZXJzIGFzIFwiMS42M3NcIiwgbm90IFwiMnNcIikuXG4gKlxuICogLSA8IDFzOiBzaG93cyB3aG9sZSBtaWxsaXNlY29uZHMgKGUuZy4gXCI2MjZtc1wiKVxuICogLSAxcyDigJMgMW06IHNob3dzIHNlY29uZHMgd2l0aCB0d28gZGVjaW1hbHMgKGUuZy4gXCIxLjYzc1wiLCBcIjQ1LjIwc1wiKVxuICogLSA+PSAxbTogZGVjb21wb3NlcyBpbnRvIGQvaC9tIHdpdGggdHdvLWRlY2ltYWwgc2Vjb25kcyAoZS5nLiBcIjFtIDEzLjQ1c1wiKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RHVyYXRpb25QcmVjaXNlKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobXMgPT09IDApIHtcbiAgICByZXR1cm4gJzBzJztcbiAgfVxuXG4gIGlmIChtcyA8IE1TX0lOX1NFQ09ORCkge1xuICAgIGNvbnN0IHJvdW5kZWRNcyA9IE1hdGgucm91bmQobXMpO1xuICAgIGlmIChyb3VuZGVkTXMgPCBNU19JTl9TRUNPTkQpIHtcbiAgICAgIHJldHVybiBgJHtyb3VuZGVkTXN9bXNgO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRNcyA9IE1hdGgucm91bmQobXMgLyAxMCkgKiAxMDtcblxuICBpZiAobm9ybWFsaXplZE1zIDwgTVNfSU5fTUlOVVRFKSB7XG4gICAgcmV0dXJuIGAke3ByZWNpc2VTZWNvbmRzRm9ybWF0dGVyLmZvcm1hdChub3JtYWxpemVkTXMgLyBNU19JTl9TRUNPTkQpfXNgO1xuICB9XG5cbiAgY29uc3QgZGF5cyA9IE1hdGguZmxvb3Iobm9ybWFsaXplZE1zIC8gTVNfSU5fREFZKTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKChub3JtYWxpemVkTXMgJSBNU19JTl9EQVkpIC8gTVNfSU5fSE9VUik7XG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKChub3JtYWxpemVkTXMgJSBNU19JTl9IT1VSKSAvIE1TX0lOX01JTlVURSk7XG4gIGNvbnN0IHNlY29uZHMgPSAobm9ybWFsaXplZE1zICUgTVNfSU5fTUlOVVRFKSAvIE1TX0lOX1NFQ09ORDtcblxuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoZGF5cyA+IDApIHtcbiAgICBwYXJ0cy5wdXNoKGAke2RheXN9ZGApO1xuICB9XG4gIGlmIChob3VycyA+IDApIHtcbiAgICBwYXJ0cy5wdXNoKGAke2hvdXJzfWhgKTtcbiAgfVxuICBpZiAobWludXRlcyA+IDApIHtcbiAgICBwYXJ0cy5wdXNoKGAke21pbnV0ZXN9bWApO1xuICB9XG4gIHBhcnRzLnB1c2goYCR7cHJlY2lzZVNlY29uZHNGb3JtYXR0ZXIuZm9ybWF0KHNlY29uZHMpfXNgKTtcblxuICByZXR1cm4gcGFydHMuam9pbignICcpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmb3JtYXR0ZWQgcGFnaW5hdGlvbiBkaXNwbGF5IHN0cmluZ1xuICogQHBhcmFtIGN1cnJlbnRQYWdlIC0gVGhlIGN1cnJlbnQgcGFnZSBudW1iZXJcbiAqIEBwYXJhbSB0b3RhbFBhZ2VzIC0gVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyB2aXNpdGVkIHNvIGZhclxuICogQHBhcmFtIGhhc01vcmUgLSBXaGV0aGVyIHRoZXJlIGFyZSBtb3JlIHBhZ2VzIGF2YWlsYWJsZVxuICogQHJldHVybnMgRm9ybWF0dGVkIHN0cmluZyBsaWtlIFwiUGFnZSAxIG9mIDMrXCIgb3IgXCJQYWdlIDIgb2YgMlwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdpbmF0aW9uRGlzcGxheShcbiAgY3VycmVudFBhZ2U6IG51bWJlcixcbiAgdG90YWxQYWdlczogbnVtYmVyLFxuICBoYXNNb3JlOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBpZiAoaGFzTW9yZSkge1xuICAgIHJldHVybiBgUGFnZSAke2N1cnJlbnRQYWdlfSBvZiAke3RvdGFsUGFnZXN9K2A7XG4gIH1cbiAgcmV0dXJuIGBQYWdlICR7Y3VycmVudFBhZ2V9IG9mICR7dG90YWxQYWdlc31gO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEdXJhYmxlIEFnZW50IFV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RlcCBpcyBhIGRvU3RyZWFtU3RlcCAoTExNIGNhbGwgd2l0aCBjb252ZXJzYXRpb24gaW5wdXQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RvU3RyZWFtU3RlcChzdGVwTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzdGVwTmFtZS5lbmRzV2l0aCgnLy9kb1N0cmVhbVN0ZXAnKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBjb252ZXJzYXRpb24gZnJvbSBhIGh5ZHJhdGVkIGRvU3RyZWFtU3RlcCBpbnB1dC5cbiAqIGRvU3RyZWFtU3RlcCBzaWduYXR1cmU6IChjb252ZXJzYXRpb25Qcm9tcHQsIG1vZGVsLCB3cml0YWJsZSwgdG9vbHMsIG9wdGlvbnMpXG4gKiBTbyBpbnB1dFswXSBpcyB0aGUgY29udmVyc2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvbnZlcnNhdGlvbihzdGVwSW5wdXQ6IHVua25vd24pOiBNb2RlbE1lc3NhZ2VbXSB8IG51bGwge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3RlcElucHV0KSB8fCBzdGVwSW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmaXJzdEFyZyA9IHN0ZXBJbnB1dFswXTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoZmlyc3RBcmcpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBpdCBsb29rcyBsaWtlIE1vZGVsTWVzc2FnZVtdXG4gIGlmIChcbiAgICAhZmlyc3RBcmcuZXZlcnkoKG1zZykgPT4gbXNnICYmIHR5cGVvZiBtc2cgPT09ICdvYmplY3QnICYmICdyb2xlJyBpbiBtc2cpXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0QXJnIGFzIE1vZGVsTWVzc2FnZVtdO1xufVxuXG4vKipcbiAqIEEgZG9TdHJlYW1TdGVwIHdpdGggaXRzIGNvbnZlcnNhdGlvbiBpbnB1dCBleHRyYWN0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1TdGVwIHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIGNvbnZlcnNhdGlvbjogTW9kZWxNZXNzYWdlW107XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBhbGwgc3RyZWFtIHN0ZXBzIChkb1N0cmVhbVN0ZXApIGluIGEgcnVuIGFuZCBleHRyYWN0cyB0aGVpciBjb252ZXJzYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlTdHJlYW1TdGVwcyhzdGVwczogU3RlcFtdKTogU3RyZWFtU3RlcFtdIHtcbiAgcmV0dXJuIHN0ZXBzXG4gICAgLmZpbHRlcigoc3RlcCkgPT4gaXNEb1N0cmVhbVN0ZXAoc3RlcC5zdGVwTmFtZSkpXG4gICAgLm1hcCgoc3RlcCkgPT4ge1xuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3RlcC5zdGVwTmFtZS5zcGxpdCgnLy8nKS5wb3AoKSA/PyAndW5rbm93bic7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBleHRyYWN0Q29udmVyc2F0aW9uKHN0ZXAuaW5wdXQpID8/IFtdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgZGlzcGxheU5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgY29udmVyc2F0aW9uLFxuICAgICAgfTtcbiAgICB9KTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workflow/web-shared",
3
3
  "description": "Shared components for Workflow Observability UI",
4
- "version": "5.0.0-beta.13",
4
+ "version": "5.0.0-beta.14",
5
5
  "private": false,
6
6
  "files": [
7
7
  "dist",
@@ -53,9 +53,9 @@
53
53
  "streamdown": "2.3.0",
54
54
  "tailwind-merge": "3.5.0",
55
55
  "tailwindcss": "4",
56
- "@workflow/core": "5.0.0-beta.13",
56
+ "@workflow/core": "5.0.0-beta.14",
57
57
  "@workflow/utils": "5.0.0-beta.3",
58
- "@workflow/world": "5.0.0-beta.7"
58
+ "@workflow/world": "5.0.0-beta.8"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@biomejs/biome": "^2.4.4",
@@ -2,7 +2,7 @@ import { Circle } from 'lucide-react';
2
2
  import { useRef } from 'react';
3
3
  import { cn } from '../../../lib/utils';
4
4
  import type { Span } from '../types';
5
- import { formatDuration } from '../../trace-viewer/util/timing';
5
+ import { formatDurationPrecise } from '../../trace-viewer/util/timing';
6
6
  import {
7
7
  SleepIcon,
8
8
  StepForwardIcon,
@@ -86,7 +86,7 @@ const EventRow = ({
86
86
  </div>
87
87
  <div className="ml-2 shrink-0">
88
88
  <span className="text-label-14 text-gray-900 tabular-nums">
89
- {formatDuration(durationMs)}
89
+ {formatDurationPrecise(durationMs)}
90
90
  </span>
91
91
  </div>
92
92
  </div>
@@ -5,7 +5,11 @@ import type { CSSProperties, ReactNode } from 'react';
5
5
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
6
  import { cn } from '../../../lib/utils';
7
7
  import type { Span } from '../types';
8
- import { formatDuration, getHighResInMs } from '../../trace-viewer/util/timing';
8
+ import {
9
+ formatDuration,
10
+ formatDurationPrecise,
11
+ getHighResInMs,
12
+ } from '../../trace-viewer/util/timing';
9
13
  import { isSpanDimmedBySearch, type SpanSearchResult } from '../search';
10
14
  import type { Segment, SegmentStatus, TimeMarker } from '../utils';
11
15
  import {
@@ -222,7 +226,7 @@ function SegmentBar({ segments }: { segments: VisibleSegment[] }): ReactNode {
222
226
  return (
223
227
  <div className="relative h-6 w-full">
224
228
  {segments.map((seg, i) => {
225
- const label = formatDuration(seg.fullDurationMs);
229
+ const label = formatDurationPrecise(seg.fullDurationMs);
226
230
  // Only render the label when there's enough room for it without clipping.
227
231
  const showLabel = seg.pixelWidth >= Math.max(40, label.length * 6 + 12);
228
232
  // Beef up the queued segment when it's too narrow to read.
@@ -313,7 +317,7 @@ const TimelineBar = memo(function TimelineBar({
313
317
  ? (colors.errorBorder ?? 'var(--ds-red-500)')
314
318
  : colors.border;
315
319
 
316
- const totalLabel = formatDuration(totalDurationMs);
320
+ const totalLabel = formatDurationPrecise(totalDurationMs);
317
321
  const showTotalLabel =
318
322
  geometry.visiblePixelWidth >= Math.max(40, totalLabel.length * 6 + 12);
319
323
 
@@ -261,6 +261,7 @@ const attributeOrder: AttributeKey[] = [
261
261
  'eventData',
262
262
  'input',
263
263
  'output',
264
+ 'attributes',
264
265
  'resumeAt',
265
266
  ];
266
267
 
@@ -284,6 +285,7 @@ const attributeDisplayNames: Partial<Record<AttributeKey, string>> = {
284
285
  runId: 'Run ID',
285
286
  token: 'Token',
286
287
  eventType: 'Event Type',
288
+ errorCode: 'Error Code',
287
289
  correlationId: 'Correlation ID',
288
290
  deploymentId: 'Deployment ID',
289
291
  specVersion: 'Spec Version',
@@ -415,11 +417,11 @@ const attributeToDisplayFn: Record<
415
417
  environment: (_value: unknown) => null,
416
418
  executionContext: (_value: unknown) => null,
417
419
  // Attributes MVP — string-string metadata attached to the run.
418
- // Rendered as a JSON block; if empty/missing, hidden by the
419
- // hasDisplayContent gate above.
420
+ // Rendered in its own collapsible DetailCard; if empty/missing, hidden
421
+ // by the hasDisplayContent gate.
420
422
  attributes: (value: unknown) => {
421
423
  if (!hasDisplayContent(value)) return null;
422
- return JsonBlock(value);
424
+ return <DetailCard summary="Attributes">{JsonBlock(value)}</DetailCard>;
423
425
  },
424
426
  // Dates — wrapped with TimestampTooltip showing UTC/local + relative time
425
427
  createdAt: timestampWithTooltipOrNull,
@@ -588,6 +590,7 @@ const resolvableAttributes = [
588
590
  'output',
589
591
  'error',
590
592
  'metadata',
593
+ 'attributes',
591
594
  'eventData',
592
595
  ];
593
596
 
@@ -597,6 +600,7 @@ const selfHeaderedAttributes = new Set([
597
600
  'input',
598
601
  'output',
599
602
  'error',
603
+ 'attributes',
600
604
  'eventData',
601
605
  ]);
602
606