@uengage.io/platform-sdk 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export { createUpsellClient, UpsellApiError, type UpsellClient } from './client';
2
+ export type { Cart, CartItem, Channel, KnownLayout, LadderRung, Layout, Placement, PlacementDeleteInput, PlacementDisplay, PlacementRecord, PlacementScope, PlacementUpsertInput, PlacementsQuery, ReasonCode, StrategyParams, SuggestionsInput, SuggestionsResult, Tenant, Touchpoint, UpsellEvent, UpsellEventType, UpsellEventsInput, UpsellItem, UpsellStrategy, } from './schema';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpsellApiError = exports.createUpsellClient = void 0;
4
+ var client_1 = require("./client");
5
+ Object.defineProperty(exports, "createUpsellClient", { enumerable: true, get: function () { return client_1.createUpsellClient; } });
6
+ Object.defineProperty(exports, "UpsellApiError", { enumerable: true, get: function () { return client_1.UpsellApiError; } });
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXBzZWxsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFpRjtBQUF4RSw0R0FBQSxrQkFBa0IsT0FBQTtBQUFFLHdHQUFBLGNBQWMsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGNyZWF0ZVVwc2VsbENsaWVudCwgVXBzZWxsQXBpRXJyb3IsIHR5cGUgVXBzZWxsQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0IHR5cGUge1xuICBDYXJ0LFxuICBDYXJ0SXRlbSxcbiAgQ2hhbm5lbCxcbiAgS25vd25MYXlvdXQsXG4gIExhZGRlclJ1bmcsXG4gIExheW91dCxcbiAgUGxhY2VtZW50LFxuICBQbGFjZW1lbnREZWxldGVJbnB1dCxcbiAgUGxhY2VtZW50RGlzcGxheSxcbiAgUGxhY2VtZW50UmVjb3JkLFxuICBQbGFjZW1lbnRTY29wZSxcbiAgUGxhY2VtZW50VXBzZXJ0SW5wdXQsXG4gIFBsYWNlbWVudHNRdWVyeSxcbiAgUmVhc29uQ29kZSxcbiAgU3RyYXRlZ3lQYXJhbXMsXG4gIFN1Z2dlc3Rpb25zSW5wdXQsXG4gIFN1Z2dlc3Rpb25zUmVzdWx0LFxuICBUZW5hbnQsXG4gIFRvdWNocG9pbnQsXG4gIFVwc2VsbEV2ZW50LFxuICBVcHNlbGxFdmVudFR5cGUsXG4gIFVwc2VsbEV2ZW50c0lucHV0LFxuICBVcHNlbGxJdGVtLFxuICBVcHNlbGxTdHJhdGVneSxcbn0gZnJvbSAnLi9zY2hlbWEnO1xuIl19
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Type surface for the platform Upsell API.
3
+ *
4
+ * Two consumer-facing calls: `placements(...)` (which upsell surfaces a
5
+ * channel should render for a tenant) and `suggest(...)` (items for one
6
+ * placement given the live cart). `reportEvents(...)` feeds attach-rate
7
+ * telemetry. Placement config is managed via the service-actor-only
8
+ * admin methods.
9
+ */
10
+ export type Channel = 'mobile_app' | 'kiosk' | 'whitelabel_web' | 'whatsapp' | 'voice';
11
+ /**
12
+ * A moment in the customer journey — the unit of platform policy
13
+ * (price band, max items, and later the signal weight profile). A
14
+ * placement is a channel's journey label pointing at one of these.
15
+ */
16
+ export type Touchpoint = 'home' | 'menu_browsing' | 'menu_composing' | 'search_no_result' | 'cart' | 'pre_checkout' | 'post_order';
17
+ /**
18
+ * Rendering hint, owned by the channel frontend — the platform never
19
+ * interprets it. Known values are listed for editor completion, but any
20
+ * lowercase identifier is valid so new layouts need no SDK release.
21
+ */
22
+ export type KnownLayout = 'carousel_2up' | 'horizontal_carousel' | 'grid_2xn_modal' | 'carousel_1up' | 'vertical_list' | 'grid_3xn' | 'compact_list' | 'hero_banner';
23
+ export type Layout = KnownLayout | (string & {});
24
+ /** Why an item was recommended. Channels render these in customer language. */
25
+ export type ReasonCode = 'popular_now' | 'completes_meal' | 'often_ordered_together' | 'your_usual' | 'chefs_pick';
26
+ /** Which rung of the resolution ladder answered the request. */
27
+ export type LadderRung = 'full_engine' | 'band_relaxation' | 'popularity_floor' | 'backup_suggestions' | 'empty_degraded';
28
+ export type UpsellStrategy = 'menu-order-popularity' | 'legacy-catalog-sample';
29
+ export interface PlacementDisplay {
30
+ title: string;
31
+ /** Requested count. Touchpoint policy may cap it lower — see `meta.maxItems`. */
32
+ maxItems: number;
33
+ layout: Layout;
34
+ }
35
+ /** Resolved public placement (business override > brand > platform default). */
36
+ export interface Placement {
37
+ key: string;
38
+ channel: Channel;
39
+ touchpoint: Touchpoint;
40
+ enabled: boolean;
41
+ display: PlacementDisplay;
42
+ configVersion: string;
43
+ }
44
+ export interface Tenant {
45
+ parentId: number;
46
+ businessId: number;
47
+ }
48
+ export interface CartItem {
49
+ itemId: number;
50
+ qty: number;
51
+ unitPrice: number;
52
+ /** Optional; lets the dietary gate and category no-repeat see cart contents. */
53
+ itemSlug?: string;
54
+ sectionName?: string;
55
+ /** Legacy vegNonvegBoth flag: 1 veg, 2 non-veg, 3 both/egg. */
56
+ veg?: number;
57
+ }
58
+ export interface Cart {
59
+ items: CartItem[];
60
+ subtotal: number;
61
+ }
62
+ export interface SuggestionsInput {
63
+ channel: Channel;
64
+ placement: string;
65
+ tenant: Tenant;
66
+ context: {
67
+ cart: Cart;
68
+ fulfilmentMode?: 'delivery' | 'pickup' | 'dine_in';
69
+ /**
70
+ * Optional; unused by the v1 scorers. In the contract from day one
71
+ * so personalization lands without a break. `id` MUST be the opaque
72
+ * platform customer id, never a mobile number.
73
+ */
74
+ customer?: {
75
+ id: string;
76
+ };
77
+ /**
78
+ * Optional; not yet acted on. Impression fatigue is session-scoped
79
+ * and shared across touchpoints — send it now so channels
80
+ * instrument once rather than twice.
81
+ */
82
+ sessionId?: string;
83
+ };
84
+ }
85
+ export interface UpsellItem {
86
+ itemId: number;
87
+ itemName: string;
88
+ itemSlug: string | null;
89
+ description: string | null;
90
+ sectionId: number | null;
91
+ sectionName: string | null;
92
+ /** Selling price (INR). */
93
+ price: number;
94
+ image: string | null;
95
+ /** Raw legacy `vegNonvegBoth` flag, passed through untranslated. */
96
+ veg: number | null;
97
+ brandId: number | null;
98
+ reasonCode: ReasonCode;
99
+ }
100
+ export interface SuggestionsResult {
101
+ placement: string;
102
+ touchpoint: Touchpoint;
103
+ items: UpsellItem[];
104
+ meta: {
105
+ enabled: boolean;
106
+ strategy: UpsellStrategy;
107
+ configVersion: string;
108
+ /** Which ladder rung produced these items. */
109
+ rung: LadderRung;
110
+ /** Effective cap applied: min(display.maxItems, touchpoint policy). */
111
+ maxItems: number;
112
+ /** How long the client may reuse this response, in seconds. */
113
+ ttlSeconds: number;
114
+ /** True when the candidate source failed and the service degraded to empty. */
115
+ degraded?: boolean;
116
+ };
117
+ }
118
+ /** Merchant-controlled selection inputs. */
119
+ export interface StrategyParams {
120
+ includedItemSlugs?: string[];
121
+ includedSections?: string[];
122
+ excludedSections?: string[];
123
+ /** "Never Suggest These" — absolute, overrides the priority list. */
124
+ neverSuggestItemSlugs?: string[];
125
+ /** "My Priority Items" — occupy reserved slots ahead of scored items. */
126
+ priorityItemSlugs?: string[];
127
+ /** "Backup Suggestions" — 2-6 items, served when everything else is empty. */
128
+ backupItemSlugs?: string[];
129
+ excludeCartItems?: boolean;
130
+ maxPrice?: number;
131
+ }
132
+ export type PlacementScope = 'default' | 'tenant' | 'business';
133
+ /** Raw admin-plane config row (no precedence merge applied). */
134
+ export interface PlacementRecord {
135
+ scope: PlacementScope;
136
+ parentId?: number;
137
+ businessId?: number;
138
+ channel: Channel;
139
+ key: string;
140
+ touchpoint: Touchpoint;
141
+ enabled: boolean;
142
+ display: PlacementDisplay;
143
+ strategy: UpsellStrategy;
144
+ strategyParams: StrategyParams;
145
+ configVersion: string;
146
+ updatedAt: string;
147
+ updatedBy: string;
148
+ }
149
+ /**
150
+ * Admin upsert. Scope is derived: no parentId → platform default;
151
+ * parentId only → brand row; parentId + businessId → business override.
152
+ */
153
+ export interface PlacementUpsertInput {
154
+ parentId?: number;
155
+ businessId?: number;
156
+ channel: Channel;
157
+ key: string;
158
+ touchpoint: Touchpoint;
159
+ enabled: boolean;
160
+ display: PlacementDisplay;
161
+ strategy?: UpsellStrategy;
162
+ strategyParams?: StrategyParams;
163
+ }
164
+ export interface PlacementDeleteInput {
165
+ parentId?: number;
166
+ businessId?: number;
167
+ channel: Channel;
168
+ key: string;
169
+ /**
170
+ * Required by the server when `parentId` is omitted, because that call
171
+ * targets the PLATFORM DEFAULT row and so removes the placement for
172
+ * every tenant that has not overridden it. Without this the server
173
+ * rejects the request with 400 rather than guessing that a missing
174
+ * parentId was deliberate.
175
+ *
176
+ * Deliberately not defaulted to `true` here: the whole point of the
177
+ * flag is that deleting a default must be stated, not inferred from
178
+ * the shape of the call.
179
+ */
180
+ confirmDeleteDefault?: boolean;
181
+ }
182
+ export interface PlacementsQuery {
183
+ channel: Channel;
184
+ parentId: number;
185
+ businessId: number;
186
+ }
187
+ export type UpsellEventType = 'shown' | 'added' | 'ignored';
188
+ export interface UpsellEvent {
189
+ type: UpsellEventType;
190
+ itemId: number;
191
+ reasonCode?: ReasonCode;
192
+ /** ISO-8601. Defaults to server receive time when omitted. */
193
+ occurredAt?: string;
194
+ }
195
+ export interface UpsellEventsInput {
196
+ channel: Channel;
197
+ placement: string;
198
+ tenant: Tenant;
199
+ sessionId?: string;
200
+ /** Echo `meta.configVersion` from the response being reported on. */
201
+ configVersion?: string;
202
+ events: UpsellEvent[];
203
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Type surface for the platform Upsell API.
4
+ *
5
+ * Two consumer-facing calls: `placements(...)` (which upsell surfaces a
6
+ * channel should render for a tenant) and `suggest(...)` (items for one
7
+ * placement given the live cart). `reportEvents(...)` feeds attach-rate
8
+ * telemetry. Placement config is managed via the service-actor-only
9
+ * admin methods.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Vwc2VsbC9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlIHN1cmZhY2UgZm9yIHRoZSBwbGF0Zm9ybSBVcHNlbGwgQVBJLlxuICpcbiAqIFR3byBjb25zdW1lci1mYWNpbmcgY2FsbHM6IGBwbGFjZW1lbnRzKC4uLilgICh3aGljaCB1cHNlbGwgc3VyZmFjZXMgYVxuICogY2hhbm5lbCBzaG91bGQgcmVuZGVyIGZvciBhIHRlbmFudCkgYW5kIGBzdWdnZXN0KC4uLilgIChpdGVtcyBmb3Igb25lXG4gKiBwbGFjZW1lbnQgZ2l2ZW4gdGhlIGxpdmUgY2FydCkuIGByZXBvcnRFdmVudHMoLi4uKWAgZmVlZHMgYXR0YWNoLXJhdGVcbiAqIHRlbGVtZXRyeS4gUGxhY2VtZW50IGNvbmZpZyBpcyBtYW5hZ2VkIHZpYSB0aGUgc2VydmljZS1hY3Rvci1vbmx5XG4gKiBhZG1pbiBtZXRob2RzLlxuICovXG5cbmV4cG9ydCB0eXBlIENoYW5uZWwgPSAnbW9iaWxlX2FwcCcgfCAna2lvc2snIHwgJ3doaXRlbGFiZWxfd2ViJyB8ICd3aGF0c2FwcCcgfCAndm9pY2UnO1xuXG4vKipcbiAqIEEgbW9tZW50IGluIHRoZSBjdXN0b21lciBqb3VybmV5IOKAlCB0aGUgdW5pdCBvZiBwbGF0Zm9ybSBwb2xpY3lcbiAqIChwcmljZSBiYW5kLCBtYXggaXRlbXMsIGFuZCBsYXRlciB0aGUgc2lnbmFsIHdlaWdodCBwcm9maWxlKS4gQVxuICogcGxhY2VtZW50IGlzIGEgY2hhbm5lbCdzIGpvdXJuZXkgbGFiZWwgcG9pbnRpbmcgYXQgb25lIG9mIHRoZXNlLlxuICovXG5leHBvcnQgdHlwZSBUb3VjaHBvaW50ID1cbiAgfCAnaG9tZSdcbiAgfCAnbWVudV9icm93c2luZydcbiAgfCAnbWVudV9jb21wb3NpbmcnXG4gIHwgJ3NlYXJjaF9ub19yZXN1bHQnXG4gIHwgJ2NhcnQnXG4gIHwgJ3ByZV9jaGVja291dCdcbiAgfCAncG9zdF9vcmRlcic7XG5cbi8qKlxuICogUmVuZGVyaW5nIGhpbnQsIG93bmVkIGJ5IHRoZSBjaGFubmVsIGZyb250ZW5kIOKAlCB0aGUgcGxhdGZvcm0gbmV2ZXJcbiAqIGludGVycHJldHMgaXQuIEtub3duIHZhbHVlcyBhcmUgbGlzdGVkIGZvciBlZGl0b3IgY29tcGxldGlvbiwgYnV0IGFueVxuICogbG93ZXJjYXNlIGlkZW50aWZpZXIgaXMgdmFsaWQgc28gbmV3IGxheW91dHMgbmVlZCBubyBTREsgcmVsZWFzZS5cbiAqL1xuZXhwb3J0IHR5cGUgS25vd25MYXlvdXQgPVxuICB8ICdjYXJvdXNlbF8ydXAnXG4gIHwgJ2hvcml6b250YWxfY2Fyb3VzZWwnXG4gIHwgJ2dyaWRfMnhuX21vZGFsJ1xuICB8ICdjYXJvdXNlbF8xdXAnXG4gIHwgJ3ZlcnRpY2FsX2xpc3QnXG4gIHwgJ2dyaWRfM3huJ1xuICB8ICdjb21wYWN0X2xpc3QnXG4gIHwgJ2hlcm9fYmFubmVyJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0ID0gS25vd25MYXlvdXQgfCAoc3RyaW5nICYge30pO1xuXG4vKiogV2h5IGFuIGl0ZW0gd2FzIHJlY29tbWVuZGVkLiBDaGFubmVscyByZW5kZXIgdGhlc2UgaW4gY3VzdG9tZXIgbGFuZ3VhZ2UuICovXG5leHBvcnQgdHlwZSBSZWFzb25Db2RlID1cbiAgfCAncG9wdWxhcl9ub3cnXG4gIHwgJ2NvbXBsZXRlc19tZWFsJ1xuICB8ICdvZnRlbl9vcmRlcmVkX3RvZ2V0aGVyJ1xuICB8ICd5b3VyX3VzdWFsJ1xuICB8ICdjaGVmc19waWNrJztcblxuLyoqIFdoaWNoIHJ1bmcgb2YgdGhlIHJlc29sdXRpb24gbGFkZGVyIGFuc3dlcmVkIHRoZSByZXF1ZXN0LiAqL1xuZXhwb3J0IHR5cGUgTGFkZGVyUnVuZyA9XG4gIHwgJ2Z1bGxfZW5naW5lJ1xuICB8ICdiYW5kX3JlbGF4YXRpb24nXG4gIHwgJ3BvcHVsYXJpdHlfZmxvb3InXG4gIHwgJ2JhY2t1cF9zdWdnZXN0aW9ucydcbiAgfCAnZW1wdHlfZGVncmFkZWQnO1xuXG5leHBvcnQgdHlwZSBVcHNlbGxTdHJhdGVneSA9ICdtZW51LW9yZGVyLXBvcHVsYXJpdHknIHwgJ2xlZ2FjeS1jYXRhbG9nLXNhbXBsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VtZW50RGlzcGxheSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKiBSZXF1ZXN0ZWQgY291bnQuIFRvdWNocG9pbnQgcG9saWN5IG1heSBjYXAgaXQgbG93ZXIg4oCUIHNlZSBgbWV0YS5tYXhJdGVtc2AuICovXG4gIG1heEl0ZW1zOiBudW1iZXI7XG4gIGxheW91dDogTGF5b3V0O1xufVxuXG4vKiogUmVzb2x2ZWQgcHVibGljIHBsYWNlbWVudCAoYnVzaW5lc3Mgb3ZlcnJpZGUgPiBicmFuZCA+IHBsYXRmb3JtIGRlZmF1bHQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZW1lbnQge1xuICBrZXk6IHN0cmluZztcbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAgdG91Y2hwb2ludDogVG91Y2hwb2ludDtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgZGlzcGxheTogUGxhY2VtZW50RGlzcGxheTtcbiAgY29uZmlnVmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbmFudCB7XG4gIHBhcmVudElkOiBudW1iZXI7XG4gIGJ1c2luZXNzSWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXJ0SXRlbSB7XG4gIGl0ZW1JZDogbnVtYmVyO1xuICBxdHk6IG51bWJlcjtcbiAgdW5pdFByaWNlOiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbDsgbGV0cyB0aGUgZGlldGFyeSBnYXRlIGFuZCBjYXRlZ29yeSBuby1yZXBlYXQgc2VlIGNhcnQgY29udGVudHMuICovXG4gIGl0ZW1TbHVnPzogc3RyaW5nO1xuICBzZWN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIExlZ2FjeSB2ZWdOb252ZWdCb3RoIGZsYWc6IDEgdmVnLCAyIG5vbi12ZWcsIDMgYm90aC9lZ2cuICovXG4gIHZlZz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXJ0IHtcbiAgaXRlbXM6IENhcnRJdGVtW107XG4gIHN1YnRvdGFsOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VnZ2VzdGlvbnNJbnB1dCB7XG4gIGNoYW5uZWw6IENoYW5uZWw7XG4gIHBsYWNlbWVudDogc3RyaW5nO1xuICB0ZW5hbnQ6IFRlbmFudDtcbiAgY29udGV4dDoge1xuICAgIGNhcnQ6IENhcnQ7XG4gICAgZnVsZmlsbWVudE1vZGU/OiAnZGVsaXZlcnknIHwgJ3BpY2t1cCcgfCAnZGluZV9pbic7XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWw7IHVudXNlZCBieSB0aGUgdjEgc2NvcmVycy4gSW4gdGhlIGNvbnRyYWN0IGZyb20gZGF5IG9uZVxuICAgICAqIHNvIHBlcnNvbmFsaXphdGlvbiBsYW5kcyB3aXRob3V0IGEgYnJlYWsuIGBpZGAgTVVTVCBiZSB0aGUgb3BhcXVlXG4gICAgICogcGxhdGZvcm0gY3VzdG9tZXIgaWQsIG5ldmVyIGEgbW9iaWxlIG51bWJlci5cbiAgICAgKi9cbiAgICBjdXN0b21lcj86IHsgaWQ6IHN0cmluZyB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsOyBub3QgeWV0IGFjdGVkIG9uLiBJbXByZXNzaW9uIGZhdGlndWUgaXMgc2Vzc2lvbi1zY29wZWRcbiAgICAgKiBhbmQgc2hhcmVkIGFjcm9zcyB0b3VjaHBvaW50cyDigJQgc2VuZCBpdCBub3cgc28gY2hhbm5lbHNcbiAgICAgKiBpbnN0cnVtZW50IG9uY2UgcmF0aGVyIHRoYW4gdHdpY2UuXG4gICAgICovXG4gICAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwc2VsbEl0ZW0ge1xuICBpdGVtSWQ6IG51bWJlcjtcbiAgaXRlbU5hbWU6IHN0cmluZztcbiAgaXRlbVNsdWc6IHN0cmluZyB8IG51bGw7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBzZWN0aW9uSWQ6IG51bWJlciB8IG51bGw7XG4gIHNlY3Rpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xuICAvKiogU2VsbGluZyBwcmljZSAoSU5SKS4gKi9cbiAgcHJpY2U6IG51bWJlcjtcbiAgaW1hZ2U6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBSYXcgbGVnYWN5IGB2ZWdOb252ZWdCb3RoYCBmbGFnLCBwYXNzZWQgdGhyb3VnaCB1bnRyYW5zbGF0ZWQuICovXG4gIHZlZzogbnVtYmVyIHwgbnVsbDtcbiAgYnJhbmRJZDogbnVtYmVyIHwgbnVsbDtcbiAgcmVhc29uQ29kZTogUmVhc29uQ29kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWdnZXN0aW9uc1Jlc3VsdCB7XG4gIHBsYWNlbWVudDogc3RyaW5nO1xuICB0b3VjaHBvaW50OiBUb3VjaHBvaW50O1xuICBpdGVtczogVXBzZWxsSXRlbVtdO1xuICBtZXRhOiB7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBzdHJhdGVneTogVXBzZWxsU3RyYXRlZ3k7XG4gICAgY29uZmlnVmVyc2lvbjogc3RyaW5nO1xuICAgIC8qKiBXaGljaCBsYWRkZXIgcnVuZyBwcm9kdWNlZCB0aGVzZSBpdGVtcy4gKi9cbiAgICBydW5nOiBMYWRkZXJSdW5nO1xuICAgIC8qKiBFZmZlY3RpdmUgY2FwIGFwcGxpZWQ6IG1pbihkaXNwbGF5Lm1heEl0ZW1zLCB0b3VjaHBvaW50IHBvbGljeSkuICovXG4gICAgbWF4SXRlbXM6IG51bWJlcjtcbiAgICAvKiogSG93IGxvbmcgdGhlIGNsaWVudCBtYXkgcmV1c2UgdGhpcyByZXNwb25zZSwgaW4gc2Vjb25kcy4gKi9cbiAgICB0dGxTZWNvbmRzOiBudW1iZXI7XG4gICAgLyoqIFRydWUgd2hlbiB0aGUgY2FuZGlkYXRlIHNvdXJjZSBmYWlsZWQgYW5kIHRoZSBzZXJ2aWNlIGRlZ3JhZGVkIHRvIGVtcHR5LiAqL1xuICAgIGRlZ3JhZGVkPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuLyoqIE1lcmNoYW50LWNvbnRyb2xsZWQgc2VsZWN0aW9uIGlucHV0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyYXRlZ3lQYXJhbXMge1xuICBpbmNsdWRlZEl0ZW1TbHVncz86IHN0cmluZ1tdO1xuICBpbmNsdWRlZFNlY3Rpb25zPzogc3RyaW5nW107XG4gIGV4Y2x1ZGVkU2VjdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqIFwiTmV2ZXIgU3VnZ2VzdCBUaGVzZVwiIOKAlCBhYnNvbHV0ZSwgb3ZlcnJpZGVzIHRoZSBwcmlvcml0eSBsaXN0LiAqL1xuICBuZXZlclN1Z2dlc3RJdGVtU2x1Z3M/OiBzdHJpbmdbXTtcbiAgLyoqIFwiTXkgUHJpb3JpdHkgSXRlbXNcIiDigJQgb2NjdXB5IHJlc2VydmVkIHNsb3RzIGFoZWFkIG9mIHNjb3JlZCBpdGVtcy4gKi9cbiAgcHJpb3JpdHlJdGVtU2x1Z3M/OiBzdHJpbmdbXTtcbiAgLyoqIFwiQmFja3VwIFN1Z2dlc3Rpb25zXCIg4oCUIDItNiBpdGVtcywgc2VydmVkIHdoZW4gZXZlcnl0aGluZyBlbHNlIGlzIGVtcHR5LiAqL1xuICBiYWNrdXBJdGVtU2x1Z3M/OiBzdHJpbmdbXTtcbiAgZXhjbHVkZUNhcnRJdGVtcz86IGJvb2xlYW47XG4gIG1heFByaWNlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBQbGFjZW1lbnRTY29wZSA9ICdkZWZhdWx0JyB8ICd0ZW5hbnQnIHwgJ2J1c2luZXNzJztcblxuLyoqIFJhdyBhZG1pbi1wbGFuZSBjb25maWcgcm93IChubyBwcmVjZWRlbmNlIG1lcmdlIGFwcGxpZWQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZW1lbnRSZWNvcmQge1xuICBzY29wZTogUGxhY2VtZW50U2NvcGU7XG4gIHBhcmVudElkPzogbnVtYmVyO1xuICBidXNpbmVzc0lkPzogbnVtYmVyO1xuICBjaGFubmVsOiBDaGFubmVsO1xuICBrZXk6IHN0cmluZztcbiAgdG91Y2hwb2ludDogVG91Y2hwb2ludDtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgZGlzcGxheTogUGxhY2VtZW50RGlzcGxheTtcbiAgc3RyYXRlZ3k6IFVwc2VsbFN0cmF0ZWd5O1xuICBzdHJhdGVneVBhcmFtczogU3RyYXRlZ3lQYXJhbXM7XG4gIGNvbmZpZ1ZlcnNpb246IHN0cmluZztcbiAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRCeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFkbWluIHVwc2VydC4gU2NvcGUgaXMgZGVyaXZlZDogbm8gcGFyZW50SWQg4oaSIHBsYXRmb3JtIGRlZmF1bHQ7XG4gKiBwYXJlbnRJZCBvbmx5IOKGkiBicmFuZCByb3c7IHBhcmVudElkICsgYnVzaW5lc3NJZCDihpIgYnVzaW5lc3Mgb3ZlcnJpZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VtZW50VXBzZXJ0SW5wdXQge1xuICBwYXJlbnRJZD86IG51bWJlcjtcbiAgYnVzaW5lc3NJZD86IG51bWJlcjtcbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAga2V5OiBzdHJpbmc7XG4gIHRvdWNocG9pbnQ6IFRvdWNocG9pbnQ7XG4gIGVuYWJsZWQ6IGJvb2xlYW47XG4gIGRpc3BsYXk6IFBsYWNlbWVudERpc3BsYXk7XG4gIHN0cmF0ZWd5PzogVXBzZWxsU3RyYXRlZ3k7XG4gIHN0cmF0ZWd5UGFyYW1zPzogU3RyYXRlZ3lQYXJhbXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VtZW50RGVsZXRlSW5wdXQge1xuICBwYXJlbnRJZD86IG51bWJlcjtcbiAgYnVzaW5lc3NJZD86IG51bWJlcjtcbiAgY2hhbm5lbDogQ2hhbm5lbDtcbiAga2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXF1aXJlZCBieSB0aGUgc2VydmVyIHdoZW4gYHBhcmVudElkYCBpcyBvbWl0dGVkLCBiZWNhdXNlIHRoYXQgY2FsbFxuICAgKiB0YXJnZXRzIHRoZSBQTEFURk9STSBERUZBVUxUIHJvdyBhbmQgc28gcmVtb3ZlcyB0aGUgcGxhY2VtZW50IGZvclxuICAgKiBldmVyeSB0ZW5hbnQgdGhhdCBoYXMgbm90IG92ZXJyaWRkZW4gaXQuIFdpdGhvdXQgdGhpcyB0aGUgc2VydmVyXG4gICAqIHJlamVjdHMgdGhlIHJlcXVlc3Qgd2l0aCA0MDAgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgdGhhdCBhIG1pc3NpbmdcbiAgICogcGFyZW50SWQgd2FzIGRlbGliZXJhdGUuXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBub3QgZGVmYXVsdGVkIHRvIGB0cnVlYCBoZXJlOiB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlXG4gICAqIGZsYWcgaXMgdGhhdCBkZWxldGluZyBhIGRlZmF1bHQgbXVzdCBiZSBzdGF0ZWQsIG5vdCBpbmZlcnJlZCBmcm9tXG4gICAqIHRoZSBzaGFwZSBvZiB0aGUgY2FsbC5cbiAgICovXG4gIGNvbmZpcm1EZWxldGVEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFjZW1lbnRzUXVlcnkge1xuICBjaGFubmVsOiBDaGFubmVsO1xuICBwYXJlbnRJZDogbnVtYmVyO1xuICBidXNpbmVzc0lkOiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgOKUgCBBdHRhY2gtcmF0ZSB0ZWxlbWV0cnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCB0eXBlIFVwc2VsbEV2ZW50VHlwZSA9ICdzaG93bicgfCAnYWRkZWQnIHwgJ2lnbm9yZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwc2VsbEV2ZW50IHtcbiAgdHlwZTogVXBzZWxsRXZlbnRUeXBlO1xuICBpdGVtSWQ6IG51bWJlcjtcbiAgcmVhc29uQ29kZT86IFJlYXNvbkNvZGU7XG4gIC8qKiBJU08tODYwMS4gRGVmYXVsdHMgdG8gc2VydmVyIHJlY2VpdmUgdGltZSB3aGVuIG9taXR0ZWQuICovXG4gIG9jY3VycmVkQXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBzZWxsRXZlbnRzSW5wdXQge1xuICBjaGFubmVsOiBDaGFubmVsO1xuICBwbGFjZW1lbnQ6IHN0cmluZztcbiAgdGVuYW50OiBUZW5hbnQ7XG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgLyoqIEVjaG8gYG1ldGEuY29uZmlnVmVyc2lvbmAgZnJvbSB0aGUgcmVzcG9uc2UgYmVpbmcgcmVwb3J0ZWQgb24uICovXG4gIGNvbmZpZ1ZlcnNpb24/OiBzdHJpbmc7XG4gIGV2ZW50czogVXBzZWxsRXZlbnRbXTtcbn1cbiJdfQ==
package/dist/version.d.ts CHANGED
@@ -4,5 +4,11 @@
4
4
  * value from package.json at runtime would require either a JSON import
5
5
  * (TS lib settings dependent) or a build-time replacement, and the
6
6
  * cost of one bump-in-two-places per release is small.
7
+ *
8
+ * That cost was underestimated once: the publish job verifies
9
+ * package.json against the release tag but never reads this file, so the
10
+ * two drifted and 1.0.0 shipped reporting 0.9.1. A test now pins them
11
+ * together (`test/upsell/client.test.ts`), so forgetting this bump fails
12
+ * the build instead of the User-Agent.
7
13
  */
8
- export declare const SDK_VERSION = "0.9.1";
14
+ export declare const SDK_VERSION = "2.1.0";
package/dist/version.js CHANGED
@@ -7,6 +7,12 @@ exports.SDK_VERSION = void 0;
7
7
  * value from package.json at runtime would require either a JSON import
8
8
  * (TS lib settings dependent) or a build-time replacement, and the
9
9
  * cost of one bump-in-two-places per release is small.
10
+ *
11
+ * That cost was underestimated once: the publish job verifies
12
+ * package.json against the release tag but never reads this file, so the
13
+ * two drifted and 1.0.0 shipped reporting 0.9.1. A test now pins them
14
+ * together (`test/upsell/client.test.ts`), so forgetting this bump fails
15
+ * the build instead of the User-Agent.
10
16
  */
11
- exports.SDK_VERSION = '0.9.1';
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7Ozs7R0FNRztBQUNVLFFBQUEsV0FBVyxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFudWFsbHktbWFpbnRhaW5lZCB2ZXJzaW9uIHN0cmluZyBzdXJmYWNlZCB2aWEgdGhlIGBVc2VyLUFnZW50YFxuICogaGVhZGVyLiBLZXB0IGluIHN5bmMgd2l0aCBgcGFja2FnZS5qc29uYCBieSBoYW5kIGJlY2F1c2UgcHVsbGluZyB0aGVcbiAqIHZhbHVlIGZyb20gcGFja2FnZS5qc29uIGF0IHJ1bnRpbWUgd291bGQgcmVxdWlyZSBlaXRoZXIgYSBKU09OIGltcG9ydFxuICogKFRTIGxpYiBzZXR0aW5ncyBkZXBlbmRlbnQpIG9yIGEgYnVpbGQtdGltZSByZXBsYWNlbWVudCwgYW5kIHRoZVxuICogY29zdCBvZiBvbmUgYnVtcC1pbi10d28tcGxhY2VzIHBlciByZWxlYXNlIGlzIHNtYWxsLlxuICovXG5leHBvcnQgY29uc3QgU0RLX1ZFUlNJT04gPSAnMC45LjEnO1xuIl19
17
+ exports.SDK_VERSION = '2.1.0';
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUNVLFFBQUEsV0FBVyxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFudWFsbHktbWFpbnRhaW5lZCB2ZXJzaW9uIHN0cmluZyBzdXJmYWNlZCB2aWEgdGhlIGBVc2VyLUFnZW50YFxuICogaGVhZGVyLiBLZXB0IGluIHN5bmMgd2l0aCBgcGFja2FnZS5qc29uYCBieSBoYW5kIGJlY2F1c2UgcHVsbGluZyB0aGVcbiAqIHZhbHVlIGZyb20gcGFja2FnZS5qc29uIGF0IHJ1bnRpbWUgd291bGQgcmVxdWlyZSBlaXRoZXIgYSBKU09OIGltcG9ydFxuICogKFRTIGxpYiBzZXR0aW5ncyBkZXBlbmRlbnQpIG9yIGEgYnVpbGQtdGltZSByZXBsYWNlbWVudCwgYW5kIHRoZVxuICogY29zdCBvZiBvbmUgYnVtcC1pbi10d28tcGxhY2VzIHBlciByZWxlYXNlIGlzIHNtYWxsLlxuICpcbiAqIFRoYXQgY29zdCB3YXMgdW5kZXJlc3RpbWF0ZWQgb25jZTogdGhlIHB1Ymxpc2ggam9iIHZlcmlmaWVzXG4gKiBwYWNrYWdlLmpzb24gYWdhaW5zdCB0aGUgcmVsZWFzZSB0YWcgYnV0IG5ldmVyIHJlYWRzIHRoaXMgZmlsZSwgc28gdGhlXG4gKiB0d28gZHJpZnRlZCBhbmQgMS4wLjAgc2hpcHBlZCByZXBvcnRpbmcgMC45LjEuIEEgdGVzdCBub3cgcGlucyB0aGVtXG4gKiB0b2dldGhlciAoYHRlc3QvdXBzZWxsL2NsaWVudC50ZXN0LnRzYCksIHNvIGZvcmdldHRpbmcgdGhpcyBidW1wIGZhaWxzXG4gKiB0aGUgYnVpbGQgaW5zdGVhZCBvZiB0aGUgVXNlci1BZ2VudC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNES19WRVJTSU9OID0gJzIuMS4wJztcbiJdfQ==
@@ -13,9 +13,17 @@ export interface Wallet {
13
13
  getInstance(): Promise<WalletInstance>;
14
14
  /** The wallet's currency `{code, symbol}` (a slice of getInstance()). */
15
15
  getCurrency(): Promise<Currency>;
16
- /** POST /v1/wallet/transactions (type=debit). Idempotent on `referenceId`. */
16
+ /**
17
+ * POST /v1/wallet/transactions (type=debit). Idempotent on
18
+ * `referenceId`. Pass `wallet` to charge a wallet other than the one
19
+ * this handle routes to.
20
+ */
17
21
  debit(input: DebitInput): Promise<TransactionResult>;
18
- /** POST /v1/wallet/transactions (type=credit). Pass `reversalOf` for a refund. */
22
+ /**
23
+ * POST /v1/wallet/transactions (type=credit). Pass `reversalOf` for a
24
+ * refund capped by the original debit, or `isRefund` for one computed
25
+ * independently of it.
26
+ */
19
27
  credit(input: CreditInput): Promise<TransactionResult>;
20
28
  /** GET /v1/wallet/transactions — newest-first, keyset-paginated. */
21
29
  listTransactions(filter?: ListTransactionsFilter): Promise<TransactionPage>;
@@ -54,6 +62,15 @@ export declare class InvalidReversalError extends WalletApiError {
54
62
  export declare class IdempotencyConflictError extends WalletApiError {
55
63
  constructor(body: string);
56
64
  }
65
+ /**
66
+ * A `wallet` override named a `parentBusinessId` the wallet document
67
+ * contradicts (HTTP 409). Nothing was moved — the write is refused rather
68
+ * than charging the right wallet under the wrong identity, which would
69
+ * misattribute the ledger row and split its idempotency scope.
70
+ */
71
+ export declare class WalletIdentityMismatchError extends WalletApiError {
72
+ constructor(body: string);
73
+ }
57
74
  /** The business, or the business its `bId_deduction` points to, does not exist (HTTP 422). */
58
75
  export declare class UnresolvableWalletError extends WalletApiError {
59
76
  constructor(body: string);
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WalletNotFoundError = exports.UnresolvableWalletError = exports.IdempotencyConflictError = exports.InvalidReversalError = exports.OverRefundError = exports.InsufficientBalanceError = exports.WalletApiError = void 0;
3
+ exports.WalletNotFoundError = exports.UnresolvableWalletError = exports.WalletIdentityMismatchError = exports.IdempotencyConflictError = exports.InvalidReversalError = exports.OverRefundError = exports.InsufficientBalanceError = exports.WalletApiError = void 0;
4
4
  exports.createWalletClient = createWalletClient;
5
5
  const config_1 = require("../config");
6
6
  const http_1 = require("../http");
@@ -49,6 +49,19 @@ class IdempotencyConflictError extends WalletApiError {
49
49
  }
50
50
  }
51
51
  exports.IdempotencyConflictError = IdempotencyConflictError;
52
+ /**
53
+ * A `wallet` override named a `parentBusinessId` the wallet document
54
+ * contradicts (HTTP 409). Nothing was moved — the write is refused rather
55
+ * than charging the right wallet under the wrong identity, which would
56
+ * misattribute the ledger row and split its idempotency scope.
57
+ */
58
+ class WalletIdentityMismatchError extends WalletApiError {
59
+ constructor(body) {
60
+ super(409, body);
61
+ this.name = 'WalletIdentityMismatchError';
62
+ }
63
+ }
64
+ exports.WalletIdentityMismatchError = WalletIdentityMismatchError;
52
65
  /** The business, or the business its `bId_deduction` points to, does not exist (HTTP 422). */
53
66
  class UnresolvableWalletError extends WalletApiError {
54
67
  constructor(body) {
@@ -93,6 +106,9 @@ function walletError(status, body) {
93
106
  return new OverRefundError(body);
94
107
  if (status === 409 && code === 'idempotency_conflict')
95
108
  return new IdempotencyConflictError(body);
109
+ if (status === 409 && code === 'wallet_identity_mismatch') {
110
+ return new WalletIdentityMismatchError(body);
111
+ }
96
112
  if (status === 422 && code === 'invalid_reversal')
97
113
  return new InvalidReversalError(body);
98
114
  if (status === 422 && code === 'unresolvable_wallet')
@@ -127,7 +143,10 @@ function createWalletClient(input = {}) {
127
143
  };
128
144
  const postTransaction = async (type, body) => {
129
145
  const path = '/v1/wallet/transactions';
130
- const payload = JSON.stringify({ businessId, forceChildWallet, type, ...body });
146
+ // The wallet identity is exactly-one-of server-side, so an explicit
147
+ // `wallet` override REPLACES this handle's businessId rather than
148
+ // travelling alongside it — sending both is a 400.
149
+ const payload = JSON.stringify(body.wallet ? { type, ...body } : { businessId, forceChildWallet, type, ...body });
131
150
  const config = state.resolve();
132
151
  const res = await (0, http_1.sendWithAuthRetry)(config, {
133
152
  method: 'POST',
@@ -220,4 +239,4 @@ function createWalletClient(input = {}) {
220
239
  };
221
240
  return client;
222
241
  }
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhbGxldC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdUpBLGdEQWdIQztBQXZRRCxzQ0FLbUI7QUFDbkIsa0NBQTRDO0FBZ0Q1QyxNQUFhLGNBQWUsU0FBUSxLQUFLO0lBQzlCLE1BQU0sQ0FBUztJQUNmLElBQUksQ0FBUztJQUV0QixZQUFZLE1BQWMsRUFBRSxJQUFZO1FBQ3RDLEtBQUssQ0FBQyxjQUFjLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBVkQsd0NBVUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBYSx3QkFBeUIsU0FBUSxjQUFjO0lBQ2pELFlBQVksQ0FBUztJQUM5QixZQUFZLFlBQW9CLEVBQUUsSUFBWTtRQUM1QyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBUEQsNERBT0M7QUFFRCw4RUFBOEU7QUFDOUUsTUFBYSxlQUFnQixTQUFRLGNBQWM7SUFDakQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFMRCwwQ0FLQztBQUVELDhFQUE4RTtBQUM5RSxNQUFhLG9CQUFxQixTQUFRLGNBQWM7SUFDdEQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxD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LE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDN0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFvQixDQUFDO2dCQUMvQyxDQUFDO2dCQUNELEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDckIsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLEVBQUUsRUFBRSxDQUFDO29CQUM3QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSx3QkFBaUIsRUFBQyxNQUFNLEVBQUU7d0JBQzFDLE1BQU0sRUFBRSxLQUFLO3dCQUNiLElBQUk7d0JBQ0osR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7cUJBQzNELENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQUUsTUFBTSxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUM3RCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQXNCLENBQUM7Z0JBQ2pELENBQUM7YUFDRixDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZmlnU3RhdGUsXG4gIHR5cGUgUGxhdGZvcm1BdXRoLFxuICB0eXBlIFBsYXRmb3JtQXV0aElucHV0LFxuICB0eXBlIFBsYXRmb3JtQ29uZmlnSW5wdXQsXG59IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBzZW5kV2l0aEF1dGhSZXRyeSB9IGZyb20gJy4uL2h0dHAnO1xuaW1wb3J0IHR5cGUge1xuICBDcmVkaXRJbnB1dCxcbiAgQ3VycmVuY3ksXG4gIERlYml0SW5wdXQsXG4gIEdldFdhbGxldE9wdGlvbnMsXG4gIExpc3RUcmFuc2FjdGlvbnNGaWx0ZXIsXG4gIFRyYW5zYWN0aW9uUGFnZSxcbiAgVHJhbnNhY3Rpb25SZXN1bHQsXG4gIFdhbGxldEJhbGFuY2UsXG4gIFdhbGxldEluc3RhbmNlLFxuICBXYWxsZXRUcmFuc2FjdGlvbixcbn0gZnJvbSAnLi9zY2hlbWEnO1xuXG4vKipcbiAqIEEgaGFuZGxlIHRvIG9uZSBidXNpbmVzcyB3YWxsZXQuIENoZWFwIHRvIGNyZWF0ZSDigJQgYGdldFdhbGxldCguLi4pYFxuICogZG9lcyBubyBJL08uIFRoZSB3YWxsZXQgaXMgcmVzb2x2ZWQgc2VydmVyLXNpZGUgb24gdGhlIGZpcnN0XG4gKiBvcGVyYXRpb24sIHNvIGBVbnJlc29sdmFibGVXYWxsZXRFcnJvcmAgLyBgV2FsbGV0Tm90Rm91bmRFcnJvcmBcbiAqIHN1cmZhY2UgZnJvbSB0aGUgb3BlcmF0aW9uLCBub3QgZnJvbSBgZ2V0V2FsbGV0KClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldCB7XG4gIC8qKiBHRVQgL3YxL3dhbGxldC9iYWxhbmNlIOKAlCByZXNvbHZlcyB0aGUgd2FsbGV0IGFuZCByZXR1cm5zIGl0cyBiYWxhbmNlICsgY3VycmVuY3kuICovXG4gIGdldEJhbGFuY2UoKTogUHJvbWlzZTxXYWxsZXRCYWxhbmNlPjtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L2luc3RhbmNlIOKAlCB3YWxsZXQgaWRlbnRpdHkgKyBjdXJyZW5jeSwgd2l0aG91dCB0aGUgYmFsYW5jZS4gKi9cbiAgZ2V0SW5zdGFuY2UoKTogUHJvbWlzZTxXYWxsZXRJbnN0YW5jZT47XG4gIC8qKiBUaGUgd2FsbGV0J3MgY3VycmVuY3kgYHtjb2RlLCBzeW1ib2x9YCAoYSBzbGljZSBvZiBnZXRJbnN0YW5jZSgpKS4gKi9cbiAgZ2V0Q3VycmVuY3koKTogUHJvbWlzZTxDdXJyZW5jeT47XG4gIC8qKiBQT1NUIC92MS93YWxsZXQvdHJhbnNhY3Rpb25zICh0eXBlPWRlYml0KS4gSWRlbXBvdGVudCBvbiBgcmVmZXJlbmNlSWRgLiAqL1xuICBkZWJpdChpbnB1dDogRGViaXRJbnB1dCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+O1xuICAvKiogUE9TVCAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyAodHlwZT1jcmVkaXQpLiBQYXNzIGByZXZlcnNhbE9mYCBmb3IgYSByZWZ1bmQuICovXG4gIGNyZWRpdChpbnB1dDogQ3JlZGl0SW5wdXQpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PjtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyDigJQgbmV3ZXN0LWZpcnN0LCBrZXlzZXQtcGFnaW5hdGVkLiAqL1xuICBsaXN0VHJhbnNhY3Rpb25zKGZpbHRlcj86IExpc3RUcmFuc2FjdGlvbnNGaWx0ZXIpOiBQcm9taXNlPFRyYW5zYWN0aW9uUGFnZT47XG4gIC8qKiBHRVQgL3YxL3dhbGxldC90cmFuc2FjdGlvbnMvOmlkIOKAlCBzY29wZWQgdG8gdGhpcyB3YWxsZXQuICovXG4gIGdldFRyYW5zYWN0aW9uKGlkOiBzdHJpbmcpOiBQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRDbGllbnQge1xuICBjb25maWcoaW5wdXQ6IFBsYXRmb3JtQ29uZmlnSW5wdXQpOiBXYWxsZXRDbGllbnQ7XG4gIGF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogV2FsbGV0Q2xpZW50O1xuICAvKipcbiAgICogQnVpbGQgYSBoYW5kbGUgdG8gYSBidXNpbmVzcyB3YWxsZXQuIFN5bmNocm9ub3VzIGFuZCBJL08tZnJlZSDigJQgaXRcbiAgICogb25seSBwYXJzZXMgYGlkYC4gUmVxdWlyZXMgYSBzZXJ2aWNlIHRva2VuIGNhcnJ5aW5nIHRoZSByZWxldmFudFxuICAgKiBgd2FsbGV0LipgIHNjb3BlIGZvciB0aGUgb3BlcmF0aW9ucyBvbiB0aGUgcmV0dXJuZWQgaGFuZGxlLlxuICAgKi9cbiAgZ2V0V2FsbGV0KG9wdHM6IEdldFdhbGxldE9wdGlvbnMpOiBXYWxsZXQ7XG59XG5cbmV4cG9ydCBjbGFzcyBXYWxsZXRBcGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzdGF0dXM6IG51bWJlciwgYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYHdhbGxldCBBUEkgJHtzdGF0dXN9OiAke2JvZHl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ1dhbGxldEFwaUVycm9yJztcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLmJvZHkgPSBib2R5O1xuICB9XG59XG5cbi8qKiBBIGRlYml0IHdvdWxkIG92ZXJkcmF3IHRoZSB3YWxsZXQ7IG5vdGhpbmcgd2FzIG1vdmVkIChIVFRQIDQwOSkuICovXG5leHBvcnQgY2xhc3MgSW5zdWZmaWNpZW50QmFsYW5jZUVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICByZWFkb25seSBiYWxhbmNlTWlub3I6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoYmFsYW5jZU1pbm9yOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQwOSwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0luc3VmZmljaWVudEJhbGFuY2VFcnJvcic7XG4gICAgdGhpcy5iYWxhbmNlTWlub3IgPSBiYWxhbmNlTWlub3I7XG4gIH1cbn1cblxuLyoqIEEgcmVmdW5kIHdvdWxkIHB1c2ggdG90YWwgcmV2ZXJzYWxzIHBhc3QgdGhlIG9yaWdpbmFsIGRlYml0IChIVFRQIDQwOSkuICovXG5leHBvcnQgY2xhc3MgT3ZlclJlZnVuZEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdPdmVyUmVmdW5kRXJyb3InO1xuICB9XG59XG5cbi8qKiBgcmV2ZXJzYWxPZmAgZG9lc24ndCByZWZlcmVuY2UgYSB2YWxpZCBkZWJpdCBvbiB0aGlzIHdhbGxldCAoSFRUUCA0MjIpLiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRSZXZlcnNhbEVycm9yIGV4dGVuZHMgV2FsbGV0QXBpRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MjIsIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkUmV2ZXJzYWxFcnJvcic7XG4gIH1cbn1cblxuLyoqIEEgYHJlZmVyZW5jZUlkYCB3YXMgcmV1c2VkIHdpdGggYSBkaWZmZXJlbnQgYW1vdW50L3R5cGUvc2VydmljZSAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIElkZW1wb3RlbmN5Q29uZmxpY3RFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnSWRlbXBvdGVuY3lDb25mbGljdEVycm9yJztcbiAgfVxufVxuXG4vKiogVGhlIGJ1c2luZXNzLCBvciB0aGUgYnVzaW5lc3MgaXRzIGBiSWRfZGVkdWN0aW9uYCBwb2ludHMgdG8sIGRvZXMgbm90IGV4aXN0IChIVFRQIDQyMikuICovXG5leHBvcnQgY2xhc3MgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQyMiwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ1VucmVzb2x2YWJsZVdhbGxldEVycm9yJztcbiAgfVxufVxuXG4vKiogTm8gd2FsbGV0IGRvY3VtZW50LCBvciBubyBzdWNoIHRyYW5zYWN0aW9uIG9uIHRoaXMgd2FsbGV0IChIVFRQIDQwNCkuICovXG5leHBvcnQgY2xhc3MgV2FsbGV0Tm90Rm91bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA0LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0Tm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuY29uc3QgQlVTSU5FU1NfSURfUkUgPSAvXmJ1c2luZXNzOihcXGQrKSQvO1xuXG4vKiogUGFyc2UgYSB0eXBlZCB3YWxsZXQgaWQgKGBcImJ1c2luZXNzOjg4NDFcImApIGludG8gdGhlIG51bWVyaWMgYnVzaW5lc3MgaWQuICovXG5mdW5jdGlvbiBwYXJzZUJ1c2luZXNzSWQoaWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IG1hdGNoID0gQlVTSU5FU1NfSURfUkUuZXhlYyhpZCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgd2FsbGV0LmdldFdhbGxldDogaWQgbXVzdCBsb29rIGxpa2UgXCJidXNpbmVzczo8cG9zaXRpdmUgaW50ZWdlcj5cIiAoZ290IFwiJHtpZH1cIilgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApO1xufVxuXG4vKiogTWFwIGEgbm9uLTJ4eCB3YWxsZXQgcmVzcG9uc2UgdG8gdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZWQgZXJyb3IuICovXG5mdW5jdGlvbiB3YWxsZXRFcnJvcihzdGF0dXM6IG51bWJlciwgYm9keTogc3RyaW5nKTogV2FsbGV0QXBpRXJyb3Ige1xuICBsZXQgY29kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgYmFsYW5jZU1pbm9yOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShib2R5KSBhcyB7IGVycm9yPzogc3RyaW5nOyBiYWxhbmNlTWlub3I/OiBudW1iZXIgfTtcbiAgICBjb2RlID0gcGFyc2VkLmVycm9yO1xuICAgIGJhbGFuY2VNaW5vciA9IHBhcnNlZC5iYWxhbmNlTWlub3I7XG4gIH0gY2F0Y2gge1xuICAgIC8vIG5vbi1KU09OIGJvZHkg4oCUIGZhbGwgdGhyb3VnaCB0byBhIGdlbmVyaWMgZXJyb3JcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ2luc3VmZmljaWVudF9iYWxhbmNlJykge1xuICAgIHJldHVybiBuZXcgSW5zdWZmaWNpZW50QmFsYW5jZUVycm9yKGJhbGFuY2VNaW5vciA/PyAwLCBib2R5KTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ292ZXJfcmVmdW5kJykgcmV0dXJuIG5ldyBPdmVyUmVmdW5kRXJyb3IoYm9keSk7XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnaWRlbXBvdGVuY3lfY29uZmxpY3QnKSByZXR1cm4gbmV3IElkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDIyICYmIGNvZGUgPT09ICdpbnZhbGlkX3JldmVyc2FsJykgcmV0dXJuIG5ldyBJbnZhbGlkUmV2ZXJzYWxFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDIyICYmIGNvZGUgPT09ICd1bnJlc29sdmFibGVfd2FsbGV0JykgcmV0dXJuIG5ldyBVbnJlc29sdmFibGVXYWxsZXRFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0KSByZXR1cm4gbmV3IFdhbGxldE5vdEZvdW5kRXJyb3IoYm9keSk7XG4gIHJldHVybiBuZXcgV2FsbGV0QXBpRXJyb3Ioc3RhdHVzLCBib2R5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdhbGxldENsaWVudChpbnB1dDogUGxhdGZvcm1Db25maWdJbnB1dCA9IHt9KTogV2FsbGV0Q2xpZW50IHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgQ29uZmlnU3RhdGUoKTtcbiAgc3RhdGUuYXBwbHkoaW5wdXQpO1xuXG4gIGNvbnN0IGNsaWVudDogV2FsbGV0Q2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgZ2V0V2FsbGV0KG9wdHMpIHtcbiAgICAgIC8vIFBhcnNlIGVhZ2VybHkgc28gYSBtYWxmb3JtZWQgaWQgZmFpbHMgZmFzdCBhdCB0aGUgY2FsbCBzaXRlLFxuICAgICAgLy8gYnV0IGRvIE5PVCByZXNvbHZlIHRoZSB3YWxsZXQgaGVyZSDigJQgdGhhdCBoYXBwZW5zIG9uIHRoZSBmaXJzdFxuICAgICAgLy8gb3BlcmF0aW9uIGFnYWluc3QgdGhlIGhhbmRsZS5cbiAgICAgIGNvbnN0IGJ1c2luZXNzSWQgPSBwYXJzZUJ1c2luZXNzSWQob3B0cy5pZCk7XG4gICAgICBjb25zdCBmb3JjZUNoaWxkV2FsbGV0ID0gb3B0cy5mb3JjZUNoaWxkV2FsbGV0ID09PSB0cnVlO1xuXG4gICAgICBjb25zdCBiYXNlUGFyYW1zID0gKCk6IFVSTFNlYXJjaFBhcmFtcyA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgYnVzaW5lc3NJZDogU3RyaW5nKGJ1c2luZXNzSWQpIH0pO1xuICAgICAgICBpZiAoZm9yY2VDaGlsZFdhbGxldCkgcC5zZXQoJ2ZvcmNlQ2hpbGRXYWxsZXQnLCAndHJ1ZScpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBvc3RUcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgdHlwZTogJ2RlYml0JyB8ICdjcmVkaXQnLFxuICAgICAgICBib2R5OiBEZWJpdElucHV0IHwgQ3JlZGl0SW5wdXQsXG4gICAgICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC90cmFuc2FjdGlvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoeyBidXNpbmVzc0lkLCBmb3JjZUNoaWxkV2FsbGV0LCB0eXBlLCAuLi5ib2R5IH0pO1xuICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdXJsOiBgJHtjb25maWcuYmFzZVVybH0ke3BhdGh9YCxcbiAgICAgICAgICBib2R5OiBwYXlsb2FkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFRyYW5zYWN0aW9uUmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgd2FsbGV0OiBXYWxsZXQgPSB7XG4gICAgICAgIGFzeW5jIGdldEJhbGFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L2JhbGFuY2UnO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdXJsOiBgJHtjb25maWcuYmFzZVVybH0ke3BhdGh9PyR7YmFzZVBhcmFtcygpLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBXYWxsZXRCYWxhbmNlO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gJy92MS93YWxsZXQvaW5zdGFuY2UnO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdXJsOiBgJHtjb25maWcuYmFzZVVybH0ke3BhdGh9PyR7YmFzZVBhcmFtcygpLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBXYWxsZXRJbnN0YW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0Q3VycmVuY3koKSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCB3YWxsZXQuZ2V0SW5zdGFuY2UoKSkuY3VycmVuY3k7XG4gICAgICAgIH0sXG4gICAgICAgIGRlYml0KGJvZHkpIHtcbiAgICAgICAgICByZXR1cm4gcG9zdFRyYW5zYWN0aW9uKCdkZWJpdCcsIGJvZHkpO1xuICAgICAgICB9LFxuICAgICAgICBjcmVkaXQoYm9keSkge1xuICAgICAgICAgIHJldHVybiBwb3N0VHJhbnNhY3Rpb24oJ2NyZWRpdCcsIGJvZHkpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBsaXN0VHJhbnNhY3Rpb25zKGZpbHRlciA9IHt9KSB7XG4gICAgICAgICAgY29uc3QgcCA9IGJhc2VQYXJhbXMoKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnR5cGUpIHAuc2V0KCd0eXBlJywgZmlsdGVyLnR5cGUpO1xuICAgICAgICAgIGlmIChmaWx0ZXIuZnJvbSkgcC5zZXQoJ2Zyb20nLCBmaWx0ZXIuZnJvbSk7XG4gICAgICAgICAgaWYgKGZpbHRlci50bykgcC5zZXQoJ3RvJywgZmlsdGVyLnRvKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnNlcnZpY2UgIT09IHVuZGVmaW5lZCkgcC5zZXQoJ3NlcnZpY2UnLCBTdHJpbmcoZmlsdGVyLnNlcnZpY2UpKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnJlZmVyZW5jZUlkKSBwLnNldCgncmVmZXJlbmNlSWQnLCBmaWx0ZXIucmVmZXJlbmNlSWQpO1xuICAgICAgICAgIGlmIChmaWx0ZXIudGFnKSBwLnNldCgndGFnJywgZmlsdGVyLnRhZyk7XG4gICAgICAgICAgaWYgKGZpbHRlci5jdXJzb3IpIHAuc2V0KCdjdXJzb3InLCBmaWx0ZXIuY3Vyc29yKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLmxpbWl0ICE9PSB1bmRlZmluZWQpIHAuc2V0KCdsaW1pdCcsIFN0cmluZyhmaWx0ZXIubGltaXQpKTtcbiAgICAgICAgICBjb25zdCBwYXRoID0gJy92MS93YWxsZXQvdHJhbnNhY3Rpb25zJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke3AudG9TdHJpbmcoKX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyB3YWxsZXRFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFRyYW5zYWN0aW9uUGFnZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24oaWQpIHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gYC92MS93YWxsZXQvdHJhbnNhY3Rpb25zLyR7aWR9YDtcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0VHJhbnNhY3Rpb247XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHdhbGxldDtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBjbGllbnQ7XG59XG4iXX0=
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhbGxldC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBK0tBLGdEQXFIQztBQXBTRCxzQ0FLbUI7QUFDbkIsa0NBQTRDO0FBd0Q1QyxNQUFhLGNBQWUsU0FBUSxLQUFLO0lBQzlCLE1BQU0sQ0FBUztJQUNmLElBQUksQ0FBUztJQUV0QixZQUFZLE1BQWMsRUFBRSxJQUFZO1FBQ3RDLEtBQUssQ0FBQyxjQUFjLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBVkQsd0NBVUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBYSx3QkFBeUIsU0FBUSxjQUFjO0lBQ2pELFlBQVksQ0FBUztJQUM5QixZQUFZLFlBQW9CLEVBQUUsSUFBWTtRQUM1QyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBUEQsNERBT0M7QUFFRCw4RUFBOEU7QUFDOUUsTUFBYSxlQUFnQixTQUFRLGNBQWM7SUFDakQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFMRCwwQ0FLQztBQUVELDhFQUE4RTtBQUM5RSxNQUFhLG9CQUFxQixTQUFRLGNBQWM7SUFDdEQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxD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TSxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzdELE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBc0IsQ0FBQztnQkFDakQsQ0FBQzthQUNGLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0YsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWdTdGF0ZSxcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbn0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IHNlbmRXaXRoQXV0aFJldHJ5IH0gZnJvbSAnLi4vaHR0cCc7XG5pbXBvcnQgdHlwZSB7XG4gIENyZWRpdElucHV0LFxuICBDdXJyZW5jeSxcbiAgRGViaXRJbnB1dCxcbiAgR2V0V2FsbGV0T3B0aW9ucyxcbiAgTGlzdFRyYW5zYWN0aW9uc0ZpbHRlcixcbiAgVHJhbnNhY3Rpb25QYWdlLFxuICBUcmFuc2FjdGlvblJlc3VsdCxcbiAgV2FsbGV0QmFsYW5jZSxcbiAgV2FsbGV0SW5zdGFuY2UsXG4gIFdhbGxldFRyYW5zYWN0aW9uLFxufSBmcm9tICcuL3NjaGVtYSc7XG5cbi8qKlxuICogQSBoYW5kbGUgdG8gb25lIGJ1c2luZXNzIHdhbGxldC4gQ2hlYXAgdG8gY3JlYXRlIOKAlCBgZ2V0V2FsbGV0KC4uLilgXG4gKiBkb2VzIG5vIEkvTy4gVGhlIHdhbGxldCBpcyByZXNvbHZlZCBzZXJ2ZXItc2lkZSBvbiB0aGUgZmlyc3RcbiAqIG9wZXJhdGlvbiwgc28gYFVucmVzb2x2YWJsZVdhbGxldEVycm9yYCAvIGBXYWxsZXROb3RGb3VuZEVycm9yYFxuICogc3VyZmFjZSBmcm9tIHRoZSBvcGVyYXRpb24sIG5vdCBmcm9tIGBnZXRXYWxsZXQoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0IHtcbiAgLyoqIEdFVCAvdjEvd2FsbGV0L2JhbGFuY2Ug4oCUIHJlc29sdmVzIHRoZSB3YWxsZXQgYW5kIHJldHVybnMgaXRzIGJhbGFuY2UgKyBjdXJyZW5jeS4gKi9cbiAgZ2V0QmFsYW5jZSgpOiBQcm9taXNlPFdhbGxldEJhbGFuY2U+O1xuICAvKiogR0VUIC92MS93YWxsZXQvaW5zdGFuY2Ug4oCUIHdhbGxldCBpZGVudGl0eSArIGN1cnJlbmN5LCB3aXRob3V0IHRoZSBiYWxhbmNlLiAqL1xuICBnZXRJbnN0YW5jZSgpOiBQcm9taXNlPFdhbGxldEluc3RhbmNlPjtcbiAgLyoqIFRoZSB3YWxsZXQncyBjdXJyZW5jeSBge2NvZGUsIHN5bWJvbH1gIChhIHNsaWNlIG9mIGdldEluc3RhbmNlKCkpLiAqL1xuICBnZXRDdXJyZW5jeSgpOiBQcm9taXNlPEN1cnJlbmN5PjtcbiAgLyoqXG4gICAqIFBPU1QgL3YxL3dhbGxldC90cmFuc2FjdGlvbnMgKHR5cGU9ZGViaXQpLiBJZGVtcG90ZW50IG9uXG4gICAqIGByZWZlcmVuY2VJZGAuIFBhc3MgYHdhbGxldGAgdG8gY2hhcmdlIGEgd2FsbGV0IG90aGVyIHRoYW4gdGhlIG9uZVxuICAgKiB0aGlzIGhhbmRsZSByb3V0ZXMgdG8uXG4gICAqL1xuICBkZWJpdChpbnB1dDogRGViaXRJbnB1dCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+O1xuICAvKipcbiAgICogUE9TVCAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyAodHlwZT1jcmVkaXQpLiBQYXNzIGByZXZlcnNhbE9mYCBmb3IgYVxuICAgKiByZWZ1bmQgY2FwcGVkIGJ5IHRoZSBvcmlnaW5hbCBkZWJpdCwgb3IgYGlzUmVmdW5kYCBmb3Igb25lIGNvbXB1dGVkXG4gICAqIGluZGVwZW5kZW50bHkgb2YgaXQuXG4gICAqL1xuICBjcmVkaXQoaW5wdXQ6IENyZWRpdElucHV0KTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD47XG4gIC8qKiBHRVQgL3YxL3dhbGxldC90cmFuc2FjdGlvbnMg4oCUIG5ld2VzdC1maXJzdCwga2V5c2V0LXBhZ2luYXRlZC4gKi9cbiAgbGlzdFRyYW5zYWN0aW9ucyhmaWx0ZXI/OiBMaXN0VHJhbnNhY3Rpb25zRmlsdGVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblBhZ2U+O1xuICAvKiogR0VUIC92MS93YWxsZXQvdHJhbnNhY3Rpb25zLzppZCDigJQgc2NvcGVkIHRvIHRoaXMgd2FsbGV0LiAqL1xuICBnZXRUcmFuc2FjdGlvbihpZDogc3RyaW5nKTogUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q2xpZW50IHtcbiAgY29uZmlnKGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogV2FsbGV0Q2xpZW50O1xuICBhdXRoKGlucHV0OiBQbGF0Zm9ybUF1dGhJbnB1dCB8IFBsYXRmb3JtQXV0aCk6IFdhbGxldENsaWVudDtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgaGFuZGxlIHRvIGEgYnVzaW5lc3Mgd2FsbGV0LiBTeW5jaHJvbm91cyBhbmQgSS9PLWZyZWUg4oCUIGl0XG4gICAqIG9ubHkgcGFyc2VzIGBpZGAuIFJlcXVpcmVzIGEgc2VydmljZSB0b2tlbiBjYXJyeWluZyB0aGUgcmVsZXZhbnRcbiAgICogYHdhbGxldC4qYCBzY29wZSBmb3IgdGhlIG9wZXJhdGlvbnMgb24gdGhlIHJldHVybmVkIGhhbmRsZS5cbiAgICovXG4gIGdldFdhbGxldChvcHRzOiBHZXRXYWxsZXRPcHRpb25zKTogV2FsbGV0O1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0QXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGB3YWxsZXQgQVBJICR7c3RhdHVzfTogJHtib2R5fWApO1xuICAgIHRoaXMubmFtZSA9ICdXYWxsZXRBcGlFcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgfVxufVxuXG4vKiogQSBkZWJpdCB3b3VsZCBvdmVyZHJhdyB0aGUgd2FsbGV0OyBub3RoaW5nIHdhcyBtb3ZlZCAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIEluc3VmZmljaWVudEJhbGFuY2VFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgcmVhZG9ubHkgYmFsYW5jZU1pbm9yOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKGJhbGFuY2VNaW5vcjogbnVtYmVyLCBib2R5OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDksIGJvZHkpO1xuICAgIHRoaXMubmFtZSA9ICdJbnN1ZmZpY2llbnRCYWxhbmNlRXJyb3InO1xuICAgIHRoaXMuYmFsYW5jZU1pbm9yID0gYmFsYW5jZU1pbm9yO1xuICB9XG59XG5cbi8qKiBBIHJlZnVuZCB3b3VsZCBwdXNoIHRvdGFsIHJldmVyc2FscyBwYXN0IHRoZSBvcmlnaW5hbCBkZWJpdCAoSFRUUCA0MDkpLiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJSZWZ1bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnT3ZlclJlZnVuZEVycm9yJztcbiAgfVxufVxuXG4vKiogYHJldmVyc2FsT2ZgIGRvZXNuJ3QgcmVmZXJlbmNlIGEgdmFsaWQgZGViaXQgb24gdGhpcyB3YWxsZXQgKEhUVFAgNDIyKS4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUmV2ZXJzYWxFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDIyLCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnSW52YWxpZFJldmVyc2FsRXJyb3InO1xuICB9XG59XG5cbi8qKiBBIGByZWZlcmVuY2VJZGAgd2FzIHJldXNlZCB3aXRoIGEgZGlmZmVyZW50IGFtb3VudC90eXBlL3NlcnZpY2UgKEhUVFAgNDA5KS4gKi9cbmV4cG9ydCBjbGFzcyBJZGVtcG90ZW5jeUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQwOSwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ0lkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGB3YWxsZXRgIG92ZXJyaWRlIG5hbWVkIGEgYHBhcmVudEJ1c2luZXNzSWRgIHRoZSB3YWxsZXQgZG9jdW1lbnRcbiAqIGNvbnRyYWRpY3RzIChIVFRQIDQwOSkuIE5vdGhpbmcgd2FzIG1vdmVkIOKAlCB0aGUgd3JpdGUgaXMgcmVmdXNlZCByYXRoZXJcbiAqIHRoYW4gY2hhcmdpbmcgdGhlIHJpZ2h0IHdhbGxldCB1bmRlciB0aGUgd3JvbmcgaWRlbnRpdHksIHdoaWNoIHdvdWxkXG4gKiBtaXNhdHRyaWJ1dGUgdGhlIGxlZGdlciByb3cgYW5kIHNwbGl0IGl0cyBpZGVtcG90ZW5jeSBzY29wZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhbGxldElkZW50aXR5TWlzbWF0Y2hFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA5LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0SWRlbnRpdHlNaXNtYXRjaEVycm9yJztcbiAgfVxufVxuXG4vKiogVGhlIGJ1c2luZXNzLCBvciB0aGUgYnVzaW5lc3MgaXRzIGBiSWRfZGVkdWN0aW9uYCBwb2ludHMgdG8sIGRvZXMgbm90IGV4aXN0IChIVFRQIDQyMikuICovXG5leHBvcnQgY2xhc3MgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3IgZXh0ZW5kcyBXYWxsZXRBcGlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKDQyMiwgYm9keSk7XG4gICAgdGhpcy5uYW1lID0gJ1VucmVzb2x2YWJsZVdhbGxldEVycm9yJztcbiAgfVxufVxuXG4vKiogTm8gd2FsbGV0IGRvY3VtZW50LCBvciBubyBzdWNoIHRyYW5zYWN0aW9uIG9uIHRoaXMgd2FsbGV0IChIVFRQIDQwNCkuICovXG5leHBvcnQgY2xhc3MgV2FsbGV0Tm90Rm91bmRFcnJvciBleHRlbmRzIFdhbGxldEFwaUVycm9yIHtcbiAgY29uc3RydWN0b3IoYm9keTogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDA0LCBib2R5KTtcbiAgICB0aGlzLm5hbWUgPSAnV2FsbGV0Tm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuY29uc3QgQlVTSU5FU1NfSURfUkUgPSAvXmJ1c2luZXNzOihcXGQrKSQvO1xuXG4vKiogUGFyc2UgYSB0eXBlZCB3YWxsZXQgaWQgKGBcImJ1c2luZXNzOjg4NDFcImApIGludG8gdGhlIG51bWVyaWMgYnVzaW5lc3MgaWQuICovXG5mdW5jdGlvbiBwYXJzZUJ1c2luZXNzSWQoaWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IG1hdGNoID0gQlVTSU5FU1NfSURfUkUuZXhlYyhpZCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgd2FsbGV0LmdldFdhbGxldDogaWQgbXVzdCBsb29rIGxpa2UgXCJidXNpbmVzczo8cG9zaXRpdmUgaW50ZWdlcj5cIiAoZ290IFwiJHtpZH1cIilgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApO1xufVxuXG4vKiogTWFwIGEgbm9uLTJ4eCB3YWxsZXQgcmVzcG9uc2UgdG8gdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZWQgZXJyb3IuICovXG5mdW5jdGlvbiB3YWxsZXRFcnJvcihzdGF0dXM6IG51bWJlciwgYm9keTogc3RyaW5nKTogV2FsbGV0QXBpRXJyb3Ige1xuICBsZXQgY29kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgYmFsYW5jZU1pbm9yOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShib2R5KSBhcyB7IGVycm9yPzogc3RyaW5nOyBiYWxhbmNlTWlub3I/OiBudW1iZXIgfTtcbiAgICBjb2RlID0gcGFyc2VkLmVycm9yO1xuICAgIGJhbGFuY2VNaW5vciA9IHBhcnNlZC5iYWxhbmNlTWlub3I7XG4gIH0gY2F0Y2gge1xuICAgIC8vIG5vbi1KU09OIGJvZHkg4oCUIGZhbGwgdGhyb3VnaCB0byBhIGdlbmVyaWMgZXJyb3JcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ2luc3VmZmljaWVudF9iYWxhbmNlJykge1xuICAgIHJldHVybiBuZXcgSW5zdWZmaWNpZW50QmFsYW5jZUVycm9yKGJhbGFuY2VNaW5vciA/PyAwLCBib2R5KTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSA0MDkgJiYgY29kZSA9PT0gJ292ZXJfcmVmdW5kJykgcmV0dXJuIG5ldyBPdmVyUmVmdW5kRXJyb3IoYm9keSk7XG4gIGlmIChzdGF0dXMgPT09IDQwOSAmJiBjb2RlID09PSAnaWRlbXBvdGVuY3lfY29uZmxpY3QnKSByZXR1cm4gbmV3IElkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA5ICYmIGNvZGUgPT09ICd3YWxsZXRfaWRlbnRpdHlfbWlzbWF0Y2gnKSB7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXRJZGVudGl0eU1pc21hdGNoRXJyb3IoYm9keSk7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gNDIyICYmIGNvZGUgPT09ICdpbnZhbGlkX3JldmVyc2FsJykgcmV0dXJuIG5ldyBJbnZhbGlkUmV2ZXJzYWxFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDIyICYmIGNvZGUgPT09ICd1bnJlc29sdmFibGVfd2FsbGV0JykgcmV0dXJuIG5ldyBVbnJlc29sdmFibGVXYWxsZXRFcnJvcihib2R5KTtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0KSByZXR1cm4gbmV3IFdhbGxldE5vdEZvdW5kRXJyb3IoYm9keSk7XG4gIHJldHVybiBuZXcgV2FsbGV0QXBpRXJyb3Ioc3RhdHVzLCBib2R5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdhbGxldENsaWVudChpbnB1dDogUGxhdGZvcm1Db25maWdJbnB1dCA9IHt9KTogV2FsbGV0Q2xpZW50IHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgQ29uZmlnU3RhdGUoKTtcbiAgc3RhdGUuYXBwbHkoaW5wdXQpO1xuXG4gIGNvbnN0IGNsaWVudDogV2FsbGV0Q2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgZ2V0V2FsbGV0KG9wdHMpIHtcbiAgICAgIC8vIFBhcnNlIGVhZ2VybHkgc28gYSBtYWxmb3JtZWQgaWQgZmFpbHMgZmFzdCBhdCB0aGUgY2FsbCBzaXRlLFxuICAgICAgLy8gYnV0IGRvIE5PVCByZXNvbHZlIHRoZSB3YWxsZXQgaGVyZSDigJQgdGhhdCBoYXBwZW5zIG9uIHRoZSBmaXJzdFxuICAgICAgLy8gb3BlcmF0aW9uIGFnYWluc3QgdGhlIGhhbmRsZS5cbiAgICAgIGNvbnN0IGJ1c2luZXNzSWQgPSBwYXJzZUJ1c2luZXNzSWQob3B0cy5pZCk7XG4gICAgICBjb25zdCBmb3JjZUNoaWxkV2FsbGV0ID0gb3B0cy5mb3JjZUNoaWxkV2FsbGV0ID09PSB0cnVlO1xuXG4gICAgICBjb25zdCBiYXNlUGFyYW1zID0gKCk6IFVSTFNlYXJjaFBhcmFtcyA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgYnVzaW5lc3NJZDogU3RyaW5nKGJ1c2luZXNzSWQpIH0pO1xuICAgICAgICBpZiAoZm9yY2VDaGlsZFdhbGxldCkgcC5zZXQoJ2ZvcmNlQ2hpbGRXYWxsZXQnLCAndHJ1ZScpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBvc3RUcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgdHlwZTogJ2RlYml0JyB8ICdjcmVkaXQnLFxuICAgICAgICBib2R5OiBEZWJpdElucHV0IHwgQ3JlZGl0SW5wdXQsXG4gICAgICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC90cmFuc2FjdGlvbnMnO1xuICAgICAgICAvLyBUaGUgd2FsbGV0IGlkZW50aXR5IGlzIGV4YWN0bHktb25lLW9mIHNlcnZlci1zaWRlLCBzbyBhbiBleHBsaWNpdFxuICAgICAgICAvLyBgd2FsbGV0YCBvdmVycmlkZSBSRVBMQUNFUyB0aGlzIGhhbmRsZSdzIGJ1c2luZXNzSWQgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gdHJhdmVsbGluZyBhbG9uZ3NpZGUgaXQg4oCUIHNlbmRpbmcgYm90aCBpcyBhIDQwMC5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGJvZHkud2FsbGV0ID8geyB0eXBlLCAuLi5ib2R5IH0gOiB7IGJ1c2luZXNzSWQsIGZvcmNlQ2hpbGRXYWxsZXQsIHR5cGUsIC4uLmJvZHkgfSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZW5kV2l0aEF1dGhSZXRyeShjb25maWcsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofWAsXG4gICAgICAgICAgYm9keTogcGF5bG9hZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyB3YWxsZXRFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBUcmFuc2FjdGlvblJlc3VsdDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHdhbGxldDogV2FsbGV0ID0ge1xuICAgICAgICBhc3luYyBnZXRCYWxhbmNlKCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSAnL3YxL3dhbGxldC9iYWxhbmNlJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0QmFsYW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L2luc3RhbmNlJztcbiAgICAgICAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofT8ke2Jhc2VQYXJhbXMoKS50b1N0cmluZygpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IHdhbGxldEVycm9yKHJlcy5zdGF0dXMsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgV2FsbGV0SW5zdGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldEN1cnJlbmN5KCkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgd2FsbGV0LmdldEluc3RhbmNlKCkpLmN1cnJlbmN5O1xuICAgICAgICB9LFxuICAgICAgICBkZWJpdChib2R5KSB7XG4gICAgICAgICAgcmV0dXJuIHBvc3RUcmFuc2FjdGlvbignZGViaXQnLCBib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGl0KGJvZHkpIHtcbiAgICAgICAgICByZXR1cm4gcG9zdFRyYW5zYWN0aW9uKCdjcmVkaXQnLCBib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgbGlzdFRyYW5zYWN0aW9ucyhmaWx0ZXIgPSB7fSkge1xuICAgICAgICAgIGNvbnN0IHAgPSBiYXNlUGFyYW1zKCk7XG4gICAgICAgICAgaWYgKGZpbHRlci50eXBlKSBwLnNldCgndHlwZScsIGZpbHRlci50eXBlKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLmZyb20pIHAuc2V0KCdmcm9tJywgZmlsdGVyLmZyb20pO1xuICAgICAgICAgIGlmIChmaWx0ZXIudG8pIHAuc2V0KCd0bycsIGZpbHRlci50byk7XG4gICAgICAgICAgaWYgKGZpbHRlci5zZXJ2aWNlICE9PSB1bmRlZmluZWQpIHAuc2V0KCdzZXJ2aWNlJywgU3RyaW5nKGZpbHRlci5zZXJ2aWNlKSk7XG4gICAgICAgICAgaWYgKGZpbHRlci5yZWZlcmVuY2VJZCkgcC5zZXQoJ3JlZmVyZW5jZUlkJywgZmlsdGVyLnJlZmVyZW5jZUlkKTtcbiAgICAgICAgICBpZiAoZmlsdGVyLnRhZykgcC5zZXQoJ3RhZycsIGZpbHRlci50YWcpO1xuICAgICAgICAgIGlmIChmaWx0ZXIuY3Vyc29yKSBwLnNldCgnY3Vyc29yJywgZmlsdGVyLmN1cnNvcik7XG4gICAgICAgICAgaWYgKGZpbHRlci5saW1pdCAhPT0gdW5kZWZpbmVkKSBwLnNldCgnbGltaXQnLCBTdHJpbmcoZmlsdGVyLmxpbWl0KSk7XG4gICAgICAgICAgY29uc3QgcGF0aCA9ICcvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucyc7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtwLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgd2FsbGV0RXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBUcmFuc2FjdGlvblBhZ2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldFRyYW5zYWN0aW9uKGlkKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGAvdjEvd2FsbGV0L3RyYW5zYWN0aW9ucy8ke2lkfWA7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtiYXNlUGFyYW1zKCkudG9TdHJpbmcoKX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyB3YWxsZXRFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFdhbGxldFRyYW5zYWN0aW9uO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHJldHVybiB3YWxsZXQ7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gY2xpZW50O1xufVxuIl19
@@ -1,3 +1,3 @@
1
- export type { WalletRef, WalletBalance, WalletInstance, Currency, Amount, Balance, ServiceRef, GetWalletOptions, Breakup, WalletTags, DebitInput, CreditInput, TransactionResult, WalletTransaction, ListTransactionsFilter, TransactionPage, } from './schema';
1
+ export type { WalletRef, WalletBalance, WalletInstance, Currency, Amount, Balance, ServiceRef, GetWalletOptions, Breakup, WalletTags, WalletOverride, DebitInput, CreditInput, TransactionResult, WalletTransaction, ListTransactionsFilter, TransactionPage, } from './schema';
2
2
  export { Services, type Service } from './services';
3
- export { createWalletClient, WalletApiError, InsufficientBalanceError, OverRefundError, InvalidReversalError, IdempotencyConflictError, UnresolvableWalletError, WalletNotFoundError, type WalletClient, type Wallet, } from './client';
3
+ export { createWalletClient, WalletApiError, InsufficientBalanceError, OverRefundError, InvalidReversalError, IdempotencyConflictError, WalletIdentityMismatchError, UnresolvableWalletError, WalletNotFoundError, type WalletClient, type Wallet, } from './client';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WalletNotFoundError = exports.UnresolvableWalletError = exports.IdempotencyConflictError = exports.InvalidReversalError = exports.OverRefundError = exports.InsufficientBalanceError = exports.WalletApiError = exports.createWalletClient = exports.Services = void 0;
3
+ exports.WalletNotFoundError = exports.UnresolvableWalletError = exports.WalletIdentityMismatchError = exports.IdempotencyConflictError = exports.InvalidReversalError = exports.OverRefundError = exports.InsufficientBalanceError = exports.WalletApiError = exports.createWalletClient = exports.Services = void 0;
4
4
  var services_1 = require("./services");
5
5
  Object.defineProperty(exports, "Services", { enumerable: true, get: function () { return services_1.Services; } });
6
6
  var client_1 = require("./client");
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "InsufficientBalanceError", { enumerable: true, g
10
10
  Object.defineProperty(exports, "OverRefundError", { enumerable: true, get: function () { return client_1.OverRefundError; } });
11
11
  Object.defineProperty(exports, "InvalidReversalError", { enumerable: true, get: function () { return client_1.InvalidReversalError; } });
12
12
  Object.defineProperty(exports, "IdempotencyConflictError", { enumerable: true, get: function () { return client_1.IdempotencyConflictError; } });
13
+ Object.defineProperty(exports, "WalletIdentityMismatchError", { enumerable: true, get: function () { return client_1.WalletIdentityMismatchError; } });
13
14
  Object.defineProperty(exports, "UnresolvableWalletError", { enumerable: true, get: function () { return client_1.UnresolvableWalletError; } });
14
15
  Object.defineProperty(exports, "WalletNotFoundError", { enumerable: true, get: function () { return client_1.WalletNotFoundError; } });
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2FsbGV0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWtCQSx1Q0FBb0Q7QUFBM0Msb0dBQUEsUUFBUSxPQUFBO0FBQ2pCLG1DQVdrQjtBQVZoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix3R0FBQSxjQUFjLE9BQUE7QUFDZCxrSEFBQSx3QkFBd0IsT0FBQTtBQUN4Qix5R0FBQSxlQUFlLE9BQUE7QUFDZiw4R0FBQSxvQkFBb0IsT0FBQTtBQUNwQixrSEFBQSx3QkFBd0IsT0FBQTtBQUN4QixpSEFBQSx1QkFBdUIsT0FBQTtBQUN2Qiw2R0FBQSxtQkFBbUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHtcbiAgV2FsbGV0UmVmLFxuICBXYWxsZXRCYWxhbmNlLFxuICBXYWxsZXRJbnN0YW5jZSxcbiAgQ3VycmVuY3ksXG4gIEFtb3VudCxcbiAgQmFsYW5jZSxcbiAgU2VydmljZVJlZixcbiAgR2V0V2FsbGV0T3B0aW9ucyxcbiAgQnJlYWt1cCxcbiAgV2FsbGV0VGFncyxcbiAgRGViaXRJbnB1dCxcbiAgQ3JlZGl0SW5wdXQsXG4gIFRyYW5zYWN0aW9uUmVzdWx0LFxuICBXYWxsZXRUcmFuc2FjdGlvbixcbiAgTGlzdFRyYW5zYWN0aW9uc0ZpbHRlcixcbiAgVHJhbnNhY3Rpb25QYWdlLFxufSBmcm9tICcuL3NjaGVtYSc7XG5leHBvcnQgeyBTZXJ2aWNlcywgdHlwZSBTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5leHBvcnQge1xuICBjcmVhdGVXYWxsZXRDbGllbnQsXG4gIFdhbGxldEFwaUVycm9yLFxuICBJbnN1ZmZpY2llbnRCYWxhbmNlRXJyb3IsXG4gIE92ZXJSZWZ1bmRFcnJvcixcbiAgSW52YWxpZFJldmVyc2FsRXJyb3IsXG4gIElkZW1wb3RlbmN5Q29uZmxpY3RFcnJvcixcbiAgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3IsXG4gIFdhbGxldE5vdEZvdW5kRXJyb3IsXG4gIHR5cGUgV2FsbGV0Q2xpZW50LFxuICB0eXBlIFdhbGxldCxcbn0gZnJvbSAnLi9jbGllbnQnO1xuIl19
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2FsbGV0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW1CQSx1Q0FBb0Q7QUFBM0Msb0dBQUEsUUFBUSxPQUFBO0FBQ2pCLG1DQVlrQjtBQVhoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix3R0FBQSxjQUFjLE9BQUE7QUFDZCxrSEFBQSx3QkFBd0IsT0FBQTtBQUN4Qix5R0FBQSxlQUFlLE9BQUE7QUFDZiw4R0FBQSxvQkFBb0IsT0FBQTtBQUNwQixrSEFBQSx3QkFBd0IsT0FBQTtBQUN4QixxSEFBQSwyQkFBMkIsT0FBQTtBQUMzQixpSEFBQSx1QkFBdUIsT0FBQTtBQUN2Qiw2R0FBQSxtQkFBbUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHtcbiAgV2FsbGV0UmVmLFxuICBXYWxsZXRCYWxhbmNlLFxuICBXYWxsZXRJbnN0YW5jZSxcbiAgQ3VycmVuY3ksXG4gIEFtb3VudCxcbiAgQmFsYW5jZSxcbiAgU2VydmljZVJlZixcbiAgR2V0V2FsbGV0T3B0aW9ucyxcbiAgQnJlYWt1cCxcbiAgV2FsbGV0VGFncyxcbiAgV2FsbGV0T3ZlcnJpZGUsXG4gIERlYml0SW5wdXQsXG4gIENyZWRpdElucHV0LFxuICBUcmFuc2FjdGlvblJlc3VsdCxcbiAgV2FsbGV0VHJhbnNhY3Rpb24sXG4gIExpc3RUcmFuc2FjdGlvbnNGaWx0ZXIsXG4gIFRyYW5zYWN0aW9uUGFnZSxcbn0gZnJvbSAnLi9zY2hlbWEnO1xuZXhwb3J0IHsgU2VydmljZXMsIHR5cGUgU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlV2FsbGV0Q2xpZW50LFxuICBXYWxsZXRBcGlFcnJvcixcbiAgSW5zdWZmaWNpZW50QmFsYW5jZUVycm9yLFxuICBPdmVyUmVmdW5kRXJyb3IsXG4gIEludmFsaWRSZXZlcnNhbEVycm9yLFxuICBJZGVtcG90ZW5jeUNvbmZsaWN0RXJyb3IsXG4gIFdhbGxldElkZW50aXR5TWlzbWF0Y2hFcnJvcixcbiAgVW5yZXNvbHZhYmxlV2FsbGV0RXJyb3IsXG4gIFdhbGxldE5vdEZvdW5kRXJyb3IsXG4gIHR5cGUgV2FsbGV0Q2xpZW50LFxuICB0eXBlIFdhbGxldCxcbn0gZnJvbSAnLi9jbGllbnQnO1xuIl19
@@ -67,6 +67,21 @@ export interface Breakup {
67
67
  }
68
68
  /** Searchable key/value metadata attached to a transaction. */
69
69
  export type WalletTags = Record<string, string>;
70
+ /**
71
+ * An explicit wallet identity that REPLACES `bId_deduction` routing for
72
+ * one write. For callers that already know which wallet pays (admin
73
+ * tools, uengage-crm) or want to assert an identity the routing tables
74
+ * might disagree with.
75
+ *
76
+ * The currency is NOT part of this — the service still takes it from the
77
+ * business that owns the wallet, so a named wallet cannot be charged at
78
+ * the wrong minor-unit scale.
79
+ */
80
+ export interface WalletOverride {
81
+ parentBusinessId: string;
82
+ /** `"0"` for the parent business's own wallet. */
83
+ childBusinessId: string;
84
+ }
70
85
  /** Fields common to a debit and a credit. */
71
86
  interface TransactionInputBase {
72
87
  /** Deterministic id of the business event — the idempotency key. */
@@ -77,14 +92,68 @@ interface TransactionInputBase {
77
92
  description: string;
78
93
  breakup?: Breakup;
79
94
  tags?: WalletTags;
95
+ /**
96
+ * Charge this wallet instead of the one this handle's business id
97
+ * routes to — for THIS call only. Bypasses
98
+ * `flash_configuration.bId_deduction` entirely, and cannot be combined
99
+ * with a handle built with `forceChildWallet`.
100
+ */
101
+ wallet?: WalletOverride;
102
+ /**
103
+ * Flash's natural key for the delivery task. Stored as both `task_id`
104
+ * and `transaction_order_id`. NOT an idempotency key — `referenceId`
105
+ * is; this is the key flash's own pre-check filters on.
106
+ */
107
+ taskId?: string;
108
+ /**
109
+ * Chargeable units on this line. Defaults to 1 on a DEBIT when `taskId`
110
+ * is set (the legacy writer's credit row carries no `units` key, so
111
+ * credits are not defaulted); an explicit value is honoured on either.
112
+ */
113
+ units?: number;
114
+ /**
115
+ * Tariff base cost in MAJOR units (not minor, unlike `amountMinor`),
116
+ * caller-denominated and stored unconverted.
117
+ */
118
+ serviceBaseCost?: number;
119
+ /**
120
+ * When the charge actually OCCURRED, IST `YYYY-MM-DD HH:mm:ss`. Sets
121
+ * the ledger's `inserted_date` — what finance reporting and the
122
+ * `from`/`to` history filter range on — so a backfill or a replay is
123
+ * dated at the event, not at the write. The wall-clock write time is
124
+ * recorded separately as `recordedAt`. Defaults to now; may not be in
125
+ * the future or backdated more than 90 days.
126
+ */
127
+ occurredAt?: string;
128
+ /**
129
+ * The originating actor, stored as `updated_by` ('PetPooja', a rider
130
+ * id, 'Reconcile'). The OAuth client that authenticated the call is
131
+ * recorded separately and is unaffected.
132
+ */
133
+ updatedBy?: string;
80
134
  }
81
135
  export interface DebitInput extends TransactionInputBase {
82
136
  /** Allow the balance to go negative (flash migration only — needs sign-off). */
83
137
  allowNegative?: boolean;
138
+ /** Return-to-origin leg. Debits only; part of flash's dedupe key. */
139
+ rto?: boolean;
84
140
  }
85
141
  export interface CreditInput extends TransactionInputBase {
86
142
  /** Link a refund to the original debit's `id`; subject to the over-refund guard. */
87
143
  reversalOf?: string;
144
+ /**
145
+ * Mark this credit as a refund WITHOUT linking it to an original debit,
146
+ * and so without the over-refund guard. For refunds computed
147
+ * independently of the debit — a partial (buffer-only) refund that can
148
+ * legitimately exceed it. Use `reversalOf` instead when the refund
149
+ * genuinely reverses one known debit and should be capped by it.
150
+ */
151
+ isRefund?: boolean;
152
+ /**
153
+ * Payment reference. Credits only. The empty string is meaningful and
154
+ * is sent through as-is.
155
+ */
156
+ paymentId?: string;
88
157
  }
89
158
  /** What `debit()` / `credit()` return. */
90
159
  export interface TransactionResult {
@@ -110,9 +179,23 @@ export interface WalletTransaction {
110
179
  reversalOf?: string;
111
180
  balanceBefore: Balance;
112
181
  balanceAfter: Balance;
182
+ /** When the charge occurred, IST. A backdated write (`occurredAt`) sets it. */
113
183
  timestamp: string;
184
+ /**
185
+ * Wall-clock write time, IST. Absent on transactions written before
186
+ * this field existed, where `timestamp` is also the write time.
187
+ */
188
+ recordedAt?: string;
114
189
  currency: Currency;
115
190
  wallet: WalletRef;
191
+ taskId?: string;
192
+ rto?: boolean;
193
+ units?: number;
194
+ serviceBaseCost?: number;
195
+ paymentId?: string;
196
+ /** True when the entry is marked a refund (reversal-linked or standalone). */
197
+ refund?: boolean;
198
+ updatedBy?: string;
116
199
  }
117
200
  export interface ListTransactionsFilter {
118
201
  type?: 'debit' | 'credit' | 'all';