@dbx-tools/appkit-model-gateway 0.9.201 → 0.9.203

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,212 @@
1
+ /**
2
+ * Ordered Databricks profile fallback for rate-limited model requests.
3
+ *
4
+ * @module
5
+ */
6
+ import { log } from "@dbx-tools/shared-core";
7
+ import { fetchWorkspace } from "./transport.js";
8
+ const logger = log.logger("appkit/model-gateway/profile-fallback");
9
+ const GENERIC_RATE_LIMIT_COOLDOWN_MS = 15_000;
10
+ const WORKSPACE_TOKEN_COOLDOWN_MS = 60_000;
11
+ /** Process-local ordered profile cooldowns keyed by workspace and model. */
12
+ export class ProfileFallback {
13
+ profiles;
14
+ cooldowns = new Map();
15
+ now;
16
+ sleep;
17
+ fetcher;
18
+ constructor(profiles, dependencies = {}) {
19
+ this.profiles = profiles;
20
+ if (profiles.length < 2) {
21
+ throw new TypeError("Profile fallback requires at least two profiles");
22
+ }
23
+ this.now = dependencies.now ?? Date.now;
24
+ this.sleep = dependencies.sleep ?? abortableSleep;
25
+ this.fetcher = dependencies.fetch ?? globalThis.fetch.bind(globalThis);
26
+ }
27
+ /** Primary profile used for discovery and workspace-scoped routing. */
28
+ get primary() {
29
+ return this.profiles[0];
30
+ }
31
+ /** Execute against the first available profile and cool down HTTP 429 responders. */
32
+ async request(model, signal, send) {
33
+ const attempted = new Set();
34
+ let waitedForExistingCooldown = false;
35
+ while (true) {
36
+ const now = this.now();
37
+ const profileIndex = this.availableProfile(model, attempted, now);
38
+ if (profileIndex === undefined) {
39
+ if (attempted.size > 0 || waitedForExistingCooldown) {
40
+ throw new Error("Profile fallback exhausted without an upstream response");
41
+ }
42
+ const delayMs = this.nextCooldownDelay(model, now);
43
+ if (delayMs === undefined) {
44
+ throw new Error("Profile fallback has no available profile");
45
+ }
46
+ waitedForExistingCooldown = true;
47
+ await this.sleep(delayMs, signal);
48
+ continue;
49
+ }
50
+ attempted.add(profileIndex);
51
+ const profile = this.profiles[profileIndex];
52
+ const response = await send(profile);
53
+ if (response.status !== 429) {
54
+ this.cooldowns.delete(this.key(profile.workspace, model));
55
+ if (profileIndex > 0) {
56
+ logger.info("model request completed through fallback profile", {
57
+ model,
58
+ profile: profile.profile ?? "default",
59
+ profileIndex,
60
+ });
61
+ }
62
+ return response;
63
+ }
64
+ const rateLimit = await modelGatewayRateLimit(response, this.now());
65
+ this.cooldowns.set(this.key(profile.workspace, model), this.now() + rateLimit.retryAfterMs);
66
+ logger.warn("model profile rate limited", {
67
+ errorCode: rateLimit.errorCode,
68
+ upstreamMessage: rateLimit.message,
69
+ model,
70
+ profile: profile.profile ?? "default",
71
+ profileIndex,
72
+ retryAfterMs: rateLimit.retryAfterMs,
73
+ retryAfterSource: rateLimit.source,
74
+ workspace: profile.workspace,
75
+ });
76
+ if (this.availableProfile(model, attempted, this.now()) === undefined) {
77
+ return response;
78
+ }
79
+ await response.body?.cancel().catch(() => undefined);
80
+ }
81
+ }
82
+ /** Build an AI SDK fetch that replays a request through the ordered profile pool. */
83
+ createFetch(model) {
84
+ return (async (input, init) => {
85
+ const request = new Request(input, init);
86
+ const body = request.method === "GET" || request.method === "HEAD"
87
+ ? undefined
88
+ : await request.arrayBuffer();
89
+ const originalUrl = new URL(request.url);
90
+ const originalHeaders = new Headers(request.headers);
91
+ return this.request(model, request.signal, async ({ client, workspace }) => {
92
+ const url = new URL(`${originalUrl.pathname}${originalUrl.search}`, workspace);
93
+ return fetchWorkspace(client, url, {
94
+ method: request.method,
95
+ headers: originalHeaders,
96
+ body,
97
+ signal: request.signal,
98
+ }, this.fetcher);
99
+ });
100
+ });
101
+ }
102
+ availableProfile(model, attempted, now) {
103
+ for (let index = 0; index < this.profiles.length; index += 1) {
104
+ if (attempted.has(index))
105
+ continue;
106
+ const workspace = this.profiles[index].workspace;
107
+ if ((this.cooldowns.get(this.key(workspace, model)) ?? 0) <= now)
108
+ return index;
109
+ }
110
+ return undefined;
111
+ }
112
+ nextCooldownDelay(model, now) {
113
+ const cooldowns = this.profiles
114
+ .map((profile) => this.cooldowns.get(this.key(profile.workspace, model)))
115
+ .filter((until) => until !== undefined && until > now);
116
+ if (cooldowns.length === 0)
117
+ return undefined;
118
+ return Math.max(0, Math.min(...cooldowns) - now);
119
+ }
120
+ key(workspace, model) {
121
+ return `${normalizeWorkspace(workspace)}\0${model}`;
122
+ }
123
+ }
124
+ function normalizeWorkspace(workspace) {
125
+ const url = new URL(workspace);
126
+ return url.origin.toLowerCase();
127
+ }
128
+ /** Parse HTTP and Databricks JSON retry timing for a 429 response. */
129
+ export async function modelGatewayRateLimit(response, now = Date.now()) {
130
+ const headerDelay = retryAfterHeaderMs(response.headers.get("retry-after"), now);
131
+ const body = await response
132
+ .clone()
133
+ .json()
134
+ .catch(() => undefined);
135
+ const details = rateLimitBody(body);
136
+ if (headerDelay !== undefined) {
137
+ return { ...details, retryAfterMs: headerDelay, source: "header" };
138
+ }
139
+ if (details.retryAfterMs !== undefined) {
140
+ return { ...details, retryAfterMs: details.retryAfterMs, source: "body" };
141
+ }
142
+ if (isWorkspaceTokenRateLimit(details.message)) {
143
+ return {
144
+ ...details,
145
+ retryAfterMs: WORKSPACE_TOKEN_COOLDOWN_MS,
146
+ source: "workspace-token-window",
147
+ };
148
+ }
149
+ return {
150
+ ...details,
151
+ retryAfterMs: GENERIC_RATE_LIMIT_COOLDOWN_MS,
152
+ source: "default",
153
+ };
154
+ }
155
+ function rateLimitBody(value) {
156
+ const root = record(value);
157
+ const error = record(root?.error) ?? root;
158
+ const retryAfter = integer(error?.retry_after ?? root?.retry_after);
159
+ const errorCode = text(error?.error_code ?? root?.error_code);
160
+ const message = text(error?.message ?? root?.message) ??
161
+ (typeof root?.error === "string" ? text(root.error) : undefined);
162
+ return {
163
+ ...(retryAfter !== undefined ? { retryAfterMs: retryAfter * 1_000 } : {}),
164
+ ...(errorCode ? { errorCode } : {}),
165
+ ...(message ? { message } : {}),
166
+ };
167
+ }
168
+ function retryAfterHeaderMs(value, now) {
169
+ const normalized = value?.trim();
170
+ if (!normalized)
171
+ return undefined;
172
+ const seconds = Number(normalized);
173
+ if (Number.isFinite(seconds) && seconds >= 0)
174
+ return seconds * 1_000;
175
+ const timestamp = Date.parse(normalized);
176
+ return Number.isFinite(timestamp) ? Math.max(0, timestamp - now) : undefined;
177
+ }
178
+ function isWorkspaceTokenRateLimit(message) {
179
+ return (message !== undefined && /exceeded workspace .*tokens per minute rate limit/i.test(message));
180
+ }
181
+ function integer(value) {
182
+ const normalized = typeof value === "string" ? value.trim().replaceAll(",", "") : value;
183
+ const parsed = typeof normalized === "number" ? normalized : Number(normalized);
184
+ return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : undefined;
185
+ }
186
+ function text(value) {
187
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
188
+ }
189
+ function record(value) {
190
+ return value !== null && typeof value === "object" && !Array.isArray(value)
191
+ ? value
192
+ : undefined;
193
+ }
194
+ function abortableSleep(delayMs, signal) {
195
+ return new Promise((resolve, reject) => {
196
+ if (signal.aborted) {
197
+ reject(signal.reason);
198
+ return;
199
+ }
200
+ const timeout = setTimeout(finish, delayMs);
201
+ function finish() {
202
+ signal.removeEventListener("abort", abort);
203
+ resolve();
204
+ }
205
+ function abort() {
206
+ clearTimeout(timeout);
207
+ reject(signal.reason);
208
+ }
209
+ signal.addEventListener("abort", abort, { once: true });
210
+ });
211
+ }
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS1mYWxsYmFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9maWxlLWZhbGxiYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFHSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQztBQUNuRSxNQUFNLDhCQUE4QixHQUFHLE1BQU0sQ0FBQztBQUM5QyxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQztBQXdCM0MsNEVBQTRFO0FBQzVFLE1BQU0sT0FBTyxlQUFlO0lBT2Y7SUFOTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDdEMsR0FBRyxDQUFlO0lBQ2xCLEtBQUssQ0FBMEQ7SUFDL0QsT0FBTyxDQUEwQjtJQUVsRCxZQUNXLFFBQXdDLEVBQ2pELGVBQTRDLEVBQUU7UUFEckMsYUFBUSxHQUFSLFFBQVEsQ0FBZ0M7UUFHakQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxTQUFTLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxJQUFJLGNBQWMsQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUks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LFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3JkZXJlZCBEYXRhYnJpY2tzIHByb2ZpbGUgZmFsbGJhY2sgZm9yIHJhdGUtbGltaXRlZCBtb2RlbCByZXF1ZXN0cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5pbXBvcnQgeyBmZXRjaFdvcmtzcGFjZSB9IGZyb20gXCIuL3RyYW5zcG9ydC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXkvcHJvZmlsZS1mYWxsYmFja1wiKTtcbmNvbnN0IEdFTkVSSUNfUkFURV9MSU1JVF9DT09MRE9XTl9NUyA9IDE1XzAwMDtcbmNvbnN0IFdPUktTUEFDRV9UT0tFTl9DT09MRE9XTl9NUyA9IDYwXzAwMDtcblxuLyoqIE9uZSBjb25maWd1cmVkIHdvcmtzcGFjZSBpZGVudGl0eSBpbiBmYWxsYmFjayBvcmRlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxHYXRld2F5UHJvZmlsZSB7XG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdvcmtzcGFjZTogc3RyaW5nO1xuICByZWFkb25seSBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbn1cblxuLyoqIFBhcnNlZCB1cHN0cmVhbSByYXRlLWxpbWl0IHRpbWluZyBhbmQgZGlhZ25vc3RpYyBmaWVsZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsR2F0ZXdheVJhdGVMaW1pdCB7XG4gIHJlYWRvbmx5IHJldHJ5QWZ0ZXJNczogbnVtYmVyO1xuICByZWFkb25seSBzb3VyY2U6IFwiaGVhZGVyXCIgfCBcImJvZHlcIiB8IFwid29ya3NwYWNlLXRva2VuLXdpbmRvd1wiIHwgXCJkZWZhdWx0XCI7XG4gIHJlYWRvbmx5IGVycm9yQ29kZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcbn1cblxuLyoqIEluamVjdGFibGUgdGltZSBhbmQgdHJhbnNwb3J0IGJvdW5kYXJpZXMgZm9yIHByb2ZpbGUtZmFsbGJhY2sgdGVzdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2ZpbGVGYWxsYmFja0RlcGVuZGVuY2llcyB7XG4gIHJlYWRvbmx5IG5vdz86ICgpID0+IG51bWJlcjtcbiAgcmVhZG9ubHkgc2xlZXA/OiAoZGVsYXlNczogbnVtYmVyLCBzaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSBmZXRjaD86IHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoO1xufVxuXG4vKiogUHJvY2Vzcy1sb2NhbCBvcmRlcmVkIHByb2ZpbGUgY29vbGRvd25zIGtleWVkIGJ5IHdvcmtzcGFjZSBhbmQgbW9kZWwuICovXG5leHBvcnQgY2xhc3MgUHJvZmlsZUZhbGxiYWNrIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb29sZG93bnMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vdzogKCkgPT4gbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNsZWVwOiAoZGVsYXlNczogbnVtYmVyLCBzaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZldGNoZXI6IHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHByb2ZpbGVzOiByZWFkb25seSBNb2RlbEdhdGV3YXlQcm9maWxlW10sXG4gICAgZGVwZW5kZW5jaWVzOiBQcm9maWxlRmFsbGJhY2tEZXBlbmRlbmNpZXMgPSB7fSxcbiAgKSB7XG4gICAgaWYgKHByb2ZpbGVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9maWxlIGZhbGxiYWNrIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBwcm9maWxlc1wiKTtcbiAgICB9XG4gICAgdGhpcy5ub3cgPSBkZXBlbmRlbmNpZXMubm93ID8/IERhdGUubm93O1xuICAgIHRoaXMuc2xlZXAgPSBkZXBlbmRlbmNpZXMuc2xlZXAgPz8gYWJvcnRhYmxlU2xlZXA7XG4gICAgdGhpcy5mZXRjaGVyID0gZGVwZW5kZW5jaWVzLmZldGNoID8/IGdsb2JhbFRoaXMuZmV0Y2guYmluZChnbG9iYWxUaGlzKTtcbiAgfVxuXG4gIC8qKiBQcmltYXJ5IHByb2ZpbGUgdXNlZCBmb3IgZGlzY292ZXJ5IGFuZCB3b3Jrc3BhY2Utc2NvcGVkIHJvdXRpbmcuICovXG4gIGdldCBwcmltYXJ5KCk6IE1vZGVsR2F0ZXdheVByb2ZpbGUge1xuICAgIHJldHVybiB0aGlzLnByb2ZpbGVzWzBdITtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGFnYWluc3QgdGhlIGZpcnN0IGF2YWlsYWJsZSBwcm9maWxlIGFuZCBjb29sIGRvd24gSFRUUCA0MjkgcmVzcG9uZGVycy4gKi9cbiAgYXN5bmMgcmVxdWVzdChcbiAgICBtb2RlbDogc3RyaW5nLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICAgc2VuZDogKHByb2ZpbGU6IE1vZGVsR2F0ZXdheVByb2ZpbGUpID0+IFByb21pc2U8UmVzcG9uc2U+LFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgYXR0ZW1wdGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IHdhaXRlZEZvckV4aXN0aW5nQ29vbGRvd24gPSBmYWxzZTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3Qgbm93ID0gdGhpcy5ub3coKTtcbiAgICAgIGNvbnN0IHByb2ZpbGVJbmRleCA9IHRoaXMuYXZhaWxhYmxlUHJvZmlsZShtb2RlbCwgYXR0ZW1wdGVkLCBub3cpO1xuICAgICAgaWYgKHByb2ZpbGVJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhdHRlbXB0ZWQuc2l6ZSA+IDAgfHwgd2FpdGVkRm9yRXhpc3RpbmdDb29sZG93bikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb2ZpbGUgZmFsbGJhY2sgZXhoYXVzdGVkIHdpdGhvdXQgYW4gdXBzdHJlYW0gcmVzcG9uc2VcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsYXlNcyA9IHRoaXMubmV4dENvb2xkb3duRGVsYXkobW9kZWwsIG5vdyk7XG4gICAgICAgIGlmIChkZWxheU1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9maWxlIGZhbGxiYWNrIGhhcyBubyBhdmFpbGFibGUgcHJvZmlsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICB3YWl0ZWRGb3JFeGlzdGluZ0Nvb2xkb3duID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5zbGVlcChkZWxheU1zLCBzaWduYWwpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXR0ZW1wdGVkLmFkZChwcm9maWxlSW5kZXgpO1xuICAgICAgY29uc3QgcHJvZmlsZSA9IHRoaXMucHJvZmlsZXNbcHJvZmlsZUluZGV4XSE7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlbmQocHJvZmlsZSk7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSA0MjkpIHtcbiAgICAgICAgdGhpcy5jb29sZG93bnMuZGVsZXRlKHRoaXMua2V5KHByb2ZpbGUud29ya3NwYWNlLCBtb2RlbCkpO1xuICAgICAgICBpZiAocHJvZmlsZUluZGV4ID4gMCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFwibW9kZWwgcmVxdWVzdCBjb21wbGV0ZWQgdGhyb3VnaCBmYWxsYmFjayBwcm9maWxlXCIsIHtcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgcHJvZmlsZTogcHJvZmlsZS5wcm9maWxlID8/IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgcHJvZmlsZUluZGV4LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmF0ZUxpbWl0ID0gYXdhaXQgbW9kZWxHYXRld2F5UmF0ZUxpbWl0KHJlc3BvbnNlLCB0aGlzLm5vdygpKTtcbiAgICAgIHRoaXMuY29vbGRvd25zLnNldCh0aGlzLmtleShwcm9maWxlLndvcmtzcGFjZSwgbW9kZWwpLCB0aGlzLm5vdygpICsgcmF0ZUxpbWl0LnJldHJ5QWZ0ZXJNcyk7XG4gICAgICBsb2dnZXIud2FybihcIm1vZGVsIHByb2ZpbGUgcmF0ZSBsaW1pdGVkXCIsIHtcbiAgICAgICAgZXJyb3JDb2RlOiByYXRlTGltaXQuZXJyb3JDb2RlLFxuICAgICAgICB1cHN0cmVhbU1lc3NhZ2U6IHJhdGVMaW1pdC5tZXNzYWdlLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgcHJvZmlsZTogcHJvZmlsZS5wcm9maWxlID8/IFwiZGVmYXVsdFwiLFxuICAgICAgICBwcm9maWxlSW5kZXgsXG4gICAgICAgIHJldHJ5QWZ0ZXJNczogcmF0ZUxpbWl0LnJldHJ5QWZ0ZXJNcyxcbiAgICAgICAgcmV0cnlBZnRlclNvdXJjZTogcmF0ZUxpbWl0LnNvdXJjZSxcbiAgICAgICAgd29ya3NwYWNlOiBwcm9maWxlLndvcmtzcGFjZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5hdmFpbGFibGVQcm9maWxlKG1vZGVsLCBhdHRlbXB0ZWQsIHRoaXMubm93KCkpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgYW4gQUkgU0RLIGZldGNoIHRoYXQgcmVwbGF5cyBhIHJlcXVlc3QgdGhyb3VnaCB0aGUgb3JkZXJlZCBwcm9maWxlIHBvb2wuICovXG4gIGNyZWF0ZUZldGNoKG1vZGVsOiBzdHJpbmcpOiB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaCB7XG4gICAgcmV0dXJuIChhc3luYyAoaW5wdXQsIGluaXQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdCk7XG4gICAgICBjb25zdCBib2R5ID1cbiAgICAgICAgcmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIgfHwgcmVxdWVzdC5tZXRob2QgPT09IFwiSEVBRFwiXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IGF3YWl0IHJlcXVlc3QuYXJyYXlCdWZmZXIoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsVXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gICAgICBjb25zdCBvcmlnaW5hbEhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXF1ZXN0LmhlYWRlcnMpO1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChtb2RlbCwgcmVxdWVzdC5zaWduYWwsIGFzeW5jICh7IGNsaWVudCwgd29ya3NwYWNlIH0pID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgJHtvcmlnaW5hbFVybC5wYXRobmFtZX0ke29yaWdpbmFsVXJsLnNlYXJjaH1gLCB3b3Jrc3BhY2UpO1xuICAgICAgICByZXR1cm4gZmV0Y2hXb3Jrc3BhY2UoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgICAgaGVhZGVyczogb3JpZ2luYWxIZWFkZXJzLFxuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLmZldGNoZXIsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KSBhcyB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaDtcbiAgfVxuXG4gIHByaXZhdGUgYXZhaWxhYmxlUHJvZmlsZShcbiAgICBtb2RlbDogc3RyaW5nLFxuICAgIGF0dGVtcHRlZDogUmVhZG9ubHlTZXQ8bnVtYmVyPixcbiAgICBub3c6IG51bWJlcixcbiAgKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5wcm9maWxlcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGlmIChhdHRlbXB0ZWQuaGFzKGluZGV4KSkgY29udGludWU7XG4gICAgICBjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLnByb2ZpbGVzW2luZGV4XSEud29ya3NwYWNlO1xuICAgICAgaWYgKCh0aGlzLmNvb2xkb3ducy5nZXQodGhpcy5rZXkod29ya3NwYWNlLCBtb2RlbCkpID8/IDApIDw9IG5vdykgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0Q29vbGRvd25EZWxheShtb2RlbDogc3RyaW5nLCBub3c6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29vbGRvd25zID0gdGhpcy5wcm9maWxlc1xuICAgICAgLm1hcCgocHJvZmlsZSkgPT4gdGhpcy5jb29sZG93bnMuZ2V0KHRoaXMua2V5KHByb2ZpbGUud29ya3NwYWNlLCBtb2RlbCkpKVxuICAgICAgLmZpbHRlcigodW50aWwpOiB1bnRpbCBpcyBudW1iZXIgPT4gdW50aWwgIT09IHVuZGVmaW5lZCAmJiB1bnRpbCA+IG5vdyk7XG4gICAgaWYgKGNvb2xkb3ducy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKC4uLmNvb2xkb3ducykgLSBub3cpO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXkod29ya3NwYWNlOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtub3JtYWxpemVXb3Jrc3BhY2Uod29ya3NwYWNlKX1cXDAke21vZGVsfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlKHdvcmtzcGFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTCh3b3Jrc3BhY2UpO1xuICByZXR1cm4gdXJsLm9yaWdpbi50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKiogUGFyc2UgSFRUUCBhbmQgRGF0YWJyaWNrcyBKU09OIHJldHJ5IHRpbWluZyBmb3IgYSA0MjkgcmVzcG9uc2UuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbW9kZWxHYXRld2F5UmF0ZUxpbWl0KFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIG5vdyA9IERhdGUubm93KCksXG4pOiBQcm9taXNlPE1vZGVsR2F0ZXdheVJhdGVMaW1pdD4ge1xuICBjb25zdCBoZWFkZXJEZWxheSA9IHJldHJ5QWZ0ZXJIZWFkZXJNcyhyZXNwb25zZS5oZWFkZXJzLmdldChcInJldHJ5LWFmdGVyXCIpLCBub3cpO1xuICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2VcbiAgICAuY2xvbmUoKVxuICAgIC5qc29uKClcbiAgICAuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgY29uc3QgZGV0YWlscyA9IHJhdGVMaW1pdEJvZHkoYm9keSk7XG4gIGlmIChoZWFkZXJEZWxheSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgLi4uZGV0YWlscywgcmV0cnlBZnRlck1zOiBoZWFkZXJEZWxheSwgc291cmNlOiBcImhlYWRlclwiIH07XG4gIH1cbiAgaWYgKGRldGFpbHMucmV0cnlBZnRlck1zICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyAuLi5kZXRhaWxzLCByZXRyeUFmdGVyTXM6IGRldGFpbHMucmV0cnlBZnRlck1zLCBzb3VyY2U6IFwiYm9keVwiIH07XG4gIH1cbiAgaWYgKGlzV29ya3NwYWNlVG9rZW5SYXRlTGltaXQoZGV0YWlscy5tZXNzYWdlKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZXRhaWxzLFxuICAgICAgcmV0cnlBZnRlck1zOiBXT1JLU1BBQ0VfVE9LRU5fQ09PTERPV05fTVMsXG4gICAgICBzb3VyY2U6IFwid29ya3NwYWNlLXRva2VuLXdpbmRvd1wiLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5kZXRhaWxzLFxuICAgIHJldHJ5QWZ0ZXJNczogR0VORVJJQ19SQVRFX0xJTUlUX0NPT0xET1dOX01TLFxuICAgIHNvdXJjZTogXCJkZWZhdWx0XCIsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJhdGVMaW1pdEJvZHkodmFsdWU6IHVua25vd24pOiB7XG4gIHJlYWRvbmx5IHJldHJ5QWZ0ZXJNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgZXJyb3JDb2RlPzogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlPzogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHJvb3QgPSByZWNvcmQodmFsdWUpO1xuICBjb25zdCBlcnJvciA9IHJlY29yZChyb290Py5lcnJvcikgPz8gcm9vdDtcbiAgY29uc3QgcmV0cnlBZnRlciA9IGludGVnZXIoZXJyb3I/LnJldHJ5X2FmdGVyID8/IHJvb3Q/LnJldHJ5X2FmdGVyKTtcbiAgY29uc3QgZXJyb3JDb2RlID0gdGV4dChlcnJvcj8uZXJyb3JfY29kZSA/PyByb290Py5lcnJvcl9jb2RlKTtcbiAgY29uc3QgbWVzc2FnZSA9XG4gICAgdGV4dChlcnJvcj8ubWVzc2FnZSA/PyByb290Py5tZXNzYWdlKSA/P1xuICAgICh0eXBlb2Ygcm9vdD8uZXJyb3IgPT09IFwic3RyaW5nXCIgPyB0ZXh0KHJvb3QuZXJyb3IpIDogdW5kZWZpbmVkKTtcbiAgcmV0dXJuIHtcbiAgICAuLi4ocmV0cnlBZnRlciAhPT0gdW5kZWZpbmVkID8geyByZXRyeUFmdGVyTXM6IHJldHJ5QWZ0ZXIgKiAxXzAwMCB9IDoge30pLFxuICAgIC4uLihlcnJvckNvZGUgPyB7IGVycm9yQ29kZSB9IDoge30pLFxuICAgIC4uLihtZXNzYWdlID8geyBtZXNzYWdlIH0gOiB7fSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJldHJ5QWZ0ZXJIZWFkZXJNcyh2YWx1ZTogc3RyaW5nIHwgbnVsbCwgbm93OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBub3JtYWxpemVkID0gdmFsdWU/LnRyaW0oKTtcbiAgaWYgKCFub3JtYWxpemVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzZWNvbmRzID0gTnVtYmVyKG5vcm1hbGl6ZWQpO1xuICBpZiAoTnVtYmVyLmlzRmluaXRlKHNlY29uZHMpICYmIHNlY29uZHMgPj0gMCkgcmV0dXJuIHNlY29uZHMgKiAxXzAwMDtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5wYXJzZShub3JtYWxpemVkKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh0aW1lc3RhbXApID8gTWF0aC5tYXgoMCwgdGltZXN0YW1wIC0gbm93KSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VUb2tlblJhdGVMaW1pdChtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBtZXNzYWdlICE9PSB1bmRlZmluZWQgJiYgL2V4Y2VlZGVkIHdvcmtzcGFjZSAuKnRva2VucyBwZXIgbWludXRlIHJhdGUgbGltaXQvaS50ZXN0KG1lc3NhZ2UpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGludGVnZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBub3JtYWxpemVkID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUudHJpbSgpLnJlcGxhY2VBbGwoXCIsXCIsIFwiXCIpIDogdmFsdWU7XG4gIGNvbnN0IHBhcnNlZCA9IHR5cGVvZiBub3JtYWxpemVkID09PSBcIm51bWJlclwiID8gbm9ybWFsaXplZCA6IE51bWJlcihub3JtYWxpemVkKTtcbiAgcmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKHBhcnNlZCkgJiYgcGFyc2VkID49IDAgPyBwYXJzZWQgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHRleHQodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSA/IHZhbHVlLnRyaW0oKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgID8gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhYm9ydGFibGVTbGVlcChkZWxheU1zOiBudW1iZXIsIHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJlamVjdChzaWduYWwucmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoZmluaXNoLCBkZWxheU1zKTtcbiAgICBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0KTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWJvcnQoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbik7XG4gICAgfVxuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iXX0=
@@ -3,6 +3,10 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import { type WorkspaceClient } from "@databricks/appkit";
6
7
  import type { GatewayRoute } from "@dbx-tools/shared-model-gateway";
