@reopt-ai/data-sdk-client 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +141 -7
- package/dist/client-B1GlWwVq.d.ts +744 -0
- package/dist/client-B1GlWwVq.d.ts.map +1 -0
- package/dist/client-BCrui21p.d.cts +744 -0
- package/dist/client-BCrui21p.d.cts.map +1 -0
- package/dist/exceptions-C9Fh0BIR.js +285 -0
- package/dist/exceptions-C9Fh0BIR.js.map +1 -0
- package/dist/exceptions-CuhGo9A5.cjs +289 -0
- package/dist/exceptions-CuhGo9A5.cjs.map +1 -0
- package/dist/index.cjs +75 -1874
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +83 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +35 -33
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -70
- package/dist/index.js.map +1 -1
- package/dist/next.cjs +51 -1919
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +31 -0
- package/dist/next.d.cts.map +1 -0
- package/dist/next.d.ts +8 -10
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +36 -49
- package/dist/next.js.map +1 -1
- package/dist/observe-D-BHMwrO.cjs +54 -0
- package/dist/observe-D-BHMwrO.cjs.map +1 -0
- package/dist/observe-D1pNg1qL.js +54 -0
- package/dist/observe-D1pNg1qL.js.map +1 -0
- package/dist/react.cjs +105 -1863
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +80 -0
- package/dist/react.d.cts.map +1 -0
- package/dist/react.d.ts +53 -47
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +118 -23
- package/dist/react.js.map +1 -1
- package/dist/registry-BPhiH_l9.js +1775 -0
- package/dist/registry-BPhiH_l9.js.map +1 -0
- package/dist/registry-CGqrOtf4.cjs +1810 -0
- package/dist/registry-CGqrOtf4.cjs.map +1 -0
- package/dist/tracing-DAhaKkl0.cjs +93 -0
- package/dist/tracing-DAhaKkl0.cjs.map +1 -0
- package/dist/tracing-Dt1RVuQ9.js +93 -0
- package/dist/tracing-Dt1RVuQ9.js.map +1 -0
- package/package.json +31 -16
- package/dist/chunk-2UPF3C7D.js +0 -106
- package/dist/chunk-2UPF3C7D.js.map +0 -1
- package/dist/chunk-4MTDZBRS.js +0 -57
- package/dist/chunk-4MTDZBRS.js.map +0 -1
- package/dist/chunk-BJGIHFDA.js +0 -1627
- package/dist/chunk-BJGIHFDA.js.map +0 -1
- package/dist/client-TesmBLXd.d.ts +0 -581
- package/dist/exceptions-NQHZUDYO.js +0 -9
- package/dist/exceptions-NQHZUDYO.js.map +0 -1
- package/dist/tracing-LC3NZND7.js +0 -91
- package/dist/tracing-LC3NZND7.js.map +0 -1
package/dist/next.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/next/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { Suspense, useCallback, useEffect, useRef } from \"react\";\nimport { usePathname, useSearchParams } from \"next/navigation\";\nimport { useReportWebVitals } from \"next/web-vitals\";\nimport type { WebVitalMetric } from \"../capture/web-vitals.js\";\nimport { ReoptProvider as BaseProvider, useReopt, type ReoptProviderProps } from \"../react/index.js\";\n\n/**\n * `ReoptProvider` for the App Router. Identical to the React one except\n * that it does not send the first `$pageview` itself — `<ReoptPageView />`\n * owns page views, the first one included, so nothing is counted twice.\n *\n * Because this module starts with `\"use client\"`, importing it from a server\n * component (your `app/layout.tsx`) creates the client boundary for you.\n */\nexport function ReoptProvider(props: ReoptProviderProps) {\n return <BaseProvider {...props} initialPageView={false} />;\n}\n\n/**\n * Sends `$pageview` on every App Router navigation — pathname *and* query\n * string, so a filter change or a UTM landing counts. Render it as a\n * sibling of your page content, inside `<ReoptProvider>`; wrapping children\n * would rerender the whole tree on every navigation.\n *\n * It carries its own `<Suspense>` because `useSearchParams()` requires one\n * on prerendered routes; without it the nearest boundary — possibly your\n * entire layout — would fall back to client rendering.\n */\nexport function ReoptPageView() {\n return (\n <Suspense fallback={null}>\n <PageViewTracker />\n </Suspense>\n );\n}\n\nfunction PageViewTracker() {\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const { pageView } = useReopt();\n const lastKey = useRef<string | null>(null);\n\n useEffect(() => {\n if (!pathname) return;\n const search = searchParams?.toString() ?? \"\";\n const key = search ? `${pathname}?${search}` : pathname;\n // StrictMode runs this effect twice for one navigation; the URL did not change, so neither should the count.\n if (lastKey.current === key) return;\n lastKey.current = key;\n // No explicit `path`: the runtime stamps it from `location.pathname`\n // (identical to `usePathname()` once the navigation has committed), and\n // that is the only path `normalizePath` applies to. Passing `pathname`\n // here would bypass the hook for the very event whose cardinality it\n // exists to control.\n pageView({ properties: search ? { search } : undefined });\n }, [pathname, searchParams, pageView]);\n\n return null;\n}\n\n/**\n * Sends `$web_vitals` for every Core Web Vital Next reports (TTFB, FCP,\n * LCP, CLS, INP, …). Place it next to `<ReoptPageView />`.\n */\nexport function ReoptWebVitals() {\n const { captureWebVital } = useReopt();\n // A changing callback would re-report metrics already delivered.\n const report = useCallback((metric: WebVitalMetric) => captureWebVital(metric), [captureWebVital]);\n useReportWebVitals(report);\n return null;\n}\n\nexport {\n useReopt,\n useReoptClient,\n useTrack,\n useIdentify,\n usePageView,\n useConsent,\n useTrackOnMount,\n usePageViewOnMount,\n} from \"../react/index.js\";\nexport type { ReoptContextValue, ReoptProviderProps } from \"../react/index.js\";\nexport type { ReoptBootstrap, ReoptClientConfig } from \"../config.js\";\nexport type { ReoptClient } from \"../client.js\";\nexport type { WebVitalMetric };\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"next.js","names":["BaseProvider"],"sources":["../src/next/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { Suspense, useCallback, useEffect, useRef } from \"react\";\nimport { usePathname, useSearchParams } from \"next/navigation\";\nimport { useReportWebVitals } from \"next/web-vitals\";\nimport type { WebVitalMetric } from \"../capture/web-vitals.js\";\nimport { ReoptProvider as BaseProvider, useReopt, type ReoptProviderProps } from \"../react/index.js\";\n\n/**\n * `ReoptProvider` for the App Router. Identical to the React one except\n * that it does not send the first `$pageview` itself — `<ReoptPageView />`\n * owns page views, the first one included, so nothing is counted twice.\n *\n * Because this module starts with `\"use client\"`, importing it from a server\n * component (your `app/layout.tsx`) creates the client boundary for you.\n */\nexport function ReoptProvider(props: ReoptProviderProps) {\n return <BaseProvider {...props} initialPageView={false} />;\n}\n\n/**\n * Sends `$pageview` on every App Router navigation — pathname *and* query\n * string, so a filter change or a UTM landing counts. Render it as a\n * sibling of your page content, inside `<ReoptProvider>`; wrapping children\n * would rerender the whole tree on every navigation.\n *\n * It carries its own `<Suspense>` because `useSearchParams()` requires one\n * on prerendered routes; without it the nearest boundary — possibly your\n * entire layout — would fall back to client rendering.\n */\nexport function ReoptPageView() {\n return (\n <Suspense fallback={null}>\n <PageViewTracker />\n </Suspense>\n );\n}\n\nfunction PageViewTracker() {\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const { pageView } = useReopt();\n const lastKey = useRef<string | null>(null);\n\n useEffect(() => {\n if (!pathname) return;\n const search = searchParams?.toString() ?? \"\";\n const key = search ? `${pathname}?${search}` : pathname;\n // StrictMode runs this effect twice for one navigation; the URL did not change, so neither should the count.\n if (lastKey.current === key) return;\n lastKey.current = key;\n // No explicit `path`: the runtime stamps it from `location.pathname`\n // (identical to `usePathname()` once the navigation has committed), and\n // that is the only path `normalizePath` applies to. Passing `pathname`\n // here would bypass the hook for the very event whose cardinality it\n // exists to control.\n pageView({ properties: search ? { search } : undefined });\n }, [pathname, searchParams, pageView]);\n\n return null;\n}\n\n/**\n * Sends `$web_vitals` for every Core Web Vital Next reports (TTFB, FCP,\n * LCP, CLS, INP, …). Place it next to `<ReoptPageView />`.\n */\nexport function ReoptWebVitals() {\n const { captureWebVital } = useReopt();\n // A changing callback would re-report metrics already delivered.\n const report = useCallback((metric: WebVitalMetric) => captureWebVital(metric), [captureWebVital]);\n useReportWebVitals(report);\n return null;\n}\n\nexport {\n useReopt,\n useReoptClient,\n useTrack,\n useIdentify,\n usePageView,\n useConsent,\n useTrackOnMount,\n usePageViewOnMount,\n} from \"../react/index.js\";\nexport type { ReoptContextValue, ReoptProviderProps } from \"../react/index.js\";\nexport type { ReoptBootstrap, ReoptClientConfig } from \"../config.js\";\nexport type { ReoptClient } from \"../client.js\";\nexport type { WebVitalMetric };\n"],"mappings":";;;;;;;AAgBA,SAAgB,cAAc,OAA2B;CACvD,OAAO,IAACA,iBAAD;EAAc,GAAI;EAAO,iBAAiB;CAAQ,CAAA;AAC3D;AAYA,SAAgB,gBAAgB;CAC9B,OACE,IAAC,UAAD;EAAU,UAAU;EAClB,UAAA,IAAC,iBAAD,CAAkB,CAAA;CACV,CAAA;AAEd;AAEA,SAAS,kBAAkB;CACzB,MAAM,WAAW,YAAY;CAC7B,MAAM,eAAe,gBAAgB;CACrC,MAAM,EAAE,aAAa,SAAS;CAC9B,MAAM,UAAU,OAAsB,IAAI;CAE1C,gBAAgB;EACd,IAAI,CAAC,UAAU;EACf,MAAM,SAAS,cAAc,SAAS,KAAK;EAC3C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW;EAE/C,IAAI,QAAQ,YAAY,KAAK;EAC7B,QAAQ,UAAU;EAMlB,SAAS,EAAE,YAAY,SAAS,EAAE,OAAO,IAAI,KAAA,EAAU,CAAC;CAC1D,GAAG;EAAC;EAAU;EAAc;CAAQ,CAAC;CAErC,OAAO;AACT;AAMA,SAAgB,iBAAiB;CAC/B,MAAM,EAAE,oBAAoB,SAAS;CAErC,MAAM,SAAS,aAAa,WAA2B,gBAAgB,MAAM,GAAG,CAAC,eAAe,CAAC;CACjG,mBAAmB,MAAM;CACzB,OAAO;AACT"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//#region src/observe.ts
|
|
2
|
+
function createObservationSink(observer) {
|
|
3
|
+
return (fact) => {
|
|
4
|
+
try {
|
|
5
|
+
if (fact[0] === "config") observer({
|
|
6
|
+
type: fact[0],
|
|
7
|
+
at: fact[1],
|
|
8
|
+
disabled: fact[2],
|
|
9
|
+
baseUrl: fact[3],
|
|
10
|
+
writeKeyPresent: fact[4],
|
|
11
|
+
debug: fact[5],
|
|
12
|
+
capture: fact[6],
|
|
13
|
+
consentPersisted: fact[7],
|
|
14
|
+
batchIntervalMs: fact[8]
|
|
15
|
+
});
|
|
16
|
+
else if (fact[0] === "event") {
|
|
17
|
+
const result = fact[4];
|
|
18
|
+
observer({
|
|
19
|
+
type: fact[0],
|
|
20
|
+
at: fact[1],
|
|
21
|
+
eventType: fact[2],
|
|
22
|
+
name: fact[3],
|
|
23
|
+
phase: result.queued ? "queued" : "dropped",
|
|
24
|
+
eventId: result.eventId,
|
|
25
|
+
pending: fact[5],
|
|
26
|
+
...result.reason ? { reason: result.reason } : {},
|
|
27
|
+
...result.errors ? { errors: result.errors } : {}
|
|
28
|
+
});
|
|
29
|
+
} else if (fact[0] === "identity") observer({
|
|
30
|
+
type: fact[0],
|
|
31
|
+
at: fact[1],
|
|
32
|
+
action: fact[2],
|
|
33
|
+
deviceId: fact[3],
|
|
34
|
+
profileId: fact[4],
|
|
35
|
+
storage: fact[5]
|
|
36
|
+
});
|
|
37
|
+
else if (fact[0] === "consent") observer({
|
|
38
|
+
type: fact[0],
|
|
39
|
+
at: fact[1],
|
|
40
|
+
category: fact[2],
|
|
41
|
+
allowed: fact[3]
|
|
42
|
+
});
|
|
43
|
+
else observer({
|
|
44
|
+
type: fact[0],
|
|
45
|
+
at: fact[1],
|
|
46
|
+
paused: fact[2]
|
|
47
|
+
});
|
|
48
|
+
} catch {}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
exports.createObservationSink = createObservationSink;
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=observe-D-BHMwrO.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe-D-BHMwrO.cjs","names":[],"sources":["../src/observe.ts"],"sourcesContent":["import type { ReoptClientObserver, ReoptObservedEventType, ResolvedCaptureConfig } from \"./config.js\";\nimport type { ConsentCategory, QueueResult } from \"@reopt-ai/data-sdk-core\";\nimport type { IdentityStorageKind } from \"./config.js\";\n\nexport type ObservationFact =\n | [\n \"config\",\n at: number,\n disabled: boolean,\n baseUrl: string,\n writeKeyPresent: boolean,\n debug: boolean,\n capture: ResolvedCaptureConfig,\n consentPersisted: boolean,\n batchIntervalMs: number,\n ]\n | [\"event\", at: number, eventType: ReoptObservedEventType, name: string, result: QueueResult, pending: number]\n | [\n \"identity\",\n at: number,\n action: \"initialized\" | \"identified\" | \"profile_changed\" | \"reset\",\n deviceId: string,\n profileId: string | number | null,\n storage: IdentityStorageKind,\n ]\n | [\"consent\", at: number, category: ConsentCategory | \"all\", allowed: boolean]\n | [\"tracking\", at: number, paused: boolean];\n\nexport type ObservationSink = (fact: ObservationFact) => void;\n\nexport function createObservationSink(observer: ReoptClientObserver): ObservationSink {\n return (fact) => {\n try {\n if (fact[0] === \"config\") {\n observer({\n type: fact[0],\n at: fact[1],\n disabled: fact[2],\n baseUrl: fact[3],\n writeKeyPresent: fact[4],\n debug: fact[5],\n capture: fact[6],\n consentPersisted: fact[7],\n batchIntervalMs: fact[8],\n });\n } else if (fact[0] === \"event\") {\n const result = fact[4];\n observer({\n type: fact[0],\n at: fact[1],\n eventType: fact[2],\n name: fact[3],\n phase: result.queued ? \"queued\" : \"dropped\",\n eventId: result.eventId,\n pending: fact[5],\n ...(result.reason ? { reason: result.reason } : {}),\n ...(result.errors ? { errors: result.errors } : {}),\n });\n } else if (fact[0] === \"identity\") {\n observer({\n type: fact[0],\n at: fact[1],\n action: fact[2],\n deviceId: fact[3],\n profileId: fact[4],\n storage: fact[5],\n });\n } else if (fact[0] === \"consent\") {\n observer({ type: fact[0], at: fact[1], category: fact[2], allowed: fact[3] });\n } else {\n observer({ type: fact[0], at: fact[1], paused: fact[2] });\n }\n } catch {\n // Observation must never change analytics or application behavior.\n }\n };\n}\n"],"mappings":";AA8BA,SAAgB,sBAAsB,UAAgD;CACpF,QAAQ,SAAS;EACf,IAAI;GACF,IAAI,KAAK,OAAO,UACd,SAAS;IACP,MAAM,KAAK;IACX,IAAI,KAAK;IACT,UAAU,KAAK;IACf,SAAS,KAAK;IACd,iBAAiB,KAAK;IACtB,OAAO,KAAK;IACZ,SAAS,KAAK;IACd,kBAAkB,KAAK;IACvB,iBAAiB,KAAK;GACxB,CAAC;QACI,IAAI,KAAK,OAAO,SAAS;IAC9B,MAAM,SAAS,KAAK;IACpB,SAAS;KACP,MAAM,KAAK;KACX,IAAI,KAAK;KACT,WAAW,KAAK;KAChB,MAAM,KAAK;KACX,OAAO,OAAO,SAAS,WAAW;KAClC,SAAS,OAAO;KAChB,SAAS,KAAK;KACd,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;KACjD,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;IACnD,CAAC;GACH,OAAO,IAAI,KAAK,OAAO,YACrB,SAAS;IACP,MAAM,KAAK;IACX,IAAI,KAAK;IACT,QAAQ,KAAK;IACb,UAAU,KAAK;IACf,WAAW,KAAK;IAChB,SAAS,KAAK;GAChB,CAAC;QACI,IAAI,KAAK,OAAO,WACrB,SAAS;IAAE,MAAM,KAAK;IAAI,IAAI,KAAK;IAAI,UAAU,KAAK;IAAI,SAAS,KAAK;GAAG,CAAC;QAE5E,SAAS;IAAE,MAAM,KAAK;IAAI,IAAI,KAAK;IAAI,QAAQ,KAAK;GAAG,CAAC;EAE5D,QAAQ,CAER;CACF;AACF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//#region src/observe.ts
|
|
2
|
+
function createObservationSink(observer) {
|
|
3
|
+
return (fact) => {
|
|
4
|
+
try {
|
|
5
|
+
if (fact[0] === "config") observer({
|
|
6
|
+
type: fact[0],
|
|
7
|
+
at: fact[1],
|
|
8
|
+
disabled: fact[2],
|
|
9
|
+
baseUrl: fact[3],
|
|
10
|
+
writeKeyPresent: fact[4],
|
|
11
|
+
debug: fact[5],
|
|
12
|
+
capture: fact[6],
|
|
13
|
+
consentPersisted: fact[7],
|
|
14
|
+
batchIntervalMs: fact[8]
|
|
15
|
+
});
|
|
16
|
+
else if (fact[0] === "event") {
|
|
17
|
+
const result = fact[4];
|
|
18
|
+
observer({
|
|
19
|
+
type: fact[0],
|
|
20
|
+
at: fact[1],
|
|
21
|
+
eventType: fact[2],
|
|
22
|
+
name: fact[3],
|
|
23
|
+
phase: result.queued ? "queued" : "dropped",
|
|
24
|
+
eventId: result.eventId,
|
|
25
|
+
pending: fact[5],
|
|
26
|
+
...result.reason ? { reason: result.reason } : {},
|
|
27
|
+
...result.errors ? { errors: result.errors } : {}
|
|
28
|
+
});
|
|
29
|
+
} else if (fact[0] === "identity") observer({
|
|
30
|
+
type: fact[0],
|
|
31
|
+
at: fact[1],
|
|
32
|
+
action: fact[2],
|
|
33
|
+
deviceId: fact[3],
|
|
34
|
+
profileId: fact[4],
|
|
35
|
+
storage: fact[5]
|
|
36
|
+
});
|
|
37
|
+
else if (fact[0] === "consent") observer({
|
|
38
|
+
type: fact[0],
|
|
39
|
+
at: fact[1],
|
|
40
|
+
category: fact[2],
|
|
41
|
+
allowed: fact[3]
|
|
42
|
+
});
|
|
43
|
+
else observer({
|
|
44
|
+
type: fact[0],
|
|
45
|
+
at: fact[1],
|
|
46
|
+
paused: fact[2]
|
|
47
|
+
});
|
|
48
|
+
} catch {}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { createObservationSink };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=observe-D1pNg1qL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe-D1pNg1qL.js","names":[],"sources":["../src/observe.ts"],"sourcesContent":["import type { ReoptClientObserver, ReoptObservedEventType, ResolvedCaptureConfig } from \"./config.js\";\nimport type { ConsentCategory, QueueResult } from \"@reopt-ai/data-sdk-core\";\nimport type { IdentityStorageKind } from \"./config.js\";\n\nexport type ObservationFact =\n | [\n \"config\",\n at: number,\n disabled: boolean,\n baseUrl: string,\n writeKeyPresent: boolean,\n debug: boolean,\n capture: ResolvedCaptureConfig,\n consentPersisted: boolean,\n batchIntervalMs: number,\n ]\n | [\"event\", at: number, eventType: ReoptObservedEventType, name: string, result: QueueResult, pending: number]\n | [\n \"identity\",\n at: number,\n action: \"initialized\" | \"identified\" | \"profile_changed\" | \"reset\",\n deviceId: string,\n profileId: string | number | null,\n storage: IdentityStorageKind,\n ]\n | [\"consent\", at: number, category: ConsentCategory | \"all\", allowed: boolean]\n | [\"tracking\", at: number, paused: boolean];\n\nexport type ObservationSink = (fact: ObservationFact) => void;\n\nexport function createObservationSink(observer: ReoptClientObserver): ObservationSink {\n return (fact) => {\n try {\n if (fact[0] === \"config\") {\n observer({\n type: fact[0],\n at: fact[1],\n disabled: fact[2],\n baseUrl: fact[3],\n writeKeyPresent: fact[4],\n debug: fact[5],\n capture: fact[6],\n consentPersisted: fact[7],\n batchIntervalMs: fact[8],\n });\n } else if (fact[0] === \"event\") {\n const result = fact[4];\n observer({\n type: fact[0],\n at: fact[1],\n eventType: fact[2],\n name: fact[3],\n phase: result.queued ? \"queued\" : \"dropped\",\n eventId: result.eventId,\n pending: fact[5],\n ...(result.reason ? { reason: result.reason } : {}),\n ...(result.errors ? { errors: result.errors } : {}),\n });\n } else if (fact[0] === \"identity\") {\n observer({\n type: fact[0],\n at: fact[1],\n action: fact[2],\n deviceId: fact[3],\n profileId: fact[4],\n storage: fact[5],\n });\n } else if (fact[0] === \"consent\") {\n observer({ type: fact[0], at: fact[1], category: fact[2], allowed: fact[3] });\n } else {\n observer({ type: fact[0], at: fact[1], paused: fact[2] });\n }\n } catch {\n // Observation must never change analytics or application behavior.\n }\n };\n}\n"],"mappings":";AA8BA,SAAgB,sBAAsB,UAAgD;CACpF,QAAQ,SAAS;EACf,IAAI;GACF,IAAI,KAAK,OAAO,UACd,SAAS;IACP,MAAM,KAAK;IACX,IAAI,KAAK;IACT,UAAU,KAAK;IACf,SAAS,KAAK;IACd,iBAAiB,KAAK;IACtB,OAAO,KAAK;IACZ,SAAS,KAAK;IACd,kBAAkB,KAAK;IACvB,iBAAiB,KAAK;GACxB,CAAC;QACI,IAAI,KAAK,OAAO,SAAS;IAC9B,MAAM,SAAS,KAAK;IACpB,SAAS;KACP,MAAM,KAAK;KACX,IAAI,KAAK;KACT,WAAW,KAAK;KAChB,MAAM,KAAK;KACX,OAAO,OAAO,SAAS,WAAW;KAClC,SAAS,OAAO;KAChB,SAAS,KAAK;KACd,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;KACjD,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;IACnD,CAAC;GACH,OAAO,IAAI,KAAK,OAAO,YACrB,SAAS;IACP,MAAM,KAAK;IACX,IAAI,KAAK;IACT,QAAQ,KAAK;IACb,UAAU,KAAK;IACf,WAAW,KAAK;IAChB,SAAS,KAAK;GAChB,CAAC;QACI,IAAI,KAAK,OAAO,WACrB,SAAS;IAAE,MAAM,KAAK;IAAI,IAAI,KAAK;IAAI,UAAU,KAAK;IAAI,SAAS,KAAK;GAAG,CAAC;QAE5E,SAAS;IAAE,MAAM,KAAK;IAAI,IAAI,KAAK;IAAI,QAAQ,KAAK;GAAG,CAAC;EAE5D,QAAQ,CAER;CACF;AACF"}
|