@boelabs/billete-sdk 0.3.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jesus Alejandro Petit Diaz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,90 @@
1
+ # @boelabs/billete-sdk
2
+
3
+ SDK oficial de [Billete](https://billete.run): pagos y suscripciones para Venezuela con Pago Móvil,
4
+ precios en bolívares o en divisas a tasa BCV y cuotas por plan. Tipado de punta a punta, sin
5
+ dependencias y compatible con Node, Bun, Deno y runtimes edge.
6
+
7
+ ```bash
8
+ npm install @boelabs/billete-sdk
9
+ ```
10
+
11
+ ## Servidor
12
+
13
+ ```ts
14
+ import { createBillete } from "@boelabs/billete-sdk";
15
+
16
+ const billete = createBillete({
17
+ environment: "test", // obligatorio: "test" o "production"
18
+ // apiKey: por defecto lee BILLETE_API_KEY
19
+ // baseUrl: por defecto lee BILLETE_BASE_URL, o usa https://api.billete.run
20
+ });
21
+ ```
22
+
23
+ `environment` debe coincidir con la clave (`sk_test_…` o `sk_prod_…`): si no coinciden, el cliente
24
+ falla al crearse, así una clave nunca opera en el entorno equivocado. Las claves se crean en el
25
+ dashboard, en **Desarrolladores → Claves API**. Nunca uses una clave en el navegador.
26
+
27
+ ```ts
28
+ await billete.features.create({
29
+ key: "tokens",
30
+ name: "Tokens",
31
+ type: "metered",
32
+ unit: "tokens",
33
+ reset: { every: "billing" },
34
+ });
35
+
36
+ const plan = await billete.plans.create({
37
+ name: "Pro",
38
+ currency: "USD",
39
+ prices: [
40
+ { months: 1, amount: 1_000 },
41
+ { months: 12, amount: 10_000 },
42
+ ],
43
+ features: { tokens: 100_000 },
44
+ });
45
+
46
+ const checkout = await billete.checkouts.create({
47
+ plan: plan.id,
48
+ months: 1,
49
+ customer: { email: "ana@example.com", externalId: "user_123" },
50
+ });
51
+ // Redirige al cliente a checkout.url
52
+
53
+ const { allowed } = await billete.features.consume("user_123", "tokens", 850);
54
+ ```
55
+
56
+ Los montos son siempre enteros en unidad menor (céntimos): `1_000` son 10,00 USD. Las mutaciones
57
+ llevan una `Idempotency-Key` automática, así los reintentos ante fallos de red nunca duplican un
58
+ cobro. Los errores de la API llegan como `BilleteError`, con `code` estable y `status`.
59
+
60
+ ## Navegador
61
+
62
+ Sin clave: tu servidor crea una sesión de cliente de corta duración
63
+ (`billete.customerSessions.create`) y el navegador la usa para leer el estado de ese cliente.
64
+
65
+ ```ts
66
+ import { createClient } from "@boelabs/billete-sdk/client";
67
+
68
+ const billete = createClient({ customerSession: tokenFromYourServer });
69
+ const [subscription] = (await billete.customer.subscriptions()).data;
70
+ // subscription.renewal → { status: "due" | "overdue", daysRemaining, checkoutUrl, … }
71
+ ```
72
+
73
+ ## Webhooks
74
+
75
+ Firma [Standard Webhooks](https://www.standardwebhooks.com). Pasa el cuerpo tal como llegó:
76
+
77
+ ```ts
78
+ import { verifyWebhook } from "@boelabs/billete-sdk/webhooks";
79
+
80
+ const event = await verifyWebhook({
81
+ payload: rawBody,
82
+ headers: request.headers,
83
+ secret: process.env.BILLETE_WEBHOOK_SECRET!,
84
+ });
85
+ if (event.type === "subscription.past_due") notify(event.data.customerId);
86
+ ```
87
+
88
+ ## Licencia
89
+
90
+ MIT. El SDK es el único código público de Billete; el resto del proyecto es propietario.
@@ -0,0 +1,54 @@
1
+ import { $ as Subscription, A as Payment, At as ENVIRONMENTS, B as Product, C as FEATURE_TYPES, Ct as MobilePrefix, D as FeatureUsageResult, Dt as isLandlinePhone, E as FeatureType, Et as Timestamp, F as PaymentStatus, G as RISK_LEVELS, H as ProductVariant, I as Payout, J as Retirement, K as Refund, L as Plan, M as PaymentFailure, Mt as TokenKind, N as PaymentLink, Nt as tokenEnvironment, O as PAYMENT_STATUSES, Ot as isMobilePhone, P as PaymentSettlement, Pt as tokenPrefix, Q as SubmitLabel, R as PlanFeatureValues, S as ExchangeRate, St as Metadata, T as FeatureReset, Tt as TaxBehavior, U as QuantitySettings, V as ProductCategory, W as RESET_FREQUENCIES, X as SUBMIT_LABELS, Y as RiskLevel, Z as SUBSCRIPTION_STATUSES, _ as Customer, _t as GRACE_PERIOD_DAYS, a as Actor, at as API_ERROR_TYPES, b as CustomerSession, bt as ListQuery, c as BalanceAmount, ct as ApiErrorType, d as CheckoutItem, dt as Address, et as SubscriptionRenewal, f as CheckoutPurpose, ft as AddressInput, g as CustomField, gt as Currency, h as CurrencyAvailability, ht as CURRENCIES, i as WebhookEvent, it as Weekday, j as PaymentAttempt, jt as Environment, k as PRODUCT_CATEGORIES, kt as nationalPhone, l as CHECKOUT_PURPOSES, lt as PAYMENT_FAILURE_CODES, m as Coupon, mt as BillingMonths, n as EventDataMap, nt as USAGE_FEATURE_TYPES, o as AfterCompletion, ot as ApiErrorBody, p as CollectSettings, pt as BILLING_MONTHS, q as ResetFrequency, r as EventType, rt as WebhookEndpoint, s as Balance, st as ApiErrorEnvelope, t as EVENT_TYPES, tt as SubscriptionStatus, u as Checkout, ut as PaymentFailureCode, v as CustomerDetails, vt as GracePeriodDays, w as Feature, wt as TAX_BEHAVIORS, x as Event, xt as MOBILE_PREFIXES, y as CustomerFeature, yt as List, z as PlanPrice } from "./events-BJuSt_4W.js";
2
+ import { A as ProductCheckoutCreate, B as VariantInput, C as PaymentLinkUpdate, D as PlanLinkCreate, E as PlanFeaturesInput, F as RefundCreate, G as PaymentMethodField, H as WebhookEndpointUpdate, I as RetireInput, J as PublicPaymentLink, K as PaymentTestScenario, L as SubscriptionCancel, M as ProductLinkCreate, N as ProductUpdate, O as PlanPriceInput, P as QuantityInput, R as SubscriptionCreate, S as PaymentLinkCreate, T as PlanCreate, U as CheckoutPaymentMethod, V as WebhookEndpointCreate, W as PaymentInstructions, _ as CustomerUpdate, a as CheckoutCreate, b as FeatureUpdate, c as ClientCheckoutUpdate, d as CouponCreate, f as CouponUpdate, g as CustomerSessionCreate, h as CustomerInput, i as AfterCompletionInput, j as ProductCreate, k as PlanUpdate, l as ClientLinkCheckout, m as CustomerCreate, n as RequestOptions, o as CheckoutItemInput, p as CustomFieldInput, q as PublicCheckout, r as TransportOptions, s as ClientCheckoutPay, t as BilleteError, u as CollectInput, v as EventSelector, w as PlanCheckoutCreate, x as KEY_PATTERN, y as FeatureCreate, z as SubscriptionUpdate } from "./errors-oT7VMFhd.js";
3
+ //#region src/create-client.d.ts
4
+ interface ClientOptions extends TransportOptions {
5
+ /**
6
+ * Token from `billete.customerSessions.create()` on your server. Needed only for the
7
+ * `customer` methods; paying checkouts works without it.
8
+ */
9
+ customerSession?: string | (() => string | undefined);
10
+ }
11
+ /**
12
+ * Browser client. It never holds a secret key: checkouts are addressed by their unguessable ID
13
+ * and customer data requires a short-lived customer session minted by your server.
14
+ *
15
+ * ```ts
16
+ * const billete = createClient({ customerSession: token });
17
+ * const [subscription] = (await billete.customer.subscriptions()).data;
18
+ * if (subscription?.renewal?.status === "overdue") showBanner(subscription.renewal);
19
+ * ```
20
+ */
21
+ export declare function createClient(options?: ClientOptions): {
22
+ checkouts: {
23
+ retrieve: (id: string, options?: RequestOptions) => Promise<PublicCheckout>;
24
+ /** Changes quantity, variant, billing cycle or coupon on a payment link checkout. */
25
+ update: (id: string, changes: ClientCheckoutUpdate, options?: RequestOptions) => Promise<PublicCheckout>;
26
+ /** Methods that can pay this checkout, with the converted amount and transfer details. */
27
+ paymentMethods: (id: string, options?: RequestOptions) => Promise<List<CheckoutPaymentMethod>>;
28
+ /** Submits the payment; the returned checkout carries the payment status and any failure. */
29
+ pay: (id: string, input: ClientCheckoutPay, options?: RequestOptions) => Promise<PublicCheckout>;
30
+ };
31
+ paymentLinks: {
32
+ retrieve: (id: string, options?: RequestOptions) => Promise<PublicPaymentLink>;
33
+ createCheckout: (id: string, selection?: ClientLinkCheckout, options?: RequestOptions) => Promise<PublicCheckout>;
34
+ };
35
+ exchangeRates: {
36
+ /** Current official BCV rates, to show prices in bolívares. */
37
+ list: (options?: RequestOptions) => Promise<List<ExchangeRate>>;
38
+ };
39
+ currencies: {
40
+ list: (options?: RequestOptions) => Promise<List<CurrencyAvailability>>;
41
+ };
42
+ /** The customer behind the session token. */
43
+ customer: {
44
+ retrieve: (options?: RequestOptions) => Promise<Customer>;
45
+ /** Subscriptions with their `renewal` block: due date, grace period and payment link. */
46
+ subscriptions: (options?: RequestOptions) => Promise<List<Subscription>>;
47
+ features: (options?: RequestOptions) => Promise<List<CustomerFeature>>;
48
+ feature: (key: string, options?: RequestOptions) => Promise<CustomerFeature>;
49
+ };
50
+ };
51
+ type BilleteClient = ReturnType<typeof createClient>;
52
+ //#endregion
53
+ export { type API_ERROR_TYPES, type Actor, type Address, type AddressInput, type AfterCompletion, type AfterCompletionInput, type ApiErrorBody, type ApiErrorEnvelope, type ApiErrorType, type BILLING_MONTHS, type Balance, type BalanceAmount, type BilleteClient, BilleteError, type BillingMonths, type CHECKOUT_PURPOSES, type CURRENCIES, type Checkout, type CheckoutCreate, type CheckoutItem, type CheckoutItemInput, type CheckoutPaymentMethod, type CheckoutPurpose, type ClientCheckoutPay, type ClientCheckoutUpdate, type ClientLinkCheckout, type ClientOptions, type CollectInput, type CollectSettings, type Coupon, type CouponCreate, type CouponUpdate, type Currency, type CurrencyAvailability, type CustomField, type CustomFieldInput, type Customer, type CustomerCreate, type CustomerDetails, type CustomerFeature, type CustomerInput, type CustomerSession, type CustomerSessionCreate, type CustomerUpdate, type ENVIRONMENTS, type EVENT_TYPES, type Environment, type Event, type EventDataMap, type EventSelector, type EventType, type ExchangeRate, type FEATURE_TYPES, type Feature, type FeatureCreate, type FeatureReset, type FeatureType, type FeatureUpdate, type FeatureUsageResult, type GRACE_PERIOD_DAYS, type GracePeriodDays, type KEY_PATTERN, type List, type ListQuery, type MOBILE_PREFIXES, type Metadata, type MobilePrefix, type PAYMENT_FAILURE_CODES, type PAYMENT_STATUSES, type PRODUCT_CATEGORIES, type Payment, type PaymentAttempt, type PaymentFailure, type PaymentFailureCode, type PaymentInstructions, type PaymentLink, type PaymentLinkCreate, type PaymentLinkUpdate, type PaymentMethodField, type PaymentSettlement, type PaymentStatus, type PaymentTestScenario, type Payout, type Plan, type PlanCheckoutCreate, type PlanCreate, type PlanFeatureValues, type PlanFeaturesInput, type PlanLinkCreate, type PlanPrice, type PlanPriceInput, type PlanUpdate, type Product, type ProductCategory, type ProductCheckoutCreate, type ProductCreate, type ProductLinkCreate, type ProductUpdate, type ProductVariant, type PublicCheckout, type PublicPaymentLink, type QuantityInput, type QuantitySettings, type RESET_FREQUENCIES, type RISK_LEVELS, type Refund, type RefundCreate, type RequestOptions, type ResetFrequency, type RetireInput, type Retirement, type RiskLevel, type SUBMIT_LABELS, type SUBSCRIPTION_STATUSES, type SubmitLabel, type Subscription, type SubscriptionCancel, type SubscriptionCreate, type SubscriptionRenewal, type SubscriptionStatus, type SubscriptionUpdate, type TAX_BEHAVIORS, type TaxBehavior, type Timestamp, type TokenKind, type USAGE_FEATURE_TYPES, type VariantInput, type WebhookEndpoint, type WebhookEndpointCreate, type WebhookEndpointUpdate, type WebhookEvent, type Weekday, type isLandlinePhone, type isMobilePhone, type nationalPhone, type tokenEnvironment, type tokenPrefix };
54
+ //# sourceMappingURL=client.d.ts.map
package/dist/client.js ADDED
@@ -0,0 +1,102 @@
1
+ import { n as segment, r as BilleteError, t as createTransport } from "./http-ChElV20o.js";
2
+ //#region src/create-client.ts
3
+ /**
4
+ * Browser client. It never holds a secret key: checkouts are addressed by their unguessable ID
5
+ * and customer data requires a short-lived customer session minted by your server.
6
+ *
7
+ * ```ts
8
+ * const billete = createClient({ customerSession: token });
9
+ * const [subscription] = (await billete.customer.subscriptions()).data;
10
+ * if (subscription?.renewal?.status === "overdue") showBanner(subscription.renewal);
11
+ * ```
12
+ */
13
+ function createClient(options = {}) {
14
+ const session = options.customerSession;
15
+ const http = createTransport({
16
+ ...options,
17
+ token: typeof session === "function" ? session : () => session
18
+ });
19
+ const checkoutPath = (id) => `/v1/client/checkouts/${segment(id)}`;
20
+ return {
21
+ checkouts: {
22
+ retrieve: (id, options) => http.request({
23
+ method: "GET",
24
+ path: checkoutPath(id),
25
+ options
26
+ }),
27
+ /** Changes quantity, variant, billing cycle or coupon on a payment link checkout. */
28
+ update: (id, changes, options) => http.request({
29
+ method: "PATCH",
30
+ path: checkoutPath(id),
31
+ body: changes,
32
+ options
33
+ }),
34
+ /** Methods that can pay this checkout, with the converted amount and transfer details. */
35
+ paymentMethods: (id, options) => http.request({
36
+ method: "GET",
37
+ path: `${checkoutPath(id)}/payment-methods`,
38
+ options
39
+ }),
40
+ /** Submits the payment; the returned checkout carries the payment status and any failure. */
41
+ pay: (id, input, options) => http.request({
42
+ method: "POST",
43
+ path: `${checkoutPath(id)}/pay`,
44
+ body: input,
45
+ options
46
+ })
47
+ },
48
+ paymentLinks: {
49
+ retrieve: (id, options) => http.request({
50
+ method: "GET",
51
+ path: `/v1/client/links/${segment(id)}`,
52
+ options
53
+ }),
54
+ createCheckout: (id, selection = {}, options) => http.request({
55
+ method: "POST",
56
+ path: `/v1/client/links/${segment(id)}/checkouts`,
57
+ body: selection,
58
+ options
59
+ })
60
+ },
61
+ exchangeRates: {
62
+ /** Current official BCV rates, to show prices in bolívares. */
63
+ list: (options) => http.request({
64
+ method: "GET",
65
+ path: "/v1/client/exchange-rates",
66
+ options
67
+ }) },
68
+ currencies: { list: (options) => http.request({
69
+ method: "GET",
70
+ path: "/v1/client/currencies",
71
+ options
72
+ }) },
73
+ /** The customer behind the session token. */
74
+ customer: {
75
+ retrieve: (options) => http.request({
76
+ method: "GET",
77
+ path: "/v1/client/customer",
78
+ options
79
+ }),
80
+ /** Subscriptions with their `renewal` block: due date, grace period and payment link. */
81
+ subscriptions: (options) => http.request({
82
+ method: "GET",
83
+ path: "/v1/client/customer/subscriptions",
84
+ options
85
+ }),
86
+ features: (options) => http.request({
87
+ method: "GET",
88
+ path: "/v1/client/customer/features",
89
+ options
90
+ }),
91
+ feature: (key, options) => http.request({
92
+ method: "GET",
93
+ path: `/v1/client/customer/features/${segment(key)}`,
94
+ options
95
+ })
96
+ }
97
+ };
98
+ }
99
+ //#endregion
100
+ export { BilleteError, createClient };
101
+
102
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","names":[],"sources":["../src/create-client.ts"],"sourcesContent":["import type {\n CheckoutPaymentMethod,\n ClientCheckoutPay,\n ClientCheckoutUpdate,\n ClientLinkCheckout,\n CurrencyAvailability,\n Customer,\n CustomerFeature,\n ExchangeRate,\n List,\n PublicCheckout,\n PublicPaymentLink,\n Subscription,\n} from \"@boelabs/billete-contracts/public\";\n\nimport { createTransport, segment } from \"./http\";\nimport type { RequestOptions, TransportOptions } from \"./http\";\n\nexport interface ClientOptions extends TransportOptions {\n /**\n * Token from `billete.customerSessions.create()` on your server. Needed only for the\n * `customer` methods; paying checkouts works without it.\n */\n customerSession?: string | (() => string | undefined);\n}\n\n/**\n * Browser client. It never holds a secret key: checkouts are addressed by their unguessable ID\n * and customer data requires a short-lived customer session minted by your server.\n *\n * ```ts\n * const billete = createClient({ customerSession: token });\n * const [subscription] = (await billete.customer.subscriptions()).data;\n * if (subscription?.renewal?.status === \"overdue\") showBanner(subscription.renewal);\n * ```\n */\nexport function createClient(options: ClientOptions = {}) {\n const session = options.customerSession;\n const http = createTransport({\n ...options,\n token: typeof session === \"function\" ? session : () => session,\n });\n const checkoutPath = (id: string) => `/v1/client/checkouts/${segment(id)}`;\n\n return {\n checkouts: {\n retrieve: (id: string, options?: RequestOptions) =>\n http.request<PublicCheckout>({ method: \"GET\", path: checkoutPath(id), options }),\n /** Changes quantity, variant, billing cycle or coupon on a payment link checkout. */\n update: (id: string, changes: ClientCheckoutUpdate, options?: RequestOptions) =>\n http.request<PublicCheckout>({\n method: \"PATCH\",\n path: checkoutPath(id),\n body: changes,\n options,\n }),\n /** Methods that can pay this checkout, with the converted amount and transfer details. */\n paymentMethods: (id: string, options?: RequestOptions) =>\n http.request<List<CheckoutPaymentMethod>>({\n method: \"GET\",\n path: `${checkoutPath(id)}/payment-methods`,\n options,\n }),\n /** Submits the payment; the returned checkout carries the payment status and any failure. */\n pay: (id: string, input: ClientCheckoutPay, options?: RequestOptions) =>\n http.request<PublicCheckout>({\n method: \"POST\",\n path: `${checkoutPath(id)}/pay`,\n body: input,\n options,\n }),\n },\n paymentLinks: {\n retrieve: (id: string, options?: RequestOptions) =>\n http.request<PublicPaymentLink>({\n method: \"GET\",\n path: `/v1/client/links/${segment(id)}`,\n options,\n }),\n createCheckout: (id: string, selection: ClientLinkCheckout = {}, options?: RequestOptions) =>\n http.request<PublicCheckout>({\n method: \"POST\",\n path: `/v1/client/links/${segment(id)}/checkouts`,\n body: selection,\n options,\n }),\n },\n exchangeRates: {\n /** Current official BCV rates, to show prices in bolívares. */\n list: (options?: RequestOptions) =>\n http.request<List<ExchangeRate>>({\n method: \"GET\",\n path: \"/v1/client/exchange-rates\",\n options,\n }),\n },\n currencies: {\n list: (options?: RequestOptions) =>\n http.request<List<CurrencyAvailability>>({\n method: \"GET\",\n path: \"/v1/client/currencies\",\n options,\n }),\n },\n /** The customer behind the session token. */\n customer: {\n retrieve: (options?: RequestOptions) =>\n http.request<Customer>({ method: \"GET\", path: \"/v1/client/customer\", options }),\n /** Subscriptions with their `renewal` block: due date, grace period and payment link. */\n subscriptions: (options?: RequestOptions) =>\n http.request<List<Subscription>>({\n method: \"GET\",\n path: \"/v1/client/customer/subscriptions\",\n options,\n }),\n features: (options?: RequestOptions) =>\n http.request<List<CustomerFeature>>({\n method: \"GET\",\n path: \"/v1/client/customer/features\",\n options,\n }),\n feature: (key: string, options?: RequestOptions) =>\n http.request<CustomerFeature>({\n method: \"GET\",\n path: `/v1/client/customer/features/${segment(key)}`,\n options,\n }),\n },\n };\n}\n\nexport type BilleteClient = ReturnType<typeof createClient>;\n"],"mappings":";;;;;;;;;;;;AAoCA,SAAgB,aAAa,UAAyB,CAAC,GAAG;CACxD,MAAM,UAAU,QAAQ;CACxB,MAAM,OAAO,gBAAgB;EAC3B,GAAG;EACH,OAAO,OAAO,YAAY,aAAa,gBAAgB;CACzD,CAAC;CACD,MAAM,gBAAgB,OAAe,wBAAwB,QAAQ,EAAE;CAEvE,OAAO;EACL,WAAW;GACT,WAAW,IAAY,YACrB,KAAK,QAAwB;IAAE,QAAQ;IAAO,MAAM,aAAa,EAAE;IAAG;GAAQ,CAAC;;GAEjF,SAAS,IAAY,SAA+B,YAClD,KAAK,QAAwB;IAC3B,QAAQ;IACR,MAAM,aAAa,EAAE;IACrB,MAAM;IACN;GACF,CAAC;;GAEH,iBAAiB,IAAY,YAC3B,KAAK,QAAqC;IACxC,QAAQ;IACR,MAAM,GAAG,aAAa,EAAE,EAAE;IAC1B;GACF,CAAC;;GAEH,MAAM,IAAY,OAA0B,YAC1C,KAAK,QAAwB;IAC3B,QAAQ;IACR,MAAM,GAAG,aAAa,EAAE,EAAE;IAC1B,MAAM;IACN;GACF,CAAC;EACL;EACA,cAAc;GACZ,WAAW,IAAY,YACrB,KAAK,QAA2B;IAC9B,QAAQ;IACR,MAAM,oBAAoB,QAAQ,EAAE;IACpC;GACF,CAAC;GACH,iBAAiB,IAAY,YAAgC,CAAC,GAAG,YAC/D,KAAK,QAAwB;IAC3B,QAAQ;IACR,MAAM,oBAAoB,QAAQ,EAAE,EAAE;IACtC,MAAM;IACN;GACF,CAAC;EACL;EACA,eAAe;;AAEb,OAAO,YACL,KAAK,QAA4B;GAC/B,QAAQ;GACR,MAAM;GACN;EACF,CAAC,EACL;EACA,YAAY,EACV,OAAO,YACL,KAAK,QAAoC;GACvC,QAAQ;GACR,MAAM;GACN;EACF,CAAC,EACL;;EAEA,UAAU;GACR,WAAW,YACT,KAAK,QAAkB;IAAE,QAAQ;IAAO,MAAM;IAAuB;GAAQ,CAAC;;GAEhF,gBAAgB,YACd,KAAK,QAA4B;IAC/B,QAAQ;IACR,MAAM;IACN;GACF,CAAC;GACH,WAAW,YACT,KAAK,QAA+B;IAClC,QAAQ;IACR,MAAM;IACN;GACF,CAAC;GACH,UAAU,KAAa,YACrB,KAAK,QAAyB;IAC5B,QAAQ;IACR,MAAM,gCAAgC,QAAQ,GAAG;IACjD;GACF,CAAC;EACL;CACF;AACF"}