7
8
  /** Translate one request through a provider-owned AI SDK model. */
8
- export declare function translateGatewayRequest(route: GatewayRoute, body: Readonly<Record<string, unknown>>, signal: AbortSignal): Promise<Response>;
9
+ export declare function translateGatewayRequest(route: GatewayRoute, body: Readonly<Record<string, unknown>>, signal: AbortSignal, options?: {
10
+ readonly client?: WorkspaceClient;
11
+ readonly fetch?: typeof globalThis.fetch;
12
+ }): Promise<Response>;
@@ -11,7 +11,7 @@ import { log, toError } from "@dbx-tools/shared-core";
11
11
  import { streamText } from "ai";
12
12
  const logger = log.logger("appkit/model-gateway/translation");
13
13
  /** Translate one request through a provider-owned AI SDK model. */
14
- export async function translateGatewayRequest(route, body, signal) {
14
+ export async function translateGatewayRequest(route, body, signal, options = {}) {
15
15
  const decoded = decodeGatewayRequest(route.clientProtocol, body);
16
16
  logger.debug("decoded request", {
17
17
  clientProtocol: route.clientProtocol,
@@ -20,7 +20,7 @@ export async function translateGatewayRequest(route, body, signal) {
20
20
  stream: body.stream === true,
21
21
  toolCount: Object.keys(decoded.tools).length,
22
22
  });
23
- const model = await translationModel(route);
23
+ const model = await translationModel(route, options.client, options.fetch);
24
24
  const result = streamText({
25
25
  model,
26
26
  messages: decoded.messages,
@@ -83,8 +83,7 @@ export async function translateGatewayRequest(route, body, signal) {
83
83
  finishReason,
84
84
  }));
85
85
  }
86
- async function translationModel(route) {
87
- const client = getExecutionContext().client;
86
+ async function translationModel(route, client = getExecutionContext().client, fetcher) {
88
87
  const host = (await client.config.getHost()).toString();
89
88
  const headers = await invoke.authHeaders(client);
90
89
  const protocol = translationProtocol(route);
@@ -94,6 +93,7 @@ async function translationModel(route) {
94
93
  protocol,
95
94
  host,
96
95
  headers,
96
+ ...(fetcher ? { fetch: fetcher } : {}),
97
97
  });
98
98
  }
99
99
  function translationProtocol(route) {
@@ -103,4 +103,4 @@ function translationProtocol(route) {
103
103
  return "anthropic";
104
104
  return "chat";
105
105
  }
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixtQkFBbUIsR0FDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsNkJBQTZCLEdBRTlCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsVUFBVSxFQUFvQyxNQUFNLElBQUksQ0FBQztBQUVsRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUFFOUQsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLEtBQW1CLEVBQ25CLElBQXVDLEVBQ3ZDLE1BQW1CO0lBRW5CLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakUsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtRQUM5QixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7UUFDcEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtRQUNyQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUk7UUFDNUIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU07S0FDN0MsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDeEIsS0FBSztRQUNMLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixxQkFBcUIsRUFBRSxJQUFJO1FBQzNCLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRSxHQUFHLENBQUMsT0FBTyxDQUFDLGVBQWUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlGLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEYsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxVQUFVLEVBQUUsQ0FBQztRQUNiLFdBQVcsRUFBRSxNQUFNO1FBQ25CLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNyQixNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtnQkFDNUIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7YUFDdkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDWixNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsUUFBUSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNwQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFO2dCQUNuQyxZQUFZO2dCQUNaLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDdEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO2FBQ2pDLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7SUFFSCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDekIsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRTtZQUMxQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDcEMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtTQUN2QixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksUUFBUSxDQUNqQixtQkFBbUIsQ0FDakIsS0FBSyxDQUFDLGNBQWMsRUFDcEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQ2YsTUFBTSxDQUFDLE1BQTZELENBQ3JFLEVBQ0Q7WUFDRSxPQUFPLEVBQUU7Z0JBQ1AsZUFBZSxFQUFFLFVBQVU7Z0JBQzNCLGNBQWMsRUFBRSxtQkFBbUI7Z0JBQ25DLG1CQUFtQixFQUFFLElBQUk7YUFDMUI7U0FDRixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUMvRCxNQUFNLENBQUMsSUFBSTtRQUNYLE1BQU0sQ0FBQyxTQUFTO1FBQ2hCLE1BQU0sQ0FBQyxLQUFLO1FBQ1osTUFBTSxDQUFDLFlBQVk7S0FDcEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRTtRQUM1QyxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7UUFDcEMsWUFBWTtRQUNaLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztRQUM5QixLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3RCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtRQUNoQyxhQUFhLEVBQUUsU0FBUyxDQUFDLE1BQU07S0FDaEMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUNsQixxQkFBcUIsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO1FBQzNELElBQUk7UUFDSixTQUFTLEVBQUUsU0FBa0Q7UUFDN0QsS0FBSztRQUNMLFlBQVk7S0FDYixDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsS0FBbUI7SUFDakQsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4RCxNQUFNLE9BQU8sR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLE9BQU8sNkJBQTZCLENBQUM7UUFDbkMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN4QixRQUFRO1FBQ1IsSUFBSTtRQUNKLE9BQU87S0FDUixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxLQUFtQjtJQUM5QyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUM1RCxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUM1RCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWZXJjZWwgQUkgU0RLIGZhbGxiYWNrIHRyYW5zbGF0aW9uIGJldHdlZW4gZXh0ZXJuYWwgZ2F0ZXdheSBwcm90b2NvbHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBpbnZva2UgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHtcbiAgZGVjb2RlR2F0ZXdheVJlcXVlc3QsXG4gIGVuY29kZUdhdGV3YXlSZXNwb25zZSxcbiAgZW5jb2RlR2F0ZXdheVN0cmVhbSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWwtcHJvdG9jb2xcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZURhdGFicmlja3NMYW5ndWFnZU1vZGVsLFxuICB0eXBlIERhdGFicmlja3NMYW5ndWFnZU1vZGVsUHJvdG9jb2wsXG59IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsLXByb3RvY29sXCI7XG5pbXBvcnQgeyBsb2csIHRvRXJyb3IgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBHYXRld2F5Um91dGUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgc3RyZWFtVGV4dCwgdHlwZSBMYW5ndWFnZU1vZGVsLCB0eXBlIFRvb2xTZXQgfSBmcm9tIFwiYWlcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC9tb2RlbC1nYXRld2F5L3RyYW5zbGF0aW9uXCIpO1xuXG4vKiogVHJhbnNsYXRlIG9uZSByZXF1ZXN0IHRocm91Z2ggYSBwcm92aWRlci1vd25lZCBBSSBTREsgbW9kZWwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3QoXG4gIHJvdXRlOiBHYXRld2F5Um91dGUsXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUdhdGV3YXlSZXF1ZXN0KHJvdXRlLmNsaWVudFByb3RvY29sLCBib2R5KTtcbiAgbG9nZ2VyLmRlYnVnKFwiZGVjb2RlZCByZXF1ZXN0XCIsIHtcbiAgICBjbGllbnRQcm90b2NvbDogcm91dGUuY2xpZW50UHJvdG9jb2wsXG4gICAgbWVzc2FnZUNvdW50OiBkZWNvZGVkLm1lc3NhZ2VzLmxlbmd0aCxcbiAgICBtb2RlbDogcm91dGUudGFyZ2V0LmlkLFxuICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPT09IHRydWUsXG4gICAgdG9vbENvdW50OiBPYmplY3Qua2V5cyhkZWNvZGVkLnRvb2xzKS5sZW5ndGgsXG4gIH0pO1xuICBjb25zdCBtb2RlbCA9IGF3YWl0IHRyYW5zbGF0aW9uTW9kZWwocm91dGUpO1xuICBjb25zdCByZXN1bHQgPSBzdHJlYW1UZXh0KHtcbiAgICBtb2RlbCxcbiAgICBtZXNzYWdlczogZGVjb2RlZC5tZXNzYWdlcyxcbiAgICBhbGxvd1N5c3RlbUluTWVzc2FnZXM6IHRydWUsXG4gICAgLi4uKE9iamVjdC5rZXlzKGRlY29kZWQudG9vbHMpLmxlbmd0aCA+IDAgPyB7IHRvb2xzOiBkZWNvZGVkLnRvb2xzIH0gOiB7fSksXG4gICAgLi4uKGRlY29kZWQubWF4T3V0cHV0VG9rZW5zICE9PSB1bmRlZmluZWQgPyB7IG1heE91dHB1dFRva2VuczogZGVjb2RlZC5tYXhPdXRwdXRUb2tlbnMgfSA6IHt9KSxcbiAgICAuLi4oZGVjb2RlZC50ZW1wZXJhdHVyZSAhPT0gdW5kZWZpbmVkID8geyB0ZW1wZXJhdHVyZTogZGVjb2RlZC50ZW1wZXJhdHVyZSB9IDoge30pLFxuICAgIC4uLihkZWNvZGVkLnRvcFAgIT09IHVuZGVmaW5lZCA/IHsgdG9wUDogZGVjb2RlZC50b3BQIH0gOiB7fSksXG4gICAgbWF4UmV0cmllczogMCxcbiAgICBhYm9ydFNpZ25hbDogc2lnbmFsLFxuICAgIG9uRXJyb3I6ICh7IGVycm9yIH0pID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihcInN0cmVhbSBmYWlsZWRcIiwge1xuICAgICAgICBlcnJvcjogdG9FcnJvcihlcnJvciksXG4gICAgICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uQWJvcnQ6ICgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInRyYW5zbGF0aW9uIGFib3J0ZWRcIiwgeyBtb2RlbDogcm91dGUudGFyZ2V0LmlkIH0pO1xuICAgIH0sXG4gICAgb25GaW5pc2g6ICh7IGZpbmlzaFJlYXNvbiwgdXNhZ2UgfSkgPT4ge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwidHJhbnNsYXRpb24gZmluaXNoZWRcIiwge1xuICAgICAgICBmaW5pc2hSZWFzb24sXG4gICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICBpZiAoYm9keS5zdHJlYW0gPT09IHRydWUpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXR1cm5pbmcgdHJhbnNsYXRlZCBzdHJlYW1cIiwge1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHJvdXRlLmNsaWVudFByb3RvY29sLFxuICAgICAgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgICAgZW5jb2RlR2F0ZXdheVN0cmVhbShcbiAgICAgICAgcm91dGUuY2xpZW50UHJvdG9jb2wsXG4gICAgICAgIHJvdXRlLnRhcmdldC5pZCxcbiAgICAgICAgcmVzdWx0LnN0cmVhbSBhcyBBc3luY0l0ZXJhYmxlPGltcG9ydChcImFpXCIpLlRleHRTdHJlYW1QYXJ0PFRvb2xTZXQ+PixcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcImNhY2hlLWNvbnRyb2xcIjogXCJuby1jYWNoZVwiLFxuICAgICAgICAgIFwiY29udGVudC10eXBlXCI6IFwidGV4dC9ldmVudC1zdHJlYW1cIixcbiAgICAgICAgICBcIngtYWNjZWwtYnVmZmVyaW5nXCI6IFwibm9cIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFt0ZXh0LCB0b29sQ2FsbHMsIHVzYWdlLCBmaW5pc2hSZWFzb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJlc3VsdC50ZXh0LFxuICAgIHJlc3VsdC50b29sQ2FsbHMsXG4gICAgcmVzdWx0LnVzYWdlLFxuICAgIHJlc3VsdC5maW5pc2hSZWFzb24sXG4gIF0pO1xuICBsb2dnZXIuZGVidWcoXCJyZXR1cm5pbmcgdHJhbnNsYXRlZCByZXNwb25zZVwiLCB7XG4gICAgY2xpZW50UHJvdG9jb2w6IHJvdXRlLmNsaWVudFByb3RvY29sLFxuICAgIGZpbmlzaFJlYXNvbixcbiAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCxcbiAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyxcbiAgICB0b29sQ2FsbENvdW50OiB0b29sQ2FsbHMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgZW5jb2RlR2F0ZXdheVJlc3BvbnNlKHJvdXRlLmNsaWVudFByb3RvY29sLCByb3V0ZS50YXJnZXQuaWQsIHtcbiAgICAgIHRleHQsXG4gICAgICB0b29sQ2FsbHM6IHRvb2xDYWxscyBhcyBpbXBvcnQoXCJhaVwiKS5UeXBlZFRvb2xDYWxsPFRvb2xTZXQ+W10sXG4gICAgICB1c2FnZSxcbiAgICAgIGZpbmlzaFJlYXNvbixcbiAgICB9KSxcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdHJhbnNsYXRpb25Nb2RlbChyb3V0ZTogR2F0ZXdheVJvdXRlKTogUHJvbWlzZTxMYW5ndWFnZU1vZGVsPiB7XG4gIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBpbnZva2UuYXV0aEhlYWRlcnMoY2xpZW50KTtcbiAgY29uc3QgcHJvdG9jb2wgPSB0cmFuc2xhdGlvblByb3RvY29sKHJvdXRlKTtcbiAgbG9nZ2VyLmRlYnVnKFwic2VsZWN0ZWQgdHJhbnNsYXRpb24gcHJvdmlkZXJcIiwgeyBtb2RlbDogcm91dGUudGFyZ2V0LmlkLCBwcm90b2NvbCB9KTtcbiAgcmV0dXJuIGNyZWF0ZURhdGFicmlja3NMYW5ndWFnZU1vZGVsKHtcbiAgICBtb2RlbElkOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgcHJvdG9jb2wsXG4gICAgaG9zdCxcbiAgICBoZWFkZXJzLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRpb25Qcm90b2NvbChyb3V0ZTogR2F0ZXdheVJvdXRlKTogRGF0YWJyaWNrc0xhbmd1YWdlTW9kZWxQcm90b2NvbCB7XG4gIGlmIChyb3V0ZS50YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcykgcmV0dXJuIFwicmVzcG9uc2VzXCI7XG4gIGlmIChyb3V0ZS50YXJnZXQuY2FwYWJpbGl0aWVzLmFudGhyb3BpYykgcmV0dXJuIFwiYW50aHJvcGljXCI7XG4gIHJldHVybiBcImNoYXRcIjtcbn1cbiJdfQ==
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsbUJBQW1CLEdBQ3BCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUNMLDZCQUE2QixHQUU5QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFVBQVUsRUFBb0MsTUFBTSxJQUFJLENBQUM7QUFFbEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0FBRTlELG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxLQUFtQixFQUNuQixJQUF1QyxFQUN2QyxNQUFtQixFQUNuQixVQUdJLEVBQUU7SUFFTixNQUFNLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUU7UUFDOUIsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO1FBQ3BDLFlBQVksRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07UUFDckMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJO1FBQzVCLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMs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QUE2QixDQUFDO1FBQ25DLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDeEIsUUFBUTtRQUNSLElBQUk7UUFDSixPQUFPO1FBQ1AsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUN2QyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxLQUFtQjtJQUM5QyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUM1RCxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUM1RCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWZXJjZWwgQUkgU0RLIGZhbGxiYWNrIHRyYW5zbGF0aW9uIGJldHdlZW4gZXh0ZXJuYWwgZ2F0ZXdheSBwcm90b2NvbHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQsIHR5cGUgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgaW52b2tlIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7XG4gIGRlY29kZUdhdGV3YXlSZXF1ZXN0LFxuICBlbmNvZGVHYXRld2F5UmVzcG9uc2UsXG4gIGVuY29kZUdhdGV3YXlTdHJlYW0sXG59IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsLXByb3RvY29sXCI7XG5pbXBvcnQge1xuICBjcmVhdGVEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbCxcbiAgdHlwZSBEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbFByb3RvY29sLFxufSBmcm9tIFwiQGRieC10b29scy9tb2RlbC1wcm90b2NvbFwiO1xuaW1wb3J0IHsgbG9nLCB0b0Vycm9yIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgR2F0ZXdheVJvdXRlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcbmltcG9ydCB7IHN0cmVhbVRleHQsIHR5cGUgTGFuZ3VhZ2VNb2RlbCwgdHlwZSBUb29sU2V0IH0gZnJvbSBcImFpXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS90cmFuc2xhdGlvblwiKTtcblxuLyoqIFRyYW5zbGF0ZSBvbmUgcmVxdWVzdCB0aHJvdWdoIGEgcHJvdmlkZXItb3duZWQgQUkgU0RLIG1vZGVsLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0KFxuICByb3V0ZTogR2F0ZXdheVJvdXRlLFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gIG9wdGlvbnM6IHtcbiAgICByZWFkb25seSBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQ7XG4gICAgcmVhZG9ubHkgZmV0Y2g/OiB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaDtcbiAgfSA9IHt9LFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBkZWNvZGVkID0gZGVjb2RlR2F0ZXdheVJlcXVlc3Qocm91dGUuY2xpZW50UHJvdG9jb2wsIGJvZHkpO1xuICBsb2dnZXIuZGVidWcoXCJkZWNvZGVkIHJlcXVlc3RcIiwge1xuICAgIGNsaWVudFByb3RvY29sOiByb3V0ZS5jbGllbnRQcm90b2NvbCxcbiAgICBtZXNzYWdlQ291bnQ6IGRlY29kZWQubWVzc2FnZXMubGVuZ3RoLFxuICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgc3RyZWFtOiBib2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgICB0b29sQ291bnQ6IE9iamVjdC5rZXlzKGRlY29kZWQudG9vbHMpLmxlbmd0aCxcbiAgfSk7XG4gIGNvbnN0IG1vZGVsID0gYXdhaXQgdHJhbnNsYXRpb25Nb2RlbChyb3V0ZSwgb3B0aW9ucy5jbGllbnQsIG9wdGlvbnMuZmV0Y2gpO1xuICBjb25zdCByZXN1bHQgPSBzdHJlYW1UZXh0KHtcbiAgICBtb2RlbCxcbiAgICBtZXNzYWdlczogZGVjb2RlZC5tZXNzYWdlcyxcbiAgICBhbGxvd1N5c3RlbUluTWVzc2FnZXM6IHRydWUsXG4gICAgLi4uKE9iamVjdC5rZXlzKGRlY29kZWQudG9vbHMpLmxlbmd0aCA+IDAgPyB7IHRvb2xzOiBkZWNvZGVkLnRvb2xzIH0gOiB7fSksXG4gICAgLi4uKGRlY29kZWQubWF4T3V0cHV0VG9rZW5zICE9PSB1bmRlZmluZWQgPyB7IG1heE91dHB1dFRva2VuczogZGVjb2RlZC5tYXhPdXRwdXRUb2tlbnMgfSA6IHt9KSxcbiAgICAuLi4oZGVjb2RlZC50ZW1wZXJhdHVyZSAhPT0gdW5kZWZpbmVkID8geyB0ZW1wZXJhdHVyZTogZGVjb2RlZC50ZW1wZXJhdHVyZSB9IDoge30pLFxuICAgIC4uLihkZWNvZGVkLnRvcFAgIT09IHVuZGVmaW5lZCA/IHsgdG9wUDogZGVjb2RlZC50b3BQIH0gOiB7fSksXG4gICAgbWF4UmV0cmllczogMCxcbiAgICBhYm9ydFNpZ25hbDogc2lnbmFsLFxuICAgIG9uRXJyb3I6ICh7IGVycm9yIH0pID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihcInN0cmVhbSBmYWlsZWRcIiwge1xuICAgICAgICBlcnJvcjogdG9FcnJvcihlcnJvciksXG4gICAgICAgIG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG9uQWJvcnQ6ICgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInRyYW5zbGF0aW9uIGFib3J0ZWRcIiwgeyBtb2RlbDogcm91dGUudGFyZ2V0LmlkIH0pO1xuICAgIH0sXG4gICAgb25GaW5pc2g6ICh7IGZpbmlzaFJlYXNvbiwgdXNhZ2UgfSkgPT4ge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwidHJhbnNsYXRpb24gZmluaXNoZWRcIiwge1xuICAgICAgICBmaW5pc2hSZWFzb24sXG4gICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICBpZiAoYm9keS5zdHJlYW0gPT09IHRydWUpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXR1cm5pbmcgdHJhbnNsYXRlZCBzdHJlYW1cIiwge1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHJvdXRlLmNsaWVudFByb3RvY29sLFxuICAgICAgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgICAgZW5jb2RlR2F0ZXdheVN0cmVhbShcbiAgICAgICAgcm91dGUuY2xpZW50UHJvdG9jb2wsXG4gICAgICAgIHJvdXRlLnRhcmdldC5pZCxcbiAgICAgICAgcmVzdWx0LnN0cmVhbSBhcyBBc3luY0l0ZXJhYmxlPGltcG9ydChcImFpXCIpLlRleHRTdHJlYW1QYXJ0PFRvb2xTZXQ+PixcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcImNhY2hlLWNvbnRyb2xcIjogXCJuby1jYWNoZVwiLFxuICAgICAgICAgIFwiY29udGVudC10eXBlXCI6IFwidGV4dC9ldmVudC1zdHJlYW1cIixcbiAgICAgICAgICBcIngtYWNjZWwtYnVmZmVyaW5nXCI6IFwibm9cIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFt0ZXh0LCB0b29sQ2FsbHMsIHVzYWdlLCBmaW5pc2hSZWFzb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJlc3VsdC50ZXh0LFxuICAgIHJlc3VsdC50b29sQ2FsbHMsXG4gICAgcmVzdWx0LnVzYWdlLFxuICAgIHJlc3VsdC5maW5pc2hSZWFzb24sXG4gIF0pO1xuICBsb2dnZXIuZGVidWcoXCJyZXR1cm5pbmcgdHJhbnNsYXRlZCByZXNwb25zZVwiLCB7XG4gICAgY2xpZW50UHJvdG9jb2w6IHJvdXRlLmNsaWVudFByb3RvY29sLFxuICAgIGZpbmlzaFJlYXNvbixcbiAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgbW9kZWw6IHJvdXRlLnRhcmdldC5pZCxcbiAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyxcbiAgICB0b29sQ2FsbENvdW50OiB0b29sQ2FsbHMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgZW5jb2RlR2F0ZXdheVJlc3BvbnNlKHJvdXRlLmNsaWVudFByb3RvY29sLCByb3V0ZS50YXJnZXQuaWQsIHtcbiAgICAgIHRleHQsXG4gICAgICB0b29sQ2FsbHM6IHRvb2xDYWxscyBhcyBpbXBvcnQoXCJhaVwiKS5UeXBlZFRvb2xDYWxsPFRvb2xTZXQ+W10sXG4gICAgICB1c2FnZSxcbiAgICAgIGZpbmlzaFJlYXNvbixcbiAgICB9KSxcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdHJhbnNsYXRpb25Nb2RlbChcbiAgcm91dGU6IEdhdGV3YXlSb3V0ZSxcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50LFxuICBmZXRjaGVyPzogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2gsXG4pOiBQcm9taXNlPExhbmd1YWdlTW9kZWw+IHtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGludm9rZS5hdXRoSGVhZGVycyhjbGllbnQpO1xuICBjb25zdCBwcm90b2NvbCA9IHRyYW5zbGF0aW9uUHJvdG9jb2wocm91dGUpO1xuICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCB0cmFuc2xhdGlvbiBwcm92aWRlclwiLCB7IG1vZGVsOiByb3V0ZS50YXJnZXQuaWQsIHByb3RvY29sIH0pO1xuICByZXR1cm4gY3JlYXRlRGF0YWJyaWNrc0xhbmd1YWdlTW9kZWwoe1xuICAgIG1vZGVsSWQ6IHJvdXRlLnRhcmdldC5pZCxcbiAgICBwcm90b2NvbCxcbiAgICBob3N0LFxuICAgIGhlYWRlcnMsXG4gICAgLi4uKGZldGNoZXIgPyB7IGZldGNoOiBmZXRjaGVyIH0gOiB7fSksXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGlvblByb3RvY29sKHJvdXRlOiBHYXRld2F5Um91dGUpOiBEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbFByb3RvY29sIHtcbiAgaWYgKHJvdXRlLnRhcmdldC5jYXBhYmlsaXRpZXMucmVzcG9uc2VzKSByZXR1cm4gXCJyZXNwb25zZXNcIjtcbiAgaWYgKHJvdXRlLnRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljKSByZXR1cm4gXCJhbnRocm9waWNcIjtcbiAgcmV0dXJuIFwiY2hhdFwiO1xufVxuIl19
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import { type WorkspaceClient } from "@databricks/appkit";
6
7
  import { type GatewayRoute } from "@dbx-tools/shared-model-gateway";
7
8
  /** Inputs for one direct Databricks protocol request. */
8
9
  export interface DatabricksTransportRequest {
@@ -10,9 +11,12 @@ export interface DatabricksTransportRequest {
10
11
  readonly body: Readonly<Record<string, unknown>>;
11
12
  readonly headers: Headers;
12
13
  readonly signal: AbortSignal;
14
+ readonly client?: WorkspaceClient;
13
15
  }
14
16
  /** Execute a direct route with SDK-owned authentication and an unbuffered response body. */
15
17
  export declare function fetchDatabricks(request: DatabricksTransportRequest): Promise<Response>;
18
+ /** Execute one authenticated workspace request and refresh a rejected credential once. */
19
+ export declare function fetchWorkspace(client: WorkspaceClient, input: string | URL, init: RequestInit, fetcher?: typeof globalThis.fetch): Promise<Response>;
16
20
  /** Remove client compatibility fields rejected by direct Databricks protocols. */
17
21
  export declare function directDatabricksRequestBody(route: Pick<GatewayRoute, "upstreamProtocol" | "upstreamModel">, body: Readonly<Record<string, unknown>>): Record<string, unknown>;
18
22
  /** Copy only response headers that belong to the public model protocol. */
@@ -36,7 +36,7 @@ const BLOCKED_RESPONSE_HEADERS = new Set([
36
36
  ]);
37
37
  /** Execute a direct route with SDK-owned authentication and an unbuffered response body. */
38
38
  export async function fetchDatabricks(request) {
39
- const client = getExecutionContext().client;
39
+ const client = request.client ?? getExecutionContext().client;
40
40
  const host = (await client.config.getHost()).toString();
41
41
  const headers = new Headers({ "content-type": "application/json" });
42
42
  request.headers.forEach((value, name) => {
@@ -45,7 +45,6 @@ export async function fetchDatabricks(request) {
45
45
  headers.set(name, value);
46
46
  }
47
47
  });
48
- await client.config.authenticate(headers);
49
48
  const url = upstreamUrl(host, request.route);
50
49
  const startedAt = Date.now();
51
50
  const body = JSON.stringify(directDatabricksRequestBody(request.route, request.body));
@@ -56,28 +55,12 @@ export async function fetchDatabricks(request) {
56
55
  upstreamProtocol: request.route.upstreamProtocol,
57
56
  });
58
57
  try {
59
- let response = await fetch(url, {
58
+ const response = await fetchWorkspace(client, url, {
60
59
  method: "POST",
61
60
  headers,
62
61
  body,
63
62
  signal: request.signal,
64
63
  });
65
- if (response.status === 401 && (await refreshWorkspaceClientAuthentication(client))) {
66
- logger.debug("retrying rejected upstream credential", {
67
- model: request.route.upstreamModel,
68
- upstreamProtocol: request.route.upstreamProtocol,
69
- });
70
- await response.body?.cancel();
71
- headers.delete("authorization");
72
- headers.delete("x-databricks-workspace-id");
73
- await client.config.authenticate(headers);
74
- response = await fetch(url, {
75
- method: "POST",
76
- headers,
77
- body,
78
- signal: request.signal,
79
- });
80
- }
81
64
  const details = {
82
65
  elapsedMs: Date.now() - startedAt,
83
66
  model: request.route.upstreamModel,
@@ -104,6 +87,26 @@ export async function fetchDatabricks(request) {
104
87
  throw error;
105
88
  }
106
89
  }
90
+ /** Execute one authenticated workspace request and refresh a rejected credential once. */
91
+ export async function fetchWorkspace(client, input, init, fetcher = globalThis.fetch.bind(globalThis)) {
92
+ const headers = new Headers(init.headers);
93
+ headers.delete("authorization");
94
+ headers.delete("x-databricks-workspace-id");
95
+ await client.config.authenticate(headers);
96
+ let response = await fetcher(input, { ...init, headers });
97
+ if (response.status !== 401 || !(await refreshWorkspaceClientAuthentication(client))) {
98
+ return response;
99
+ }
100
+ logger.debug("retrying rejected workspace credential", {
101
+ path: new URL(input).pathname,
102
+ });
103
+ await response.body?.cancel();
104
+ headers.delete("authorization");
105
+ headers.delete("x-databricks-workspace-id");
106
+ await client.config.authenticate(headers);
107
+ response = await fetcher(input, { ...init, headers });
108
+ return response;
109
+ }
107
110
  /** Remove client compatibility fields rejected by direct Databricks protocols. */
108
111
  export function directDatabricksRequestBody(route, body) {
109
112
  const sanitized = { ...body, model: route.upstreamModel };
@@ -160,4 +163,4 @@ async function logUpstreamFailureBody(response, details) {
160
163
  await reader.cancel().catch(() => undefined);
161
164
  }
162
165
  }
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFxQixNQUFNLGlDQUFpQyxDQUFDO0FBRWpGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztBQUM1RCxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFFckMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN0QyxpQkFBaUI7SUFDakIsZUFBZTtJQUNmLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsUUFBUTtJQUNSLE1BQU07SUFDTixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLFdBQVc7Q0FDWixDQUFDLENBQUM7QUFFSCxNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3ZDLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLFlBQVk7SUFDWixJQUFJO0lBQ0osU0FBUztJQUNULG1CQUFtQjtJQUNuQixTQUFTO0NBQ1YsQ0FBQyxDQUFDO0FBVUgsNEZBQTRGO0FBQzVGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQW1DO0lBQ3ZFLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixFQUFFLENBQUMsTUFBTSxDQUFDO0lBQzVDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3RDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3ZGLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RixNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFO1FBQ3ZDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWE7UUFDbEMsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVE7UUFDM0IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUk7UUFDcEMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7S0FDakQsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDO1FBQ0gsSUFBSSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQzlCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTztZQUNQLElBQUk7WUFDSixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sb0NBQW9DLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BGLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUU7Z0JBQ3BELEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWE7Z0JBQ2xDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO2FBQ2pELENBQUMsQ0FBQztZQUNILE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM5QixPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUM1QyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQzFCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU87Z0JBQ1AsSUFBSTtnQkFDSixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07YUFDdkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHO1lBQ2QsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTO1lBQ2pDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWE7WUFDbEMsU0FBUyxFQUNQLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDO1lBQ3pGLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtZQUN2QixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtTQUNqRCxDQUFDO1FBQ0YsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDakQsS0FBSyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRTtZQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVM7WUFDakMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDckIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUNsQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtTQUNqRCxDQUFDLENBQUM7UUFDSCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsS0FBK0QsRUFDL0QsSUFBdUM7SUFFdkMsTUFBTSxTQUFTLEdBQTRCLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNuRixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2pELDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxTQUFTLENBQUMsbUJBQW1CLENBQUM7SUFDdkMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxVQUFVLHNCQUFzQixDQUFDLFFBQWlCO0lBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDOUIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUMvQixJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xGLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELEtBQUssVUFBVSxzQkFBc0IsQ0FDbkMsUUFBa0IsRUFDbEIsT0FBZ0M7SUFFaEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUMxQyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU87SUFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNsQyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDakIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxLQUFLLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLEtBQUssQ0FBQyxJQUFJO2dCQUFFLE1BQU07WUFDdEIsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQzlDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNqRCxLQUFLLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUMxQixPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNuRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVO2dCQUFFLE1BQU07UUFDdkQsQ0FBQztRQUNELE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUNqQyxHQUFHLE9BQU87WUFDVixPQUFPO1lBQ1AsU0FBUyxFQUFFLEtBQUssSUFBSSxtQkFBbUI7U0FDeEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFO1lBQ2pELEdBQUcsT0FBTztZQUNWLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdXRoZW50aWNhdGVkIHN0cmVhbWluZyB0cmFuc3BvcnQgZm9yIGRpcmVjdCBEYXRhYnJpY2tzIGdhdGV3YXkgcm91dGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcmVmcmVzaFdvcmtzcGFjZUNsaWVudEF1dGhlbnRpY2F0aW9uIH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgbG9nLCB0b0Vycm9yIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHN0cmlwVW5zdXBwb3J0ZWRDaGF0RmllbGRzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyB1cHN0cmVhbVVybCwgdHlwZSBHYXRld2F5Um91dGUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXkvdHJhbnNwb3J0XCIpO1xuY29uc3QgRVJST1JfUFJFVklFV19CWVRFUyA9IDggKiAxMDI0O1xuXG5jb25zdCBCTE9DS0VEX1JFUVVFU1RfSEVBREVSUyA9IG5ldyBTZXQoW1xuICBcImFjY2VwdC1lbmNvZGluZ1wiLFxuICBcImF1dGhvcml6YXRpb25cIixcbiAgXCJjb25uZWN0aW9uXCIsXG4gIFwiY29udGVudC1sZW5ndGhcIixcbiAgXCJjb29raWVcIixcbiAgXCJob3N0XCIsXG4gIFwicHJveHktYXV0aG9yaXphdGlvblwiLFxuICBcInRyYW5zZmVyLWVuY29kaW5nXCIsXG4gIFwieC1hcGkta2V5XCIsXG5dKTtcblxuY29uc3QgQkxPQ0tFRF9SRVNQT05TRV9IRUFERVJTID0gbmV3IFNldChbXG4gIFwiY29ubmVjdGlvblwiLFxuICBcImNvbnRlbnQtZW5jb2RpbmdcIixcbiAgXCJjb250ZW50LWxlbmd0aFwiLFxuICBcImtlZXAtYWxpdmVcIixcbiAgXCJwcm94eS1hdXRoZW50aWNhdGVcIixcbiAgXCJwcm94eS1hdXRob3JpemF0aW9uXCIsXG4gIFwic2V0LWNvb2tpZVwiLFxuICBcInRlXCIsXG4gIFwidHJhaWxlclwiLFxuICBcInRyYW5zZmVyLWVuY29kaW5nXCIsXG4gIFwidXBncmFkZVwiLFxuXSk7XG5cbi8qKiBJbnB1dHMgZm9yIG9uZSBkaXJlY3QgRGF0YWJyaWNrcyBwcm90b2NvbCByZXF1ZXN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzVHJhbnNwb3J0UmVxdWVzdCB7XG4gIHJlYWRvbmx5IHJvdXRlOiBHYXRld2F5Um91dGU7XG4gIHJlYWRvbmx5IGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIEV4ZWN1dGUgYSBkaXJlY3Qgcm91dGUgd2l0aCBTREstb3duZWQgYXV0aGVudGljYXRpb24gYW5kIGFuIHVuYnVmZmVyZWQgcmVzcG9uc2UgYm9keS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGFicmlja3MocmVxdWVzdDogRGF0YWJyaWNrc1RyYW5zcG9ydFJlcXVlc3QpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0pO1xuICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIG5hbWUpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghQkxPQ0tFRF9SRVFVRVNUX0hFQURFUlMuaGFzKG5vcm1hbGl6ZWQpICYmICFub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJ4LWZvcndhcmRlZC1cIikpIHtcbiAgICAgIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICBhd2FpdCBjbGllbnQuY29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgY29uc3QgdXJsID0gdXBzdHJlYW1VcmwoaG9zdCwgcmVxdWVzdC5yb3V0ZSk7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShkaXJlY3REYXRhYnJpY2tzUmVxdWVzdEJvZHkocmVxdWVzdC5yb3V0ZSwgcmVxdWVzdC5ib2R5KSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInNlbmRpbmcgdXBzdHJlYW0gcmVxdWVzdFwiLCB7XG4gICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICBwYXRoOiBuZXcgVVJMKHVybCkucGF0aG5hbWUsXG4gICAgc3RyZWFtOiByZXF1ZXN0LmJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgfSk7XG4gIHRyeSB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSAmJiAoYXdhaXQgcmVmcmVzaFdvcmtzcGFjZUNsaWVudEF1dGhlbnRpY2F0aW9uKGNsaWVudCkpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXRyeWluZyByZWplY3RlZCB1cHN0cmVhbSBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKTtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKFwiYXV0aG9yaXphdGlvblwiKTtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKFwieC1kYXRhYnJpY2tzLXdvcmtzcGFjZS1pZFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgYm9keSxcbiAgICAgICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgIHJlcXVlc3RJZDpcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJ4LXJlcXVlc3QtaWRcIikgPz8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJ4LWRhdGFicmlja3MtcmVxdWVzdC1pZFwiKSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH07XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZWNlaXZlZCB1cHN0cmVhbSByZXNwb25zZVwiLCBkZXRhaWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSByZXNwb25zZSBmYWlsZWRcIiwgZGV0YWlscyk7XG4gICAgICB2b2lkIGxvZ1Vwc3RyZWFtRmFpbHVyZUJvZHkocmVzcG9uc2UuY2xvbmUoKSwgZGV0YWlscyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoXCJ1cHN0cmVhbSBmZXRjaCBmYWlsZWRcIiwge1xuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKiogUmVtb3ZlIGNsaWVudCBjb21wYXRpYmlsaXR5IGZpZWxkcyByZWplY3RlZCBieSBkaXJlY3QgRGF0YWJyaWNrcyBwcm90b2NvbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZGlyZWN0RGF0YWJyaWNrc1JlcXVlc3RCb2R5KFxuICByb3V0ZTogUGljazxHYXRld2F5Um91dGUsIFwidXBzdHJlYW1Qcm90b2NvbFwiIHwgXCJ1cHN0cmVhbU1vZGVsXCI+LFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHNhbml0aXplZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLmJvZHksIG1vZGVsOiByb3V0ZS51cHN0cmVhbU1vZGVsIH07XG4gIGlmIChyb3V0ZS51cHN0cmVhbVByb3RvY29sID09PSBcImRhdGFicmlja3MtY2hhdFwiKSB7XG4gICAgc3RyaXBVbnN1cHBvcnRlZENoYXRGaWVsZHMoc2FuaXRpemVkKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgc2FuaXRpemVkLnBhcmFsbGVsX3Rvb2xfY2FsbHM7XG4gIH1cbiAgcmV0dXJuIHNhbml0aXplZDtcbn1cblxuLyoqIENvcHkgb25seSByZXNwb25zZSBoZWFkZXJzIHRoYXQgYmVsb25nIHRvIHRoZSBwdWJsaWMgbW9kZWwgcHJvdG9jb2wuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyh1cHN0cmVhbTogSGVhZGVycyk6IEhlYWRlcnMge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgdXBzdHJlYW0uZm9yRWFjaCgodmFsdWUsIG5hbWUpID0+IHtcbiAgICBpZiAoIUJMT0NLRURfUkVTUE9OU0VfSEVBREVSUy5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKSkgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUpO1xuICB9KTtcbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvZ1Vwc3RyZWFtRmFpbHVyZUJvZHkoXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgZGV0YWlsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keT8uZ2V0UmVhZGVyKCk7XG4gIGlmICghcmVhZGVyKSByZXR1cm47XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgbGV0IHByZXZpZXcgPSBcIlwiO1xuICBsZXQgYnl0ZXMgPSAwO1xuICB0cnkge1xuICAgIHdoaWxlIChieXRlcyA8IEVSUk9SX1BSRVZJRVdfQllURVMpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgIGlmIChjaHVuay5kb25lKSBicmVhaztcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IEVSUk9SX1BSRVZJRVdfQllURVMgLSBieXRlcztcbiAgICAgIGNvbnN0IHZhbHVlID0gY2h1bmsudmFsdWUuc3ViYXJyYXkoMCwgcmVtYWluaW5nKTtcbiAgICAgIGJ5dGVzICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgICBwcmV2aWV3ICs9IGRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgIGlmICh2YWx1ZS5ieXRlTGVuZ3RoIDwgY2h1bmsudmFsdWUuYnl0ZUxlbmd0aCkgYnJlYWs7XG4gICAgfVxuICAgIHByZXZpZXcgKz0gZGVjb2Rlci5kZWNvZGUoKTtcbiAgICBsb2dnZXIud2FybihcInVwc3RyZWFtIGVycm9yIGJvZHlcIiwge1xuICAgICAgLi4uZGV0YWlscyxcbiAgICAgIHByZXZpZXcsXG4gICAgICB0cnVuY2F0ZWQ6IGJ5dGVzID49IEVSUk9SX1BSRVZJRVdfQllURVMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY291bGQgbm90IHJlYWQgdXBzdHJlYW0gZXJyb3IgYm9keVwiLCB7XG4gICAgICAuLi5kZXRhaWxzLFxuICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICB9XG59XG4iXX0=
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUF3QixNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBcUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFDNUQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBRXJDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDdEMsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixNQUFNO0lBQ04scUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQixXQUFXO0NBQ1osQ0FBQyxDQUFDO0FBRUgsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN2QyxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixZQUFZO0lBQ1osSUFBSTtJQUNKLFNBQVM7SUFDVCxtQkFBbUI7SUFDbkIsU0FBUztDQUNWLENBQUMsQ0FBQztBQVdILDRGQUE0RjtBQUM1RixNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxPQUFtQztJQUN2RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLG1CQUFtQixFQUFFLENB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QU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXV0aGVudGljYXRlZCBzdHJlYW1pbmcgdHJhbnNwb3J0IGZvciBkaXJlY3QgRGF0YWJyaWNrcyBnYXRld2F5IHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCwgdHlwZSBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyByZWZyZXNoV29ya3NwYWNlQ2xpZW50QXV0aGVudGljYXRpb24gfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQgeyBsb2csIHRvRXJyb3IgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgc3RyaXBVbnN1cHBvcnRlZENoYXRGaWVsZHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IHVwc3RyZWFtVXJsLCB0eXBlIEdhdGV3YXlSb3V0ZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS90cmFuc3BvcnRcIik7XG5jb25zdCBFUlJPUl9QUkVWSUVXX0JZVEVTID0gOCAqIDEwMjQ7XG5cbmNvbnN0IEJMT0NLRURfUkVRVUVTVF9IRUFERVJTID0gbmV3IFNldChbXG4gIFwiYWNjZXB0LWVuY29kaW5nXCIsXG4gIFwiYXV0aG9yaXphdGlvblwiLFxuICBcImNvbm5lY3Rpb25cIixcbiAgXCJjb250ZW50LWxlbmd0aFwiLFxuICBcImNvb2tpZVwiLFxuICBcImhvc3RcIixcbiAgXCJwcm94eS1hdXRob3JpemF0aW9uXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJ4LWFwaS1rZXlcIixcbl0pO1xuXG5jb25zdCBCTE9DS0VEX1JFU1BPTlNFX0hFQURFUlMgPSBuZXcgU2V0KFtcbiAgXCJjb25uZWN0aW9uXCIsXG4gIFwiY29udGVudC1lbmNvZGluZ1wiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwia2VlcC1hbGl2ZVwiLFxuICBcInByb3h5LWF1dGhlbnRpY2F0ZVwiLFxuICBcInByb3h5LWF1dGhvcml6YXRpb25cIixcbiAgXCJzZXQtY29va2llXCIsXG4gIFwidGVcIixcbiAgXCJ0cmFpbGVyXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJ1cGdyYWRlXCIsXG5dKTtcblxuLyoqIElucHV0cyBmb3Igb25lIGRpcmVjdCBEYXRhYnJpY2tzIHByb3RvY29sIHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgcm91dGU6IEdhdGV3YXlSb3V0ZTtcbiAgcmVhZG9ubHkgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQ7XG59XG5cbi8qKiBFeGVjdXRlIGEgZGlyZWN0IHJvdXRlIHdpdGggU0RLLW93bmVkIGF1dGhlbnRpY2F0aW9uIGFuZCBhbiB1bmJ1ZmZlcmVkIHJlc3BvbnNlIGJvZHkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhYnJpY2tzKHJlcXVlc3Q6IERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjbGllbnQgPSByZXF1ZXN0LmNsaWVudCA/PyBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KTtcbiAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIUJMT0NLRURfUkVRVUVTVF9IRUFERVJTLmhhcyhub3JtYWxpemVkKSAmJiAhbm9ybWFsaXplZC5zdGFydHNXaXRoKFwieC1mb3J3YXJkZWQtXCIpKSB7XG4gICAgICBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgdXJsID0gdXBzdHJlYW1VcmwoaG9zdCwgcmVxdWVzdC5yb3V0ZSk7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShkaXJlY3REYXRhYnJpY2tzUmVxdWVzdEJvZHkocmVxdWVzdC5yb3V0ZSwgcmVxdWVzdC5ib2R5KSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInNlbmRpbmcgdXBzdHJlYW0gcmVxdWVzdFwiLCB7XG4gICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICBwYXRoOiBuZXcgVVJMKHVybCkucGF0aG5hbWUsXG4gICAgc3RyZWFtOiByZXF1ZXN0LmJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgfSk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZShjbGllbnQsIHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5LFxuICAgICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbCxcbiAgICB9KTtcbiAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgIHJlcXVlc3RJZDpcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJ4LXJlcXVlc3QtaWRcIikgPz8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJ4LWRhdGFicmlja3MtcmVxdWVzdC1pZFwiKSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgdXBzdHJlYW1Qcm90b2NvbDogcmVxdWVzdC5yb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH07XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZWNlaXZlZCB1cHN0cmVhbSByZXNwb25zZVwiLCBkZXRhaWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSByZXNwb25zZSBmYWlsZWRcIiwgZGV0YWlscyk7XG4gICAgICB2b2lkIGxvZ1Vwc3RyZWFtRmFpbHVyZUJvZHkocmVzcG9uc2UuY2xvbmUoKSwgZGV0YWlscyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoXCJ1cHN0cmVhbSBmZXRjaCBmYWlsZWRcIiwge1xuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgICAgbW9kZWw6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Nb2RlbCxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJlcXVlc3Qucm91dGUudXBzdHJlYW1Qcm90b2NvbCxcbiAgICB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKiogRXhlY3V0ZSBvbmUgYXV0aGVudGljYXRlZCB3b3Jrc3BhY2UgcmVxdWVzdCBhbmQgcmVmcmVzaCBhIHJlamVjdGVkIGNyZWRlbnRpYWwgb25jZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFdvcmtzcGFjZShcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIGlucHV0OiBzdHJpbmcgfCBVUkwsXG4gIGluaXQ6IFJlcXVlc3RJbml0LFxuICBmZXRjaGVyOiB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaCA9IGdsb2JhbFRoaXMuZmV0Y2guYmluZChnbG9iYWxUaGlzKSxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycyk7XG4gIGhlYWRlcnMuZGVsZXRlKFwiYXV0aG9yaXphdGlvblwiKTtcbiAgaGVhZGVycy5kZWxldGUoXCJ4LWRhdGFicmlja3Mtd29ya3NwYWNlLWlkXCIpO1xuICBhd2FpdCBjbGllbnQuY29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hlcihpbnB1dCwgeyAuLi5pbml0LCBoZWFkZXJzIH0pO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSA0MDEgfHwgIShhd2FpdCByZWZyZXNoV29ya3NwYWNlQ2xpZW50QXV0aGVudGljYXRpb24oY2xpZW50KSkpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwicmV0cnlpbmcgcmVqZWN0ZWQgd29ya3NwYWNlIGNyZWRlbnRpYWxcIiwge1xuICAgIHBhdGg6IG5ldyBVUkwoaW5wdXQpLnBhdGhuYW1lLFxuICB9KTtcbiAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gIGhlYWRlcnMuZGVsZXRlKFwiYXV0aG9yaXphdGlvblwiKTtcbiAgaGVhZGVycy5kZWxldGUoXCJ4LWRhdGFicmlja3Mtd29ya3NwYWNlLWlkXCIpO1xuICBhd2FpdCBjbGllbnQuY29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaGVyKGlucHV0LCB7IC4uLmluaXQsIGhlYWRlcnMgfSk7XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqIFJlbW92ZSBjbGllbnQgY29tcGF0aWJpbGl0eSBmaWVsZHMgcmVqZWN0ZWQgYnkgZGlyZWN0IERhdGFicmlja3MgcHJvdG9jb2xzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdERhdGFicmlja3NSZXF1ZXN0Qm9keShcbiAgcm91dGU6IFBpY2s8R2F0ZXdheVJvdXRlLCBcInVwc3RyZWFtUHJvdG9jb2xcIiB8IFwidXBzdHJlYW1Nb2RlbFwiPixcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBzYW5pdGl6ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5ib2R5LCBtb2RlbDogcm91dGUudXBzdHJlYW1Nb2RlbCB9O1xuICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJkYXRhYnJpY2tzLWNoYXRcIikge1xuICAgIHN0cmlwVW5zdXBwb3J0ZWRDaGF0RmllbGRzKHNhbml0aXplZCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIHNhbml0aXplZC5wYXJhbGxlbF90b29sX2NhbGxzO1xuICB9XG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbi8qKiBDb3B5IG9ubHkgcmVzcG9uc2UgaGVhZGVycyB0aGF0IGJlbG9uZyB0byB0aGUgcHVibGljIG1vZGVsIHByb3RvY29sLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGV3YXlSZXNwb25zZUhlYWRlcnModXBzdHJlYW06IEhlYWRlcnMpOiBIZWFkZXJzIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIHVwc3RyZWFtLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiB7XG4gICAgaWYgKCFCTE9DS0VEX1JFU1BPTlNFX0hFQURFUlMuaGFzKG5hbWUudG9Mb3dlckNhc2UoKSkpIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2dVcHN0cmVhbUZhaWx1cmVCb2R5KFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIGRldGFpbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpO1xuICBpZiAoIXJlYWRlcikgcmV0dXJuO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBwcmV2aWV3ID0gXCJcIjtcbiAgbGV0IGJ5dGVzID0gMDtcbiAgdHJ5IHtcbiAgICB3aGlsZSAoYnl0ZXMgPCBFUlJPUl9QUkVWSUVXX0JZVEVTKSB7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBpZiAoY2h1bmsuZG9uZSkgYnJlYWs7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBFUlJPUl9QUkVWSUVXX0JZVEVTIC0gYnl0ZXM7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNodW5rLnZhbHVlLnN1YmFycmF5KDAsIHJlbWFpbmluZyk7XG4gICAgICBieXRlcyArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgcHJldmlldyArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICBpZiAodmFsdWUuYnl0ZUxlbmd0aCA8IGNodW5rLnZhbHVlLmJ5dGVMZW5ndGgpIGJyZWFrO1xuICAgIH1cbiAgICBwcmV2aWV3ICs9IGRlY29kZXIuZGVjb2RlKCk7XG4gICAgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSBlcnJvciBib2R5XCIsIHtcbiAgICAgIC4uLmRldGFpbHMsXG4gICAgICBwcmV2aWV3LFxuICAgICAgdHJ1bmNhdGVkOiBieXRlcyA+PSBFUlJPUl9QUkVWSUVXX0JZVEVTLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNvdWxkIG5vdCByZWFkIHVwc3RyZWFtIGVycm9yIGJvZHlcIiwge1xuICAgICAgLi4uZGV0YWlscyxcbiAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"root":["../src/ai-decide.ts","../src/gateway.ts","../src/model-context.ts","../src/models.ts","../src/plugin.ts","../src/reasoning-adapt.ts","../src/registry.ts","../src/router.ts","../src/routes.ts","../src/smart-router.ts","../src/translation.ts","../src/transport.ts","../scripts/copy-manifest.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/ai-decide.ts","../src/gateway.ts","../src/model-context.ts","../src/models.ts","../src/plugin.ts","../src/profile-fallback.ts","../src/reasoning-adapt.ts","../src/registry.ts","../src/router.ts","../src/routes.ts","../src/smart-router.ts","../src/translation.ts","../src/transport.ts","../scripts/copy-manifest.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -27,13 +27,13 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@databricks/appkit": "0.81.0",
30
- "@dbx-tools/cache": "0.9.201",
31
- "@dbx-tools/databricks": "0.9.201",
32
- "@dbx-tools/model": "0.9.201",
33
- "@dbx-tools/model-protocol": "0.9.201",
34
- "@dbx-tools/shared-core": "0.9.201",
35
- "@dbx-tools/shared-model": "0.9.201",
36
- "@dbx-tools/shared-model-gateway": "0.9.201",
30
+ "@dbx-tools/cache": "0.9.203",
31
+ "@dbx-tools/databricks": "0.9.203",
32
+ "@dbx-tools/model": "0.9.203",
33
+ "@dbx-tools/model-protocol": "0.9.203",
34
+ "@dbx-tools/shared-core": "0.9.203",
35
+ "@dbx-tools/shared-model": "0.9.203",
36
+ "@dbx-tools/shared-model-gateway": "0.9.203",
37
37
  "ai": "^7.0.0",
38
38
  "js-tiktoken": "^1.0.21",
39
39
  "zod": "4.3.6"
@@ -52,7 +52,7 @@
52
52
  "./package.json": "./package.json"
53
53
  }
54
54
  },
55
- "version": "0.9.201",
55
+ "version": "0.9.203",
56
56
  "types": "./lib/index.d.ts",
57
57
  "dbxToolsConfig": {
58
58
  "tags": [