@monaco-neovim-wasm/lib 0.1.12 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/monaco-neovim-wasm.es.js +968 -747
- package/dist/monacoNeovim.d.ts +23 -2
- package/dist/nvimWorker.js +3 -3
- package/dist/nvimWorkerAsyncify.js +3 -3
- package/package.json +1 -1
|
@@ -1,137 +1,137 @@
|
|
|
1
1
|
import * as y from "monaco-editor";
|
|
2
|
-
class
|
|
2
|
+
class ie {
|
|
3
3
|
buffer;
|
|
4
4
|
ctrl;
|
|
5
5
|
data;
|
|
6
6
|
capacity;
|
|
7
|
-
constructor(t =
|
|
7
|
+
constructor(t = x) {
|
|
8
8
|
this.capacity = Math.max(8 * 1024, t | 0), this.buffer = new SharedArrayBuffer(8 + this.capacity), this.ctrl = new Int32Array(this.buffer, 0, 2), this.data = new Uint8Array(this.buffer, 8), Atomics.store(this.ctrl, 0, 0), Atomics.store(this.ctrl, 1, 0);
|
|
9
9
|
}
|
|
10
10
|
push(t) {
|
|
11
11
|
let e;
|
|
12
12
|
if (t instanceof Uint8Array ? e = t : t instanceof ArrayBuffer || t instanceof SharedArrayBuffer ? e = new Uint8Array(t) : e = new Uint8Array(t), !e.byteLength) return !0;
|
|
13
|
-
const i = Atomics.load(this.ctrl, 0), s = Atomics.load(this.ctrl, 1), n = s >= i ? s - i : this.capacity - (i - s),
|
|
14
|
-
if (e.byteLength >
|
|
15
|
-
const
|
|
16
|
-
return e.byteLength <=
|
|
13
|
+
const i = Atomics.load(this.ctrl, 0), s = Atomics.load(this.ctrl, 1), n = s >= i ? s - i : this.capacity - (i - s), o = this.capacity - n - 1;
|
|
14
|
+
if (e.byteLength > o) return !1;
|
|
15
|
+
const c = this.capacity - s;
|
|
16
|
+
return e.byteLength <= c ? (this.data.set(e, s), Atomics.store(this.ctrl, 1, (s + e.byteLength) % this.capacity)) : (this.data.set(e.subarray(0, c), s), this.data.set(e.subarray(c), 0), Atomics.store(this.ctrl, 1, e.byteLength - c)), Atomics.notify(this.ctrl, 1), !0;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
function
|
|
21
|
-
return new
|
|
19
|
+
const x = 262144;
|
|
20
|
+
function ne(l = x) {
|
|
21
|
+
return new ie(l);
|
|
22
22
|
}
|
|
23
|
-
function
|
|
23
|
+
function U(l) {
|
|
24
24
|
const t = [];
|
|
25
|
-
return
|
|
25
|
+
return T(l, t), new Uint8Array(t);
|
|
26
26
|
}
|
|
27
|
-
function
|
|
28
|
-
if (
|
|
27
|
+
function T(l, t) {
|
|
28
|
+
if (l == null) {
|
|
29
29
|
t.push(192);
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
|
-
if (typeof
|
|
33
|
-
t.push(
|
|
32
|
+
if (typeof l == "boolean") {
|
|
33
|
+
t.push(l ? 195 : 194);
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
|
-
if (typeof
|
|
37
|
-
|
|
36
|
+
if (typeof l == "number") {
|
|
37
|
+
se(l, t);
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
|
-
if (typeof
|
|
41
|
-
|
|
40
|
+
if (typeof l == "string") {
|
|
41
|
+
oe(l, t);
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
|
-
if (typeof
|
|
45
|
-
|
|
44
|
+
if (typeof l == "bigint") {
|
|
45
|
+
j(l, t);
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
|
-
if (Array.isArray(
|
|
49
|
-
|
|
48
|
+
if (Array.isArray(l)) {
|
|
49
|
+
ce(l, t);
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
|
-
if (
|
|
53
|
-
|
|
52
|
+
if (l instanceof Uint8Array) {
|
|
53
|
+
le(l, t);
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
|
-
if (
|
|
57
|
-
|
|
56
|
+
if (ge(l)) {
|
|
57
|
+
ae(l, t);
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
|
-
if (typeof
|
|
61
|
-
|
|
60
|
+
if (typeof l == "object") {
|
|
61
|
+
re(l, t);
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
64
|
throw new Error("Unsupported type in msgpack encode");
|
|
65
65
|
}
|
|
66
|
-
function
|
|
67
|
-
if (!Number.isFinite(
|
|
68
|
-
if (Number.isInteger(
|
|
69
|
-
if (
|
|
70
|
-
t.push(
|
|
66
|
+
function se(l, t) {
|
|
67
|
+
if (!Number.isFinite(l)) throw new Error("Cannot encode non-finite number");
|
|
68
|
+
if (Number.isInteger(l)) {
|
|
69
|
+
if (l >= 0 && l <= 127) {
|
|
70
|
+
t.push(l);
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
|
-
if (
|
|
74
|
-
t.push(224 |
|
|
73
|
+
if (l < 0 && l >= -32) {
|
|
74
|
+
t.push(224 | l + 32);
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
77
|
-
if (
|
|
78
|
-
t.push(208,
|
|
77
|
+
if (l >= -128 && l <= 127) {
|
|
78
|
+
t.push(208, l + 256 & 255);
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
|
-
if (
|
|
82
|
-
t.push(209,
|
|
81
|
+
if (l >= -32768 && l <= 32767) {
|
|
82
|
+
t.push(209, l >> 8 & 255, l & 255);
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
|
-
if (
|
|
86
|
-
t.push(210,
|
|
85
|
+
if (l >= -2147483648 && l <= 2147483647) {
|
|
86
|
+
t.push(210, l >> 24 & 255, l >> 16 & 255, l >> 8 & 255, l & 255);
|
|
87
87
|
return;
|
|
88
88
|
}
|
|
89
|
-
|
|
89
|
+
j(BigInt(l), t);
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
92
|
const e = new ArrayBuffer(8);
|
|
93
|
-
new DataView(e).setFloat64(0,
|
|
93
|
+
new DataView(e).setFloat64(0, l), t.push(203, ...new Uint8Array(e));
|
|
94
94
|
}
|
|
95
|
-
function
|
|
95
|
+
function j(l, t) {
|
|
96
96
|
const e = new ArrayBuffer(8);
|
|
97
|
-
new DataView(e).setBigInt64(0, BigInt(
|
|
97
|
+
new DataView(e).setBigInt64(0, BigInt(l)), t.push(211, ...new Uint8Array(e));
|
|
98
98
|
}
|
|
99
|
-
function
|
|
100
|
-
const i = new TextEncoder().encode(
|
|
99
|
+
function oe(l, t) {
|
|
100
|
+
const i = new TextEncoder().encode(l), s = i.length;
|
|
101
101
|
s <= 31 ? t.push(160 | s) : s <= 255 ? t.push(217, s) : s <= 65535 ? t.push(218, s >> 8 & 255, s & 255) : t.push(219, s >> 24 & 255, s >> 16 & 255, s >> 8 & 255, s & 255), t.push(...i);
|
|
102
102
|
}
|
|
103
|
-
function
|
|
104
|
-
const e =
|
|
105
|
-
e <= 255 ? t.push(196, e) : e <= 65535 ? t.push(197, e >> 8 & 255, e & 255) : t.push(198, e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, e & 255), t.push(...
|
|
103
|
+
function le(l, t) {
|
|
104
|
+
const e = l.length;
|
|
105
|
+
e <= 255 ? t.push(196, e) : e <= 65535 ? t.push(197, e >> 8 & 255, e & 255) : t.push(198, e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, e & 255), t.push(...l);
|
|
106
106
|
}
|
|
107
|
-
function
|
|
108
|
-
const e =
|
|
107
|
+
function ce(l, t) {
|
|
108
|
+
const e = l.length;
|
|
109
109
|
e <= 15 ? t.push(144 | e) : e <= 65535 ? t.push(220, e >> 8 & 255, e & 255) : t.push(221, e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, e & 255);
|
|
110
|
-
for (const i of
|
|
111
|
-
|
|
110
|
+
for (const i of l)
|
|
111
|
+
T(i, t);
|
|
112
112
|
}
|
|
113
|
-
function
|
|
114
|
-
const e = Object.keys(
|
|
113
|
+
function re(l, t) {
|
|
114
|
+
const e = Object.keys(l), i = e.length;
|
|
115
115
|
i <= 15 ? t.push(128 | i) : i <= 65535 ? t.push(222, i >> 8 & 255, i & 255) : t.push(223, i >> 24 & 255, i >> 16 & 255, i >> 8 & 255, i & 255);
|
|
116
116
|
for (const s of e)
|
|
117
|
-
|
|
117
|
+
T(s, t), T(l[s], t);
|
|
118
118
|
}
|
|
119
|
-
function
|
|
120
|
-
const e =
|
|
121
|
-
e === 1 ? t.push(212,
|
|
119
|
+
function ae(l, t) {
|
|
120
|
+
const e = l.data.length;
|
|
121
|
+
e === 1 ? t.push(212, l.type) : e === 2 ? t.push(213, l.type) : e === 4 ? t.push(214, l.type) : e === 8 ? t.push(215, l.type) : e === 16 ? t.push(216, l.type) : t.push(199, e, l.type);
|
|
122
122
|
for (let i = 0; i < e; i += 1)
|
|
123
|
-
t.push(
|
|
123
|
+
t.push(l.data[i]);
|
|
124
124
|
}
|
|
125
|
-
function
|
|
126
|
-
return !!(
|
|
125
|
+
function ge(l) {
|
|
126
|
+
return !!(l && typeof l == "object" && typeof l.type == "number" && l.data instanceof Uint8Array);
|
|
127
127
|
}
|
|
128
|
-
function
|
|
128
|
+
function de() {
|
|
129
129
|
return typeof SharedArrayBuffer < "u" && typeof crossOriginIsolated < "u" && crossOriginIsolated;
|
|
130
130
|
}
|
|
131
|
-
function
|
|
132
|
-
return
|
|
131
|
+
function Ie(l) {
|
|
132
|
+
return l.byteOffset === 0 && l.byteLength === l.buffer.byteLength ? l : l.slice();
|
|
133
133
|
}
|
|
134
|
-
class
|
|
134
|
+
class he {
|
|
135
135
|
init;
|
|
136
136
|
worker = null;
|
|
137
137
|
sharedInput = null;
|
|
@@ -150,7 +150,7 @@ class ie {
|
|
|
150
150
|
worker: t.worker ?? null,
|
|
151
151
|
workerUrl: t.workerUrl ?? null,
|
|
152
152
|
createWorker: t.createWorker ?? null,
|
|
153
|
-
sharedInputBytes: t.sharedInputBytes ??
|
|
153
|
+
sharedInputBytes: t.sharedInputBytes ?? x,
|
|
154
154
|
inputMode: t.inputMode ?? "shared",
|
|
155
155
|
rpcTimeoutMs: t.rpcTimeoutMs ?? 8e3,
|
|
156
156
|
maxQueuedBytes: t.maxQueuedBytes ?? 4 * 1024 * 1024,
|
|
@@ -168,45 +168,45 @@ class ie {
|
|
|
168
168
|
return this.workerExitCode;
|
|
169
169
|
}
|
|
170
170
|
async start(t) {
|
|
171
|
-
const { cols: e, rows: i, wasmPath: s, runtimePath: n, env:
|
|
172
|
-
if (this.inputMode = t.inputMode ?? this.init.inputMode, this.inputMode === "shared" && !
|
|
171
|
+
const { cols: e, rows: i, wasmPath: s, runtimePath: n, env: o, files: c } = t;
|
|
172
|
+
if (this.inputMode = t.inputMode ?? this.init.inputMode, this.inputMode === "shared" && !de())
|
|
173
173
|
throw new Error('SharedArrayBuffer is required for inputMode="shared"; serve with COOP/COEP so crossOriginIsolated is true, or use inputMode="message" with the asyncify worker.');
|
|
174
|
-
const
|
|
175
|
-
if (this.stop({ terminate: !this.init.reuseWorker, silent: !0 }), this.sharedInput = this.inputMode === "shared" ?
|
|
176
|
-
this.worker.onmessage = (
|
|
177
|
-
const
|
|
174
|
+
const a = this.worker;
|
|
175
|
+
if (this.stop({ terminate: !this.init.reuseWorker, silent: !0 }), this.sharedInput = this.inputMode === "shared" ? ne(this.init.sharedInputBytes) : null, this.workerExited = !1, this.workerExitCode = null, this.workerFatalError = null, this.reqId = 1, this.pending.clear(), this.init.worker ? this.worker = this.init.worker : this.init.createWorker ? this.worker = this.init.createWorker() : this.init.reuseWorker && a ? this.worker = a : this.worker = this.init.workerUrl ? new Worker(this.init.workerUrl, { type: "module" }) : null, !this.worker) throw new Error("worker/workerUrl is required");
|
|
176
|
+
this.worker.onmessage = (h) => this.handleWorkerMessage(h.data);
|
|
177
|
+
const g = (h) => {
|
|
178
178
|
if (!this.workerExited) {
|
|
179
|
-
if (this.workerFatalError =
|
|
180
|
-
const
|
|
181
|
-
this.pending.forEach((m) => m.reject(
|
|
179
|
+
if (this.workerFatalError = h, this.workerExited = !0, this.workerExitCode = 1, this.pending.size) {
|
|
180
|
+
const u = new Error(h);
|
|
181
|
+
this.pending.forEach((m) => m.reject(u)), this.pending.clear();
|
|
182
182
|
}
|
|
183
183
|
try {
|
|
184
|
-
this.init.handlers.onStartError?.(
|
|
184
|
+
this.init.handlers.onStartError?.(h);
|
|
185
185
|
} catch {
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
};
|
|
189
|
-
this.worker.onerror = (
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
${m}` :
|
|
189
|
+
this.worker.onerror = (h) => {
|
|
190
|
+
const u = h?.message ? `worker error: ${h.message}` : "worker error", m = h?.error?.stack;
|
|
191
|
+
g(m ? `${u}
|
|
192
|
+
${m}` : u);
|
|
193
193
|
}, this.worker.onmessageerror = () => {
|
|
194
|
-
|
|
194
|
+
g("worker messageerror");
|
|
195
195
|
};
|
|
196
|
-
const
|
|
196
|
+
const I = {
|
|
197
197
|
type: "start",
|
|
198
198
|
cols: Number(e) || 80,
|
|
199
199
|
rows: Number(i) || 24,
|
|
200
200
|
wasmPath: String(s ?? ""),
|
|
201
201
|
runtimePath: String(n ?? ""),
|
|
202
202
|
inputBuffer: this.sharedInput?.buffer ?? null,
|
|
203
|
-
env:
|
|
204
|
-
files:
|
|
203
|
+
env: o ?? void 0,
|
|
204
|
+
files: c ?? void 0
|
|
205
205
|
};
|
|
206
206
|
try {
|
|
207
|
-
this.worker.postMessage(
|
|
207
|
+
this.worker.postMessage(I, []);
|
|
208
208
|
} catch {
|
|
209
|
-
this.worker.postMessage(
|
|
209
|
+
this.worker.postMessage(I);
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
stop(t = {}) {
|
|
@@ -231,7 +231,7 @@ ${m}` : p);
|
|
|
231
231
|
}
|
|
232
232
|
notify(t, e = []) {
|
|
233
233
|
if (!this.worker || this.workerExited) return;
|
|
234
|
-
const i =
|
|
234
|
+
const i = U([2, t, e]);
|
|
235
235
|
this.postInput(i);
|
|
236
236
|
}
|
|
237
237
|
call(t, e = []) {
|
|
@@ -241,14 +241,14 @@ ${m}` : p);
|
|
|
241
241
|
return;
|
|
242
242
|
}
|
|
243
243
|
if (this.workerExited) {
|
|
244
|
-
const
|
|
245
|
-
s(new Error(
|
|
244
|
+
const c = this.workerExitCode, a = this.workerFatalError ? `: ${this.workerFatalError}` : "";
|
|
245
|
+
s(new Error(c != null ? `nvim exited (${c})${a}` : `nvim exited${a}`));
|
|
246
246
|
return;
|
|
247
247
|
}
|
|
248
248
|
const n = this.reqId++;
|
|
249
249
|
this.pending.set(n, { resolve: i, reject: s, ts: Date.now(), method: t });
|
|
250
|
-
const
|
|
251
|
-
this.postInput(
|
|
250
|
+
const o = U([0, n, t, e]);
|
|
251
|
+
this.postInput(o), setTimeout(() => {
|
|
252
252
|
this.pending.has(n) && (this.pending.delete(n), s(new Error(this.workerExited ? this.workerExitCode != null ? `nvim exited (${this.workerExitCode})${this.workerFatalError ? `: ${this.workerFatalError}` : ""}` : `nvim exited${this.workerFatalError ? `: ${this.workerFatalError}` : ""}` : `rpc timeout: ${t}`)));
|
|
253
253
|
}, this.init.rpcTimeoutMs);
|
|
254
254
|
});
|
|
@@ -265,8 +265,8 @@ ${m}` : p);
|
|
|
265
265
|
return;
|
|
266
266
|
} catch {
|
|
267
267
|
if (this.workerExited) {
|
|
268
|
-
const n = this.workerExitCode,
|
|
269
|
-
throw new Error(n != null ? `nvim exited (${n})${
|
|
268
|
+
const n = this.workerExitCode, o = this.workerFatalError ? `: ${this.workerFatalError}` : "";
|
|
269
|
+
throw new Error(n != null ? `nvim exited (${n})${o}` : `nvim exited${o}`);
|
|
270
270
|
}
|
|
271
271
|
await new Promise((n) => setTimeout(n, 300));
|
|
272
272
|
}
|
|
@@ -275,15 +275,15 @@ ${m}` : p);
|
|
|
275
275
|
}
|
|
276
276
|
respond(t, e, i) {
|
|
277
277
|
if (!this.worker || this.workerExited) return;
|
|
278
|
-
const s =
|
|
278
|
+
const s = U([1, t, e, i]);
|
|
279
279
|
this.postInput(s);
|
|
280
280
|
}
|
|
281
281
|
handleWorkerMessage(t) {
|
|
282
282
|
const e = t?.type;
|
|
283
283
|
if (e === "rpc-response") {
|
|
284
|
-
const { msgid: i, error: s, result: n } = t,
|
|
285
|
-
if (!
|
|
286
|
-
this.pending.delete(i), s ?
|
|
284
|
+
const { msgid: i, error: s, result: n } = t, o = this.pending.get(i);
|
|
285
|
+
if (!o) return;
|
|
286
|
+
this.pending.delete(i), s ? o.reject(new Error(String(s))) : o.resolve(n);
|
|
287
287
|
return;
|
|
288
288
|
}
|
|
289
289
|
if (e === "rpc-notify") {
|
|
@@ -337,8 +337,8 @@ ${m}` : p);
|
|
|
337
337
|
if (e === "exit") {
|
|
338
338
|
const i = t, s = i.code, n = i.lastStderr;
|
|
339
339
|
if (this.workerExited = !0, this.workerExitCode = s, this.pending.size) {
|
|
340
|
-
const
|
|
341
|
-
this.pending.forEach((
|
|
340
|
+
const o = n ? `: ${n.trim()}` : "", c = new Error(`nvim exited (${s})${o}`);
|
|
341
|
+
this.pending.forEach((a) => a.reject(c)), this.pending.clear();
|
|
342
342
|
}
|
|
343
343
|
try {
|
|
344
344
|
this.init.handlers.onExit?.(s, n);
|
|
@@ -348,7 +348,7 @@ ${m}` : p);
|
|
|
348
348
|
}
|
|
349
349
|
postInput(t) {
|
|
350
350
|
if (!t || !t.buffer) return;
|
|
351
|
-
const e =
|
|
351
|
+
const e = Ie(t);
|
|
352
352
|
if (!(!this.worker || this.workerExited)) {
|
|
353
353
|
if (this.inputMode === "shared") {
|
|
354
354
|
if (!this.sharedInput || this.inputQueueHead >= this.inputQueue.length && this.sharedInput.push(e))
|
|
@@ -388,19 +388,19 @@ ${m}` : p);
|
|
|
388
388
|
}
|
|
389
389
|
} else {
|
|
390
390
|
let e = 0, i = 0;
|
|
391
|
-
for (let
|
|
392
|
-
const
|
|
393
|
-
if (
|
|
394
|
-
if (i > 0 && e +
|
|
395
|
-
e +=
|
|
391
|
+
for (let o = this.inputQueueHead; o < this.inputQueue.length; o += 1) {
|
|
392
|
+
const c = this.inputQueue[o];
|
|
393
|
+
if (c?.byteLength) {
|
|
394
|
+
if (i > 0 && e + c.byteLength > 262144) break;
|
|
395
|
+
e += c.byteLength, i += 1;
|
|
396
396
|
}
|
|
397
397
|
}
|
|
398
398
|
if (i <= 0 || e <= 0) return;
|
|
399
399
|
const s = new Uint8Array(e);
|
|
400
400
|
let n = 0;
|
|
401
|
-
for (let
|
|
402
|
-
const
|
|
403
|
-
s.set(
|
|
401
|
+
for (let o = 0; o < i; o += 1) {
|
|
402
|
+
const c = this.inputQueue[this.inputQueueHead + o];
|
|
403
|
+
s.set(c, n), n += c.byteLength;
|
|
404
404
|
}
|
|
405
405
|
this.inputQueueHead += i, this.inputQueuedBytes -= e, this.postStdin(s);
|
|
406
406
|
}
|
|
@@ -418,7 +418,7 @@ ${m}` : p);
|
|
|
418
418
|
}
|
|
419
419
|
}
|
|
420
420
|
}
|
|
421
|
-
const
|
|
421
|
+
const ue = `if !exists('g:monaco_neovim_wasm_chan')
|
|
422
422
|
finish
|
|
423
423
|
endif
|
|
424
424
|
|
|
@@ -481,7 +481,7 @@ onoremap <silent> gk <Cmd>call <SID>up_down('up')<CR>
|
|
|
481
481
|
nnoremap <silent> gj <Cmd>call <SID>up_down('down')<CR>
|
|
482
482
|
xnoremap <silent> gj <Cmd>call <SID>up_down('down')<CR>
|
|
483
483
|
onoremap <silent> gj <Cmd>call <SID>up_down('down')<CR>
|
|
484
|
-
`,
|
|
484
|
+
`, me = `if !exists('g:monaco_neovim_wasm_chan')
|
|
485
485
|
finish
|
|
486
486
|
endif
|
|
487
487
|
|
|
@@ -582,7 +582,7 @@ onoremap <silent> <C-f> <Cmd>call <SID>scroll('down', 'page')<CR>
|
|
|
582
582
|
nnoremap <silent> <C-b> <Cmd>call <SID>scroll('up', 'page')<CR>
|
|
583
583
|
xnoremap <silent> <C-b> <Cmd>call <SID>scroll('up', 'page')<CR>
|
|
584
584
|
onoremap <silent> <C-b> <Cmd>call <SID>scroll('up', 'page')<CR>
|
|
585
|
-
`,
|
|
585
|
+
`, Ce = `if !exists('g:monaco_neovim_wasm_chan')
|
|
586
586
|
finish
|
|
587
587
|
endif
|
|
588
588
|
|
|
@@ -633,7 +633,7 @@ cnoreabbrev <expr> q <SID>abbr('q', 'MonacoQuit')
|
|
|
633
633
|
cnoreabbrev <expr> quit <SID>abbr('quit', 'MonacoQuit')
|
|
634
634
|
cnoreabbrev <expr> wq <SID>abbr('wq', 'MonacoWq')
|
|
635
635
|
cnoreabbrev <expr> x <SID>abbr('x', 'MonacoWq')
|
|
636
|
-
`,
|
|
636
|
+
`, pe = [
|
|
637
637
|
"-- Monaco + Neovim (WASM)",
|
|
638
638
|
"-- Click into the editor, press i, and start typing.",
|
|
639
639
|
"",
|
|
@@ -643,20 +643,20 @@ cnoreabbrev <expr> x <SID>abbr('x', 'MonacoWq')
|
|
|
643
643
|
"",
|
|
644
644
|
"print(greet('monaco'))"
|
|
645
645
|
];
|
|
646
|
-
function
|
|
646
|
+
function J(l) {
|
|
647
647
|
try {
|
|
648
648
|
if (typeof document > "u") return !1;
|
|
649
649
|
const t = document.body;
|
|
650
650
|
if (!t) return !1;
|
|
651
651
|
const e = document.createElement("textarea");
|
|
652
|
-
e.value = String(
|
|
652
|
+
e.value = String(l ?? ""), e.setAttribute("readonly", ""), e.style.position = "fixed", e.style.left = "0", e.style.top = "0", e.style.width = "1px", e.style.height = "1px", e.style.opacity = "0", e.style.pointerEvents = "none", t.appendChild(e), e.focus(), e.select(), e.setSelectionRange(0, e.value.length);
|
|
653
653
|
const i = !!document.execCommand?.("copy");
|
|
654
654
|
return t.removeChild(e), i;
|
|
655
655
|
} catch {
|
|
656
656
|
return !1;
|
|
657
657
|
}
|
|
658
658
|
}
|
|
659
|
-
const
|
|
659
|
+
const be = `
|
|
660
660
|
local api, fn = vim.api, vim.fn
|
|
661
661
|
|
|
662
662
|
-- virtcol2col() returns a column (1-indexed) for the given virtual column.
|
|
@@ -801,7 +801,7 @@ end
|
|
|
801
801
|
|
|
802
802
|
local tail = (api.nvim_get_mode().mode or ""):sub(-1)
|
|
803
803
|
return { tail = tail, ranges = get_selections(...) }
|
|
804
|
-
`,
|
|
804
|
+
`, ye = `
|
|
805
805
|
local api, fn = vim.api, vim.fn
|
|
806
806
|
|
|
807
807
|
local function get_visible_range(s, e)
|
|
@@ -890,7 +890,7 @@ end
|
|
|
890
890
|
|
|
891
891
|
return run(...)
|
|
892
892
|
`;
|
|
893
|
-
class
|
|
893
|
+
class fe {
|
|
894
894
|
editor;
|
|
895
895
|
opts;
|
|
896
896
|
session = null;
|
|
@@ -956,11 +956,21 @@ class ce {
|
|
|
956
956
|
popupEl = null;
|
|
957
957
|
popupItems = [];
|
|
958
958
|
popupSelected = -1;
|
|
959
|
+
pendingRedrawEvents = [];
|
|
960
|
+
stagingRedrawFrame = !1;
|
|
961
|
+
stagedCmdlineText = void 0;
|
|
962
|
+
stagedCmdlineCursorByte = void 0;
|
|
963
|
+
stagedMessageText = void 0;
|
|
964
|
+
stagedPopupItems = void 0;
|
|
965
|
+
stagedPopupSelected = void 0;
|
|
966
|
+
stagedSearchRefresh = !1;
|
|
959
967
|
preeditEl = null;
|
|
960
968
|
preeditVisible = !1;
|
|
961
969
|
compositionActive = !1;
|
|
962
970
|
pendingResyncAfterComposition = !1;
|
|
963
971
|
ignoreNextInputEvent = !1;
|
|
972
|
+
ignoreNextInputEventUntil = 0;
|
|
973
|
+
ignoreNextInputEventTarget = null;
|
|
964
974
|
pendingEscAfterComposition = !1;
|
|
965
975
|
exitingInsertMode = !1;
|
|
966
976
|
pendingKeysAfterExit = "";
|
|
@@ -971,6 +981,7 @@ class ce {
|
|
|
971
981
|
recentNormalKeys = "";
|
|
972
982
|
lastDelegatedInsertPrefix = null;
|
|
973
983
|
lastDelegatedDotRepeat = null;
|
|
984
|
+
lastClipboardText = null;
|
|
974
985
|
ignoreInsertExitCursor = null;
|
|
975
986
|
ignoreMonacoCursorSyncToNvimUntil = 0;
|
|
976
987
|
ignoreTextKeydownUntil = 0;
|
|
@@ -979,6 +990,7 @@ class ce {
|
|
|
979
990
|
recordingRegister = "";
|
|
980
991
|
recordingRefreshArmed = !1;
|
|
981
992
|
recordingRefreshTimer = null;
|
|
993
|
+
nvimBlocking = !1;
|
|
982
994
|
optimisticCursorUntil = 0;
|
|
983
995
|
optimisticCursorPos = null;
|
|
984
996
|
optimisticCursorPrevPos = null;
|
|
@@ -1017,11 +1029,22 @@ class ce {
|
|
|
1017
1029
|
} catch {
|
|
1018
1030
|
}
|
|
1019
1031
|
}
|
|
1020
|
-
|
|
1032
|
+
sendImeText(t) {
|
|
1021
1033
|
const e = String(t ?? "");
|
|
1022
1034
|
if (!e) return;
|
|
1023
1035
|
const i = typeof performance < "u" && performance.now ? performance.now() : Date.now();
|
|
1024
|
-
e.length > 1 && e === this.lastImeCommitText && i - this.lastImeCommitAt < 60 || (this.lastImeCommitText = e, this.lastImeCommitAt = i, this.sendInput(
|
|
1036
|
+
e.length > 1 && e === this.lastImeCommitText && i - this.lastImeCommitAt < 60 || (this.lastImeCommitText = e, this.lastImeCommitAt = i, this.sendInput(_(e, !0)));
|
|
1037
|
+
}
|
|
1038
|
+
armIgnoreNextInputEvent(t, e = 80) {
|
|
1039
|
+
this.ignoreNextInputEvent = !0, this.ignoreNextInputEventTarget = t ?? null;
|
|
1040
|
+
const i = this.nowMs();
|
|
1041
|
+
this.ignoreNextInputEventUntil = i + Math.max(10, Math.min(500, Number(e) || 0));
|
|
1042
|
+
}
|
|
1043
|
+
shouldIgnoreNextInputEvent(t) {
|
|
1044
|
+
return this.ignoreNextInputEvent ? this.nowMs() > this.ignoreNextInputEventUntil ? (this.clearIgnoreNextInputEvent(), !1) : !(this.ignoreNextInputEventTarget && t && this.ignoreNextInputEventTarget !== t) : !1;
|
|
1045
|
+
}
|
|
1046
|
+
clearIgnoreNextInputEvent() {
|
|
1047
|
+
this.ignoreNextInputEvent = !1, this.ignoreNextInputEventTarget = null, this.ignoreNextInputEventUntil = 0;
|
|
1025
1048
|
}
|
|
1026
1049
|
constructor(t, e = {}) {
|
|
1027
1050
|
this.editor = t;
|
|
@@ -1034,22 +1057,22 @@ class ce {
|
|
|
1034
1057
|
})(), s = (() => {
|
|
1035
1058
|
try {
|
|
1036
1059
|
if (typeof location > "u" || !location?.search) return !1;
|
|
1037
|
-
const
|
|
1038
|
-
return
|
|
1060
|
+
const c = new URLSearchParams(location.search);
|
|
1061
|
+
return c.has("monaco-neovim-wasm-debug") || c.has("mnw_debug");
|
|
1039
1062
|
} catch {
|
|
1040
1063
|
return !1;
|
|
1041
1064
|
}
|
|
1042
|
-
})(),
|
|
1065
|
+
})(), o = i || s ? !0 : !!e.debug;
|
|
1043
1066
|
this.opts = {
|
|
1044
1067
|
worker: e.worker ?? null,
|
|
1045
|
-
workerUrl: e.workerUrl ?? new URL("./nvimWorker.js", import.meta.url),
|
|
1068
|
+
workerUrl: e.workerUrl ?? new URL("data:video/mp2t;base64,aW1wb3J0IHsKICBXQVNJLAogIHdhc2ksCiAgRGlyZWN0b3J5LAogIEZpbGUsCiAgUHJlb3BlbkRpcmVjdG9yeSwKICBGZCwKICBJbm9kZSwKfSBmcm9tICJAYmpvcm4zL2Jyb3dzZXJfd2FzaV9zaGltIjsKaW1wb3J0IHsgZ3VuemlwU3luYyB9IGZyb20gImZmbGF0ZSI7CmltcG9ydCB7IERlY29kZXIgfSBmcm9tICIuL21zZ3BhY2siOwp0eXBlIFN0YXJ0TWVzc2FnZSA9IHsKICB0eXBlOiAic3RhcnQiOwogIGNvbHM/OiBudW1iZXI7CiAgcm93cz86IG51bWJlcjsKICB3YXNtUGF0aDogc3RyaW5nOwogIHJ1bnRpbWVQYXRoOiBzdHJpbmc7CiAgaW5wdXRCdWZmZXI/OiBTaGFyZWRBcnJheUJ1ZmZlciB8IG51bGw7CiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGw7CiAgZmlsZXM/OiBBcnJheTx7IHBhdGg6IHN0cmluZzsgZGF0YTogVWludDhBcnJheSB8IEFycmF5QnVmZmVyIHwgQXJyYXlMaWtlPG51bWJlcj4gfCB7IHR5cGU6ICJCdWZmZXIiOyBkYXRhOiBudW1iZXJbXSB9IH0+IHwgbnVsbDsKfTsKCnR5cGUgU3RvcE1lc3NhZ2UgPSB7IHR5cGU6ICJzdG9wIiB9OwoKdHlwZSBJbmJvdW5kTWVzc2FnZSA9IFN0YXJ0TWVzc2FnZSB8IFN0b3BNZXNzYWdlOwoKdHlwZSBEaXJOb2RlID0gRGlyZWN0b3J5ICYgeyBjb250ZW50czogTWFwPHN0cmluZywgYW55PiB9OwoKbGV0IHJwY0RlY29kZXI6IERlY29kZXIgfCBudWxsID0gbnVsbDsKbGV0IGFjdGl2ZVdhc2k6IFdBU0kgfCBudWxsID0gbnVsbDsKbGV0IGlucHV0RmQ6IFJpbmdGZCB8IG51bGwgPSBudWxsOwpjb25zdCBzdGRlcnJEZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7CmxldCBsYXN0U3RkZXJyID0gIiI7CmxldCBmYXRhbFNlbnQgPSBmYWxzZTsKbGV0IGNhY2hlZFdhc206IHsgdXJsOiBzdHJpbmc7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsID0gbnVsbDsKbGV0IGNhY2hlZFJ1bnRpbWU6IHsgdXJsOiBzdHJpbmc7IGVudHJpZXM6IFRhckVudHJ5W10gfSB8IG51bGwgPSBudWxsOwoKc2VsZi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIChldikgPT4gewogIGlmIChmYXRhbFNlbnQpIHJldHVybjsKICBmYXRhbFNlbnQgPSB0cnVlOwogIGNvbnN0IG1zZyA9IGV2Lm1lc3NhZ2UgfHwgU3RyaW5nKGV2LmVycm9yIHx8ICJ3b3JrZXIgZXJyb3IiKTsKICBjb25zdCBzdGFjayA9IChldi5lcnJvciBhcyB7IHN0YWNrPzogc3RyaW5nIH0pPy5zdGFjazsKICB0cnkgewogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAic3RhcnQtZXJyb3IiLCBtZXNzYWdlOiBzdGFjayA/IGAke21zZ31cbiR7c3RhY2t9YCA6IG1zZyB9KTsKICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogImV4aXQiLCBjb2RlOiAxLCBsYXN0U3RkZXJyIH0pOwogIH0gY2F0Y2ggKF8pIHsKICB9Cn0pOwoKc2VsZi5hZGRFdmVudExpc3RlbmVyKCJ1bmhhbmRsZWRyZWplY3Rpb24iLCAoZXYpID0+IHsKICBpZiAoZmF0YWxTZW50KSByZXR1cm47CiAgZmF0YWxTZW50ID0gdHJ1ZTsKICBjb25zdCByZWFzb24gPSBldi5yZWFzb247CiAgY29uc3QgbXNnID0gKHJlYXNvbiAmJiAocmVhc29uLm1lc3NhZ2UgfHwgU3RyaW5nKHJlYXNvbikpKSB8fCAidW5oYW5kbGVkIHJlamVjdGlvbiI7CiAgY29uc3Qgc3RhY2sgPSAocmVhc29uIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSk/LnN0YWNrOwogIHRyeSB7CiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bXNnfVxuJHtzdGFja31gIDogbXNnIH0pOwogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiZXhpdCIsIGNvZGU6IDEsIGxhc3RTdGRlcnIgfSk7CiAgfSBjYXRjaCAoXykgewogIH0KfSk7CgpzZWxmLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50PEluYm91bmRNZXNzYWdlPikgPT4gewogIGNvbnN0IHsgdHlwZSB9ID0gZXZlbnQuZGF0YSB8fCB7fTsKICBpZiAodHlwZSA9PT0gInN0YXJ0IikgewogICAgc3RhcnROdmltKGV2ZW50LmRhdGEgYXMgU3RhcnRNZXNzYWdlKS5jYXRjaCgoZXJyKSA9PiB7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInN0YXJ0LWVycm9yIiwgbWVzc2FnZTogZXJyPy5tZXNzYWdlIHx8IFN0cmluZyhlcnIpIH0pOwogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJleGl0IiwgY29kZTogMSB9KTsKICAgIH0pOwogIH0gZWxzZSBpZiAodHlwZSA9PT0gInN0b3AiKSB7CiAgICB0cnkgewogICAgICBhY3RpdmVXYXNpPy53YXNpSW1wb3J0Py5wcm9jX2V4aXQ/LigwKTsKICAgIH0gY2F0Y2ggKF8pIHsKICAgIH0KICAgIGlucHV0RmQgPSBudWxsOwogIH0KfTsKCmNsYXNzIFJpbmdGZCBleHRlbmRzIEZkIHsKICBwcml2YXRlIHJlYWRvbmx5IGN0cmw6IEludDMyQXJyYXk7CiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBVaW50OEFycmF5OwogIHByaXZhdGUgcmVhZG9ubHkgY2FwYWNpdHk6IG51bWJlcjsKCiAgY29uc3RydWN0b3IoYnVmZmVyOiBTaGFyZWRBcnJheUJ1ZmZlcikgewogICAgc3VwZXIoKTsKICAgIHRoaXMuY3RybCA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMik7CiAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheShidWZmZXIsIDgpOwogICAgdGhpcy5jYXBhY2l0eSA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgfQoKICBmZF9mZHN0YXRfZ2V0KCkgewogICAgY29uc3QgZmRzdGF0ID0gbmV3IHdhc2kuRmRzdGF0KHdhc2kuRklMRVRZUEVfUkVHVUxBUl9GSUxFLCAwKTsKICAgIGZkc3RhdC5mc19yaWdodHNfYmFzZSA9IEJpZ0ludCh3YXNpLlJJR0hUU19GRF9SRUFEIHwgd2FzaS5SSUdIVFNfRkRfV1JJVEUpOwogICAgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX1NVQ0NFU1MsIGZkc3RhdCB9OwogIH0KCiAgZmRfY2xvc2UoKSB7IHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7IH0KCiAgZmRfcmVhZChzaXplOiBudW1iZXIpIHsKICAgIGNvbnN0IG1heCA9IE1hdGgubWluKE1hdGgubWF4KDAsIE51bWJlcihzaXplKSB8fCAwKSwgdGhpcy5jYXBhY2l0eSk7CiAgICBpZiAobWF4ID09PSAwKSByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fQUdBSU4sIGRhdGE6IG5ldyBVaW50OEFycmF5KCkgfTsKICAgIGxldCBoZWFkID0gQXRvbWljcy5sb2FkKHRoaXMuY3RybCwgMCk7CiAgICBjb25zdCB0YWlsID0gQXRvbWljcy5sb2FkKHRoaXMuY3RybCwgMSk7CiAgICBpZiAoaGVhZCA9PT0gdGFpbCkgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0FHQUlOLCBkYXRhOiBuZXcgVWludDhBcnJheSgpIH07CiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShtYXgpOwogICAgbGV0IHdyaXR0ZW4gPSAwOwogICAgd2hpbGUgKGhlYWQgIT09IHRhaWwgJiYgd3JpdHRlbiA8IG1heCkgewogICAgICBvdXRbd3JpdHRlbisrXSA9IHRoaXMuZGF0YVtoZWFkXTsKICAgICAgaGVhZCA9IChoZWFkICsgMSkgJSB0aGlzLmNhcGFjaXR5OwogICAgfQogICAgQXRvbWljcy5zdG9yZSh0aGlzLmN0cmwsIDAsIGhlYWQpOwogICAgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX1NVQ0NFU1MsIGRhdGE6IG91dC5zbGljZSgwLCB3cml0dGVuKSB9OwogIH0KCiAgZmRfd3JpdGUoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBud3JpdHRlbjogMCB9OyB9CiAgZmRfc2VlaygpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIG9mZnNldDogMG4gfTsgfQogIGZkX3RlbGwoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBvZmZzZXQ6IDBuIH07IH0KICBmZF9wcmVhZCgpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIGRhdGE6IG5ldyBVaW50OEFycmF5KCkgfTsgfQogIGZkX3B3cml0ZSgpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIG53cml0dGVuOiAwIH07IH0KfQoKY2xhc3MgU2lua0ZkIGV4dGVuZHMgRmQgewogIHByaXZhdGUgcmVhZG9ubHkgb25Xcml0ZTogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHZvaWQ7CgogIGNvbnN0cnVjdG9yKG9uV3JpdGU6IChkYXRhOiBVaW50OEFycmF5KSA9PiB2b2lkKSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5vbldyaXRlID0gb25Xcml0ZTsKICB9CgogIGZkX2Zkc3RhdF9nZXQoKSB7CiAgICBjb25zdCBmZHN0YXQgPSBuZXcgd2FzaS5GZHN0YXQod2FzaS5GSUxFVFlQRV9SRUdVTEFSX0ZJTEUsIDApOwogICAgZmRzdGF0LmZzX3JpZ2h0c19iYXNlID0gQmlnSW50KHdhc2kuUklHSFRTX0ZEX1dSSVRFKTsKICAgIHJldHVybiB7IHJldDogd2FzaS5FUlJOT19TVUNDRVNTLCBmZHN0YXQgfTsKICB9CgogIGZkX3dyaXRlKGRhdGE6IFVpbnQ4QXJyYXkpIHsKICAgIHRoaXMub25Xcml0ZShuZXcgVWludDhBcnJheShkYXRhKSk7CiAgICByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fU1VDQ0VTUywgbndyaXR0ZW46IGRhdGEuYnl0ZUxlbmd0aCB9OwogIH0KCiAgZmRfY2xvc2UoKSB7IHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7IH0KfQoKYXN5bmMgZnVuY3Rpb24gc3RhcnROdmltKHsgY29scywgcm93cywgd2FzbVBhdGgsIHJ1bnRpbWVQYXRoLCBpbnB1dEJ1ZmZlciwgZW52OiBleHRyYUVudiwgZmlsZXMgfTogU3RhcnRNZXNzYWdlKSB7CiAgbGV0IGV4aXRDb2RlID0gMTsKICB0cnkgewogICAgaWYgKCFpbnB1dEJ1ZmZlcikgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6ICJpbnB1dCBidWZmZXIgbWlzc2luZyIgfSk7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogImV4aXQiLCBjb2RlOiAxIH0pOwogICAgICByZXR1cm47CiAgICB9CgogICAgcnBjRGVjb2RlciA9IG51bGw7CiAgICBpbnB1dEZkID0gbmV3IFJpbmdGZChpbnB1dEJ1ZmZlcik7CgogICAgY29uc3Qgd2FzbUJ5dGVzID0gYXdhaXQgZ2V0Q2FjaGVkV2FzbUJ5dGVzKHdhc21QYXRoKTsKICAgIGNvbnN0IHVudGFycmVkID0gYXdhaXQgZ2V0Q2FjaGVkUnVudGltZUVudHJpZXMocnVudGltZVBhdGgpOwogICAgY29uc3QgZnNSb290ID0gYnVpbGRGcyh1bnRhcnJlZCwgKCkgPT4ge30pOwogICAgaWYgKGZpbGVzICYmIEFycmF5LmlzQXJyYXkoZmlsZXMpICYmIGZpbGVzLmxlbmd0aCkgYXBwbHlFeHRyYUZpbGVzKGZzUm9vdCwgZmlsZXMpOwoKICAgIGNvbnN0IHN0ZGluRmQgPSBpbnB1dEZkITsKICAgIGNvbnN0IHN0ZG91dEZkID0gbmV3IFNpbmtGZChoYW5kbGVTdGRvdXQpOwogICAgY29uc3Qgc3RkZXJyRmQgPSBuZXcgU2lua0ZkKChkYXRhKSA9PiB7CiAgICAgIGNvbnN0IG1zZyA9IHN0ZGVyckRlY29kZXIuZGVjb2RlKGRhdGEpOwogICAgICBpZiAobXNnKSB7CiAgICAgICAgbGFzdFN0ZGVyciA9IChsYXN0U3RkZXJyICsgbXNnKS5zbGljZSgtODE5Mik7CiAgICAgIH0KICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAic3RkZXJyIiwgbWVzc2FnZTogbXNnIH0pOwogICAgfSk7CgogICAgY29uc3QgcHJlb3BlbiA9IG5ldyBSb290ZWRQcmVvcGVuRGlyZWN0b3J5KCJudmltIiwgZnNSb290LmNvbnRlbnRzKTsKICAgIGNvbnN0IHRtcERpciA9IGZzUm9vdC5jb250ZW50cy5nZXQoInRtcCIpIGFzIERpcmVjdG9yeSB8IHVuZGVmaW5lZDsKICAgIGNvbnN0IHRtcCA9IHRtcERpcj8uY29udGVudHMgfHwgbmV3IE1hcCgpOwogICAgY29uc3QgcHJlb3BlblRtcCA9IG5ldyBSb290ZWRQcmVvcGVuRGlyZWN0b3J5KCJ0bXAiLCB0bXApOwoKICAgIGNvbnN0IGFyZ3MgPSBbIm52aW0iLCAiLS1oZWFkbGVzcyIsICItLWVtYmVkIiwgIi11IiwgIk5PUkMiLCAiLS1ub3BsdWdpbiIsICItaSIsICJOT05FIiwgIi1uIl07CiAgICBjb25zdCBlbnYgPSBbCiAgICAgICJWSU1SVU5USU1FPS9udmltL3J1bnRpbWUiLAogICAgICAiSE9NRT0vbnZpbS9ob21lIiwKICAgICAgIlBXRD0vbnZpbSIsCiAgICAgICJYREdfQ09ORklHX0hPTUU9L252aW0vaG9tZS8uY29uZmlnIiwKICAgICAgIlhER19EQVRBX0hPTUU9L252aW0vaG9tZS8ubG9jYWwvc2hhcmUiLAogICAgICAiWERHX1NUQVRFX0hPTUU9L252aW0vaG9tZS8ubG9jYWwvc3RhdGUiLAogICAgICAiUEFUSD0vdXNyL2JpbjovYmluIiwKICAgICAgIlRNUERJUj0vbnZpbS90bXAiLAogICAgICBgQ09MVU1OUz0ke2NvbHMgfHwgMTIwfWAsCiAgICAgIGBMSU5FUz0ke3Jvd3MgfHwgNDB9YCwKICAgIF07CiAgICBpZiAoZXh0cmFFbnYgJiYgdHlwZW9mIGV4dHJhRW52ID09PSAib2JqZWN0IikgewogICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhleHRyYUVudikpIHsKICAgICAgICBpZiAoIWspIGNvbnRpbnVlOwogICAgICAgIGVudi5wdXNoKGAke2t9PSR7U3RyaW5nKHYgPz8gIiIpfWApOwogICAgICB9CiAgICB9CiAgICBhY3RpdmVXYXNpID0gbmV3IFdBU0koYXJncywgZW52LCBbc3RkaW5GZCwgc3Rkb3V0RmQsIHN0ZGVyckZkLCBwcmVvcGVuLCBwcmVvcGVuVG1wXSwgeyBkZWJ1ZzogZmFsc2UgfSk7CiAgICBhY3RpdmVXYXNpLmZkc1swXSA9IHN0ZGluRmQ7CiAgICBhY3RpdmVXYXNpLmZkc1sxXSA9IHN0ZG91dEZkOwogICAgYWN0aXZlV2FzaS5mZHNbMl0gPSBzdGRlcnJGZDsKICAgIGFjdGl2ZVdhc2kuZmRzWzNdID0gcHJlb3BlbjsKICAgIGFjdGl2ZVdhc2kuZmRzWzRdID0gcHJlb3BlblRtcDsKICAgIChhY3RpdmVXYXNpIGFzIHVua25vd24gYXMgeyBwcmVvcGVuczogUmVjb3JkPHN0cmluZywgUHJlb3BlbkRpcmVjdG9yeT4gfSkucHJlb3BlbnMgPSB7ICIvbnZpbSI6IHByZW9wZW4sICIvdG1wIjogcHJlb3BlblRtcCB9OwoKICAgIGNvbnN0IGVudkltcG9ydHMgPSBtYWtlRW52KCgpID0+IGFjdGl2ZVdhc2k/Lndhc2lJbXBvcnQ/LnByb2NfZXhpdD8uKDEpKTsKICAgIGNvbnN0IHdhc21JbnN0YW5jZSA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21CeXRlcywgewogICAgICB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiBhY3RpdmVXYXNpLndhc2lJbXBvcnQsCiAgICAgIGVudjogZW52SW1wb3J0cywKICAgIH0pOwogICAgY29uc3QgaW5zdGFuY2VTb3VyY2UgPSB3YXNtSW5zdGFuY2UgYXMgdW5rbm93biBhcyBXZWJBc3NlbWJseS5XZWJBc3NlbWJseUluc3RhbnRpYXRlZFNvdXJjZTsKICAgIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VTb3VyY2UuaW5zdGFuY2UKICAgICAgPz8gKHdhc21JbnN0YW5jZSBhcyB1bmtub3duIGFzIHsgaW5zdGFuY2U6IFdlYkFzc2VtYmx5Lkluc3RhbmNlIH0pLmluc3RhbmNlOwogICAgZXhpdENvZGUgPSBhY3RpdmVXYXNpLnN0YXJ0KGluc3RhbmNlIGFzIGFueSk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBjb25zdCBtZXNzYWdlID0gKGVyciBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycik7CiAgICBjb25zdCBzdGFjayA9IChlcnIgYXMgeyBzdGFjaz86IHN0cmluZyB9KT8uc3RhY2s7CiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bWVzc2FnZX1cbiR7c3RhY2t9YCA6IG1lc3NhZ2UgfSk7CiAgfQoKICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJleGl0IiwgY29kZTogZXhpdENvZGUsIGxhc3RTdGRlcnIgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldENhY2hlZFdhc21CeXRlcyh1cmw6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4gewogIGlmIChjYWNoZWRXYXNtICYmIGNhY2hlZFdhc20udXJsID09PSB1cmwgJiYgY2FjaGVkV2FzbS5ieXRlcz8uYnl0ZUxlbmd0aCkgcmV0dXJuIGNhY2hlZFdhc20uYnl0ZXM7CiAgY29uc3QgYnl0ZXMgPSBhd2FpdCBmZXRjaEJ5dGVzKHVybCk7CiAgY2FjaGVkV2FzbSA9IHsgdXJsLCBieXRlcyB9OwogIHJldHVybiBieXRlczsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkUnVudGltZUVudHJpZXModXJsOiBzdHJpbmcpOiBQcm9taXNlPFRhckVudHJ5W10+IHsKICBpZiAoY2FjaGVkUnVudGltZSAmJiBjYWNoZWRSdW50aW1lLnVybCA9PT0gdXJsICYmIGNhY2hlZFJ1bnRpbWUuZW50cmllcz8ubGVuZ3RoKSByZXR1cm4gY2FjaGVkUnVudGltZS5lbnRyaWVzOwogIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBmZXRjaEJ5dGVzKHVybCk7CiAgbGV0IHJ1bnRpbWVCeXRlczogVWludDhBcnJheTsKICBpZiAobG9va3NMaWtlR3ppcChhcmNoaXZlKSkgewogICAgdHJ5IHsKICAgICAgcnVudGltZUJ5dGVzID0gZ3VuemlwU3luYyhhcmNoaXZlKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBndW56aXAgcnVudGltZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGV9YCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJ1bnRpbWVCeXRlcyA9IGFyY2hpdmU7CiAgfQogIGxldCBlbnRyaWVzOiBUYXJFbnRyeVtdOwogIHRyeSB7CiAgICBlbnRyaWVzID0gdW50YXIocnVudGltZUJ5dGVzKTsKICB9IGNhdGNoIChlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYHVudGFyIHJ1bnRpbWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlfWApOwogIH0KICBjYWNoZWRSdW50aW1lID0geyB1cmwsIGVudHJpZXMgfTsKICByZXR1cm4gZW50cmllczsKfQoKZnVuY3Rpb24gYXBwbHlFeHRyYUZpbGVzKGZzUm9vdDogRGlyTm9kZSwgZmlsZXM6IEFycmF5PHsgcGF0aDogc3RyaW5nOyBkYXRhOiBhbnkgfT4pIHsKICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHsKICAgIGNvbnN0IHJhd1BhdGggPSBTdHJpbmcoZmlsZT8ucGF0aCA/PyAiIik7CiAgICBjb25zdCBjbGVhbiA9IHJhd1BhdGgucmVwbGFjZSgvXlwvKy8sICIiKS5yZXBsYWNlKC9eXC5cLysvLCAiIik7CiAgICBpZiAoIWNsZWFuIHx8IGNsZWFuLmVuZHNXaXRoKCIvIikpIGNvbnRpbnVlOwogICAgY29uc3QgZGF0YSA9IHRvVTgoZmlsZT8uZGF0YSk7CiAgICBpZiAoIWRhdGEpIGNvbnRpbnVlOwogICAgY29uc3QgcGFydHMgPSBjbGVhbi5zcGxpdCgiLyIpLmZpbHRlcihCb29sZWFuKTsKICAgIGlmICghcGFydHMubGVuZ3RoKSBjb250aW51ZTsKICAgIGxldCBkaXI6IERpck5vZGUgPSBmc1Jvb3Q7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkgKz0gMSkgewogICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07CiAgICAgIGlmICghZGlyLmNvbnRlbnRzLmhhcyhwYXJ0KSkgZGlyLmNvbnRlbnRzLnNldChwYXJ0LCBuZXcgRGlyZWN0b3J5KG5ldyBNYXAoKSkpOwogICAgICBkaXIgPSBkaXIuY29udGVudHMuZ2V0KHBhcnQpIGFzIERpck5vZGU7CiAgICB9CiAgICBjb25zdCBsZWFmID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07CiAgICBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBGaWxlKGRhdGEsIHsgcmVhZG9ubHk6IGZhbHNlIH0pKTsKICB9Cn0KCmZ1bmN0aW9uIHRvVTgoZGF0YTogYW55KTogVWludDhBcnJheSB8IG51bGwgewogIGlmICghZGF0YSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KCk7CiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gZGF0YTsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEpOwogIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgaWYgKGRhdGEgJiYgZGF0YS50eXBlID09PSAiQnVmZmVyIiAmJiBBcnJheS5pc0FycmF5KGRhdGEuZGF0YSkpIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmRhdGEpOwogIHRyeSB7CiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFN0cmluZyhkYXRhKSk7CiAgfSBjYXRjaCAoXykgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpmdW5jdGlvbiBoYW5kbGVTdGRvdXQoY2h1bms6IFVpbnQ4QXJyYXkpIHsKICBpZiAoIXJwY0RlY29kZXIpIHsKICAgIHJwY0RlY29kZXIgPSBuZXcgRGVjb2RlcihoYW5kbGVNZXNzYWdlKTsKICB9CiAgdHJ5IHsKICAgIHJwY0RlY29kZXIucHVzaChjaHVuayk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB2b2lkIGVycjsKICAgIHJwY0RlY29kZXIgPSBuZXcgRGVjb2RlcihoYW5kbGVNZXNzYWdlKTsKICB9Cn0KCmZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobXNnOiB1bmtub3duKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KG1zZykgfHwgbXNnLmxlbmd0aCA8IDEpIHJldHVybjsKICBjb25zdCBraW5kID0gbXNnWzBdOwogIGlmIChraW5kID09PSAwKSB7CiAgICBjb25zdCBbLCBtc2dpZCwgbWV0aG9kLCBwYXJhbXNdID0gbXNnOwogICAgaWYgKG1ldGhvZCA9PT0gIndhc20tY2xpcGJvYXJkLXBhc3RlIikgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJjbGlwYm9hcmQtcGFzdGUiLCBtc2dpZCB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInJwYy1yZXF1ZXN0IiwgbXNnaWQsIG1ldGhvZCwgcGFyYW1zIH0pOwogICAgfQogIH0gZWxzZSBpZiAoa2luZCA9PT0gMSkgewogICAgY29uc3QgWywgbXNnaWQsIGVycm9yLCByZXN1bHRdID0gbXNnOwogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAicnBjLXJlc3BvbnNlIiwgbXNnaWQsIGVycm9yLCByZXN1bHQgfSk7CiAgfSBlbHNlIGlmIChraW5kID09PSAyKSB7CiAgICBjb25zdCBbLCBtZXRob2QsIHBhcmFtc10gPSBtc2c7CiAgICBpZiAobWV0aG9kID09PSAid2FzbS1jbGlwYm9hcmQtY29weSIpIHsKICAgICAgY29uc3QgbGluZXMgPSBBcnJheS5pc0FycmF5KHBhcmFtcz8uWzBdKSA/IHBhcmFtc1swXSA6IFtdOwogICAgICBjb25zdCByZWd0eXBlID0gdHlwZW9mIHBhcmFtcz8uWzFdID09PSAic3RyaW5nIiA/IHBhcmFtc1sxXSA6ICJ2IjsKICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiY2xpcGJvYXJkLWNvcHkiLCBsaW5lcywgcmVndHlwZSB9KTsKICAgIH0gZWxzZSBpZiAoCiAgICAgIG1ldGhvZCA9PT0gIm52aW1fYnVmX2xpbmVzX2V2ZW50IgogICAgICB8fCBtZXRob2QgPT09ICJudmltX2J1Zl9kZXRhY2hfZXZlbnQiCiAgICAgIHx8IG1ldGhvZCA9PT0gInJlZHJhdyIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2N1cnNvciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX21vZGUiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm1vbmFjb19jdXJzb3JNb3ZlIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fc2Nyb2xsIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fcmV2ZWFsIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fbW92ZUN1cnNvciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX3Njcm9sbG9mZiIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2hvc3RfY29tbWFuZCIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2J1Zl9lbnRlciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2J1Zl9kZWxldGUiCiAgICApIHsKICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAicnBjLW5vdGlmeSIsIG1ldGhvZCwgcGFyYW1zIH0pOwogICAgfQogIH0KfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hCeXRlcyh1cmw6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4gewogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7CiAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgZmV0Y2ggJHt1cmx9IGZhaWxlZCAoJHtyZXMuc3RhdHVzfSlgKTsKICBjb25zdCBjdCA9IChyZXMuaGVhZGVycy5nZXQoImNvbnRlbnQtdHlwZSIpIHx8ICIiKS50b0xvd2VyQ2FzZSgpOwogIGlmIChjdC5pbmNsdWRlcygidGV4dC9odG1sIikpIHRocm93IG5ldyBFcnJvcihgZmV0Y2ggJHt1cmx9IHJldHVybmVkIEhUTUwgKGxpa2VseSB3cm9uZyBwYXRoIG9yIGRldiBzZXJ2ZXIgZmFsbGJhY2spYCk7CiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpKTsKICBpZiAoIWRhdGEuYnl0ZUxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKGBmZXRjaCAke3VybH0gcmV0dXJuZWQgZW1wdHkgYm9keWApOwogIHJldHVybiBkYXRhOwp9Cgp0eXBlIFRhckVudHJ5ID0geyBuYW1lOiBzdHJpbmc7IHR5cGU6ICJkaXIiIHwgImZpbGUiOyBkYXRhOiBVaW50OEFycmF5IH07CgpmdW5jdGlvbiBsb29rc0xpa2VHemlwKGRhdGE6IFVpbnQ4QXJyYXkpIHsKICByZXR1cm4gZGF0YSAmJiBkYXRhLmxlbmd0aCA+PSAyICYmIGRhdGFbMF0gPT09IDB4MWYgJiYgZGF0YVsxXSA9PT0gMHg4YjsKfQoKZnVuY3Rpb24gdW50YXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBUYXJFbnRyeVtdIHsKICBjb25zdCBmaWxlczogVGFyRW50cnlbXSA9IFtdOwogIGNvbnN0IGRhdGEgPSBieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBieXRlcyA6IG5ldyBVaW50OEFycmF5KGJ5dGVzKTsKICBsZXQgb2Zmc2V0ID0gMDsKICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7CiAgbGV0IHNhZmV0eSA9IDA7CgogIHdoaWxlIChvZmZzZXQgKyA1MTIgPD0gZGF0YS5sZW5ndGgpIHsKICAgIGlmIChzYWZldHkrKyA+IDEwMF8wMDApIHRocm93IG5ldyBFcnJvcigidW50YXIgc2FmZXR5IGJyZWFrIik7CiAgICBjb25zdCBuYW1lID0gZGVjb2RlVGFyU3RyaW5nKGRlY29kZXIsIGRhdGEsIG9mZnNldCwgMTAwKTsKICAgIGNvbnN0IHNpemVUZXh0ID0gZGVjb2RlVGFyU3RyaW5nKGRlY29kZXIsIGRhdGEsIG9mZnNldCArIDEyNCwgMTIpOwogICAgY29uc3QgdHlwZWZsYWcgPSBkYXRhW29mZnNldCArIDE1Nl07CiAgICBjb25zdCBwcmVmaXggPSBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlciwgZGF0YSwgb2Zmc2V0ICsgMzQ1LCAxNTUpOwogICAgaWYgKCFuYW1lICYmICFwcmVmaXgpIGJyZWFrOwogICAgY29uc3Qgc2l6ZVJhdyA9IHNpemVUZXh0LnRyaW0oKSB8fCAiMCI7CiAgICBjb25zdCBzaXplID0gcGFyc2VJbnQoc2l6ZVJhdywgOCk7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzaXplKSB8fCBzaXplIDwgMCkgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRhciBzaXplOiAke3NpemVSYXd9YCk7CiAgICBjb25zdCBmdWxsTmFtZSA9IHByZWZpeCA/IGAke3ByZWZpeH0vJHtuYW1lfWAgOiBuYW1lOwogICAgY29uc3QgYm9keVN0YXJ0ID0gb2Zmc2V0ICsgNTEyOwogICAgY29uc3QgYm9keUVuZCA9IGJvZHlTdGFydCArIHNpemU7CiAgICBjb25zdCBwYXlsb2FkID0gZGF0YS5zbGljZShib2R5U3RhcnQsIGJvZHlFbmQpOwogICAgZmlsZXMucHVzaCh7IG5hbWU6IGZ1bGxOYW1lLCB0eXBlOiB0eXBlZmxhZyA9PT0gNTMgPyAiZGlyIiA6ICJmaWxlIiwgZGF0YTogcGF5bG9hZCB9KTsKICAgIGNvbnN0IGJsb2NrcyA9IE1hdGguY2VpbChzaXplIC8gNTEyKTsKICAgIGNvbnN0IG5leHQgPSBib2R5U3RhcnQgKyBibG9ja3MgKiA1MTI7CiAgICBpZiAobmV4dCA8PSBvZmZzZXQpIHRocm93IG5ldyBFcnJvcigidGFyIHBhcnNlIGRpZCBub3QgYWR2YW5jZSIpOwogICAgb2Zmc2V0ID0gbmV4dDsKICB9CiAgcmV0dXJuIGZpbGVzOwp9CgpmdW5jdGlvbiBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlcjogVGV4dERlY29kZXIsIGRhdGE6IFVpbnQ4QXJyYXksIHN0YXJ0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHsKICBsZXQgZW5kID0gc3RhcnQ7CiAgY29uc3QgbWF4ID0gc3RhcnQgKyBsZW5ndGg7CiAgd2hpbGUgKGVuZCA8IG1heCAmJiBkYXRhW2VuZF0gIT09IDApIGVuZCArPSAxOwogIHJldHVybiBkZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KHN0YXJ0LCBlbmQpKS50cmltKCk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRnMoZW50cmllczogVGFyRW50cnlbXSwgb25Qcm9ncmVzcz86IChjb3VudDogbnVtYmVyKSA9PiB2b2lkKSB7CiAgY29uc3Qgcm9vdCA9IG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSBhcyBEaXJOb2RlOwogIGxldCBjb3VudCA9IDA7CiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICBjb25zdCBjbGVhbiA9IGVudHJ5Lm5hbWUucmVwbGFjZSgvXlwuXC8/LywgIiIpOwogICAgaWYgKCFjbGVhbikgY29udGludWU7CiAgICBjb25zdCBwYXJ0cyA9IGNsZWFuLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pOwogICAgaWYgKCFwYXJ0cy5sZW5ndGgpIGNvbnRpbnVlOwogICAgY291bnQgKz0gMTsKICAgIGlmIChvblByb2dyZXNzICYmIGNvdW50ICUgNTAwID09PSAwKSBvblByb2dyZXNzKGNvdW50KTsKCiAgICBsZXQgZGlyOiBEaXJOb2RlID0gcm9vdDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSArPSAxKSB7CiAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgaWYgKCFkaXIuY29udGVudHMuaGFzKHBhcnQpKSBkaXIuY29udGVudHMuc2V0KHBhcnQsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICAgIGRpciA9IGRpci5jb250ZW50cy5nZXQocGFydCkgYXMgRGlyTm9kZTsKICAgIH0KCiAgICBjb25zdCBsZWFmID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07CiAgICBpZiAoZW50cnkudHlwZSA9PT0gImRpciIpIHsKICAgICAgaWYgKCFkaXIuY29udGVudHMuaGFzKGxlYWYpKSBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICB9IGVsc2UgewogICAgICBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBGaWxlKGVudHJ5LmRhdGEsIHsgcmVhZG9ubHk6IHRydWUgfSkpOwogICAgfQogIH0KCiAgZW5zdXJlRGlyKHJvb3QsICJob21lIik7CiAgZW5zdXJlRGlyKHJvb3QsICJ0bXAiKTsKICBlbnN1cmVEaXIocm9vdCwgImhvbWUvLmNvbmZpZyIpOwogIGVuc3VyZURpcihyb290LCAiaG9tZS8ubG9jYWwvc2hhcmUiKTsKICBlbnN1cmVEaXIocm9vdCwgImhvbWUvLmxvY2FsL3N0YXRlIik7CgogIHJldHVybiByb290Owp9CgpmdW5jdGlvbiBlbnN1cmVEaXIocm9vdDogRGlyTm9kZSwgcGF0aDogc3RyaW5nKSB7CiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pOwogIGxldCBub2RlOiBEaXJOb2RlID0gcm9vdDsKICBmb3IgKGNvbnN0IHAgb2YgcGFydHMpIHsKICAgIGlmICghbm9kZS5jb250ZW50cy5oYXMocCkpIG5vZGUuY29udGVudHMuc2V0KHAsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICBub2RlID0gbm9kZS5jb250ZW50cy5nZXQocCkgYXMgRGlyTm9kZTsKICB9Cn0KCmZ1bmN0aW9uIG1ha2VFbnYocHJvY0V4aXQ/OiAoY29kZTogbnVtYmVyKSA9PiB2b2lkKSB7CiAgY29uc3Qgd2FzbUFueSA9IFdlYkFzc2VtYmx5IGFzIGFueTsKICBjb25zdCBjTG9uZ2ptcCA9IG5ldyB3YXNtQW55LlRhZyh7IHBhcmFtZXRlcnM6IFsiaTMyIl0sIHJlc3VsdHM6IFtdIH0pIGFzIGFueTsKICByZXR1cm4gewogICAgZmxvY2s6ICgpID0+IDAsCiAgICBnZXRwaWQ6ICgpID0+IDEsCiAgICB1dl9yYW5kb206ICgpID0+IC0zOCwKICAgIHV2X3d0ZjhfdG9fdXRmMTY6ICgpID0+IHt9LAogICAgdXZfdXRmMTZfbGVuZ3RoX2FzX3d0Zjg6ICgpID0+IDAsCiAgICB1dl91dGYxNl90b193dGY4OiAoKSA9PiAtMzgsCiAgICB1dl93dGY4X2xlbmd0aF9hc191dGYxNjogKCkgPT4gMCwKICAgIF9fd2FzbV9sb25nam1wOiAocHRyOiBudW1iZXIpID0+IHsKICAgICAgaWYgKHByb2NFeGl0KSBwcm9jRXhpdCgxKTsKICAgICAgdGhyb3cgbmV3IHdhc21BbnkuRXhjZXB0aW9uKGNMb25nam1wLCBbcHRyID8/IDBdKTsKICAgIH0sCiAgICBfX3dhc21fc2V0am1wOiAoKSA9PiAwLAogICAgX193YXNtX3NldGptcF90ZXN0OiAoKSA9PiAwLAogICAgdG1wZmlsZTogKCkgPT4gMCwKICAgIGNsb2NrOiAoKSA9PiAwLAogICAgc3lzdGVtOiAoKSA9PiAtMSwKICAgIHRtcG5hbTogKCkgPT4gMCwKICAgIF9fY19sb25nam1wOiBjTG9uZ2ptcCwKICB9IGFzIFdlYkFzc2VtYmx5Lk1vZHVsZUltcG9ydHM7Cn0KCmNsYXNzIFJvb3RlZFByZW9wZW5EaXJlY3RvcnkgZXh0ZW5kcyBQcmVvcGVuRGlyZWN0b3J5IHsKICAjc3RyaXAocGF0aDogc3RyaW5nKSB7IHJldHVybiBwYXRoLnJlcGxhY2UoL15cLysvLCAiIik7IH0KICBwYXRoX29wZW4oCiAgICBkaXJmbGFnczogbnVtYmVyLAogICAgcGF0aF9zdHI6IHN0cmluZywKICAgIG9mbGFnczogbnVtYmVyLAogICAgZnNfcmlnaHRzX2Jhc2U6IGJpZ2ludCwKICAgIGZzX3JpZ2h0c19pbmhlcml0aW5nOiBiaWdpbnQsCiAgICBmZF9mbGFnczogbnVtYmVyLAogICkgewogICAgcmV0dXJuIHN1cGVyLnBhdGhfb3BlbihkaXJmbGFncywgdGhpcy4jc3RyaXAocGF0aF9zdHIpLCBvZmxhZ3MsIGZzX3JpZ2h0c19iYXNlLCBmc19yaWdodHNfaW5oZXJpdGluZywgZmRfZmxhZ3MpOwogIH0KICBwYXRoX2ZpbGVzdGF0X2dldChmbGFnczogbnVtYmVyLCBwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX2ZpbGVzdGF0X2dldChmbGFncywgdGhpcy4jc3RyaXAocGF0aF9zdHIpKTsgfQogIHBhdGhfY3JlYXRlX2RpcmVjdG9yeShwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX2NyZWF0ZV9kaXJlY3RvcnkodGhpcy4jc3RyaXAocGF0aF9zdHIpKTsgfQogIHBhdGhfdW5saW5rX2ZpbGUocGF0aF9zdHI6IHN0cmluZykgeyByZXR1cm4gc3VwZXIucGF0aF91bmxpbmtfZmlsZSh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9yZW1vdmVfZGlyZWN0b3J5KHBhdGhfc3RyOiBzdHJpbmcpIHsgcmV0dXJuIHN1cGVyLnBhdGhfcmVtb3ZlX2RpcmVjdG9yeSh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9saW5rKHBhdGhfc3RyOiBzdHJpbmcsIGlub2RlOiBJbm9kZSwgYWxsb3dfZGlyOiBib29sZWFuKSB7IHJldHVybiBzdXBlci5wYXRoX2xpbmsodGhpcy4jc3RyaXAocGF0aF9zdHIpLCBpbm9kZSwgYWxsb3dfZGlyKTsgfQogIHBhdGhfcmVhZGxpbmsocGF0aF9zdHI6IHN0cmluZykgeyByZXR1cm4gc3VwZXIucGF0aF9yZWFkbGluayh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9zeW1saW5rKG9sZF9wYXRoOiBzdHJpbmcsIG5ld19wYXRoOiBzdHJpbmcpIHsKICAgIGNvbnN0IHRhcmdldCA9IChQcmVvcGVuRGlyZWN0b3J5LnByb3RvdHlwZSBhcyB1bmtub3duIGFzIHsgcGF0aF9zeW1saW5rPzogKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKSA9PiBudW1iZXIgfSkucGF0aF9zeW1saW5rOwogICAgaWYgKCF0YXJnZXQpIHJldHVybiB3YXNpLkVSUk5PX05PVFNVUDsKICAgIHJldHVybiB0YXJnZXQuY2FsbCh0aGlzLCB0aGlzLiNzdHJpcChvbGRfcGF0aCksIHRoaXMuI3N0cmlwKG5ld19wYXRoKSk7CiAgfQp9Cg==", import.meta.url),
|
|
1046
1069
|
reuseWorker: e.reuseWorker ?? !1,
|
|
1047
1070
|
wasmPath: e.wasmPath ?? "",
|
|
1048
1071
|
runtimePath: e.runtimePath ?? "",
|
|
1049
1072
|
inputMode: e.inputMode ?? "shared",
|
|
1050
1073
|
env: e.env,
|
|
1051
1074
|
files: e.files,
|
|
1052
|
-
sharedInputBytes: e.sharedInputBytes ??
|
|
1075
|
+
sharedInputBytes: e.sharedInputBytes ?? x,
|
|
1053
1076
|
cols: e.cols ?? 120,
|
|
1054
1077
|
rows: e.rows ?? 40,
|
|
1055
1078
|
minCols: e.minCols ?? 20,
|
|
@@ -1075,7 +1098,7 @@ class ce {
|
|
|
1075
1098
|
onHostCommand: e.onHostCommand,
|
|
1076
1099
|
status: e.status ?? (() => {
|
|
1077
1100
|
}),
|
|
1078
|
-
seedLines: e.seedLines ??
|
|
1101
|
+
seedLines: e.seedLines ?? pe,
|
|
1079
1102
|
seedName: e.seedName ?? "monaco-demo.lua",
|
|
1080
1103
|
seedFiletype: e.seedFiletype ?? "lua",
|
|
1081
1104
|
uiAttach: e.uiAttach ?? !0,
|
|
@@ -1086,8 +1109,8 @@ class ce {
|
|
|
1086
1109
|
rgb: e.uiAttachOptions?.rgb ?? !0
|
|
1087
1110
|
},
|
|
1088
1111
|
startupCommands: e.startupCommands ?? [
|
|
1089
|
-
"set noswapfile signcolumn=no
|
|
1090
|
-
"set nowrap laststatus=0 cmdheight=1",
|
|
1112
|
+
"set noswapfile signcolumn=no nonumber norelativenumber",
|
|
1113
|
+
"set mouse=a nowrap laststatus=0 cmdheight=1",
|
|
1091
1114
|
"set shortmess+=F",
|
|
1092
1115
|
...e.clipboard === null ? [] : ["set clipboard=unnamedplus"]
|
|
1093
1116
|
],
|
|
@@ -1105,11 +1128,11 @@ class ce {
|
|
|
1105
1128
|
onPopupmenu: e.onPopupmenu,
|
|
1106
1129
|
cmdlineContainer: e.cmdlineContainer,
|
|
1107
1130
|
insertSyncDebounceMs: Number.isFinite(e.insertSyncDebounceMs) ? Math.max(0, Number(e.insertSyncDebounceMs)) : 20,
|
|
1108
|
-
debug:
|
|
1131
|
+
debug: o,
|
|
1109
1132
|
debugLog: e.debugLog,
|
|
1110
1133
|
shouldHandleKey: e.shouldHandleKey ?? (() => !0),
|
|
1111
|
-
translateKey: e.translateKey ??
|
|
1112
|
-
}, this.ctrlKeysNormal = this.opts.ctrlKeysForNormalMode ? new Set(this.opts.ctrlKeysForNormalMode.map((
|
|
1134
|
+
translateKey: e.translateKey ?? Ze
|
|
1135
|
+
}, this.ctrlKeysNormal = this.opts.ctrlKeysForNormalMode ? new Set(this.opts.ctrlKeysForNormalMode.map((c) => String(c).toLowerCase())) : null, this.ctrlKeysInsert = this.opts.ctrlKeysForInsertMode ? new Set(this.opts.ctrlKeysForInsertMode.map((c) => String(c).toLowerCase())) : null, this.altKeysNormal = this.opts.altKeysForNormalMode ? new Set(this.opts.altKeysForNormalMode.map((c) => String(c).toLowerCase())) : null, this.altKeysInsert = this.opts.altKeysForInsertMode ? new Set(this.opts.altKeysForInsertMode.map((c) => String(c).toLowerCase())) : null, this.metaKeysNormal = this.opts.metaKeysForNormalMode ? new Set(this.opts.metaKeysForNormalMode.map((c) => String(c).toLowerCase())) : null, this.metaKeysInsert = this.opts.metaKeysForInsertMode ? new Set(this.opts.metaKeysForInsertMode.map((c) => String(c).toLowerCase())) : null, this.opts.debug && (this.opts.status?.("[monaco-neovim-wasm] debug enabled"), this.debugLog("debug enabled"));
|
|
1113
1136
|
}
|
|
1114
1137
|
async start(t) {
|
|
1115
1138
|
this.stop(!0), this.nextSeedLines = t ?? null;
|
|
@@ -1121,8 +1144,8 @@ class ce {
|
|
|
1121
1144
|
this.notifyChain = this.notifyChain.then(() => this.handleNotify(s, n)).catch(() => {
|
|
1122
1145
|
});
|
|
1123
1146
|
},
|
|
1124
|
-
onRequest: (s, n,
|
|
1125
|
-
this.handleRequest(s, n,
|
|
1147
|
+
onRequest: (s, n, o) => {
|
|
1148
|
+
this.handleRequest(s, n, o);
|
|
1126
1149
|
},
|
|
1127
1150
|
onClipboardCopy: (s, n) => {
|
|
1128
1151
|
this.handleClipboardCopy(s);
|
|
@@ -1145,8 +1168,8 @@ class ce {
|
|
|
1145
1168
|
this.opts.status(`start failed: ${s ?? "unknown"}`, !0);
|
|
1146
1169
|
},
|
|
1147
1170
|
onExit: (s, n) => {
|
|
1148
|
-
const
|
|
1149
|
-
this.opts.status(`nvim exited (${s})${
|
|
1171
|
+
const o = n ? `: ${n.trim()}` : "";
|
|
1172
|
+
this.opts.status(`nvim exited (${s})${o}`, s !== 0);
|
|
1150
1173
|
try {
|
|
1151
1174
|
this.opts.onExit?.(s, n);
|
|
1152
1175
|
} catch {
|
|
@@ -1160,7 +1183,7 @@ class ce {
|
|
|
1160
1183
|
this.opts.status(s, !0);
|
|
1161
1184
|
}
|
|
1162
1185
|
};
|
|
1163
|
-
if (!this.session || !this.opts.reuseWorker ? this.session = new
|
|
1186
|
+
if (!this.session || !this.opts.reuseWorker ? this.session = new he({
|
|
1164
1187
|
worker: this.opts.worker,
|
|
1165
1188
|
workerUrl: this.opts.workerUrl,
|
|
1166
1189
|
inputMode: this.opts.inputMode,
|
|
@@ -1177,12 +1200,12 @@ class ce {
|
|
|
1177
1200
|
runtimePath: this.opts.runtimePath,
|
|
1178
1201
|
inputMode: this.opts.inputMode,
|
|
1179
1202
|
env: this.opts.env,
|
|
1180
|
-
files:
|
|
1203
|
+
files: Re(Xe(
|
|
1181
1204
|
this.opts.files,
|
|
1182
1205
|
this.opts.wrappedLineMotions || this.opts.scrollMotions || this.opts.hostCommands ? [
|
|
1183
|
-
{ path: "home/.config/nvim/monaco-neovim-wasm/motion.vim", data:
|
|
1184
|
-
{ path: "home/.config/nvim/monaco-neovim-wasm/scrolling.vim", data:
|
|
1185
|
-
{ path: "home/.config/nvim/monaco-neovim-wasm/host-commands.vim", data:
|
|
1206
|
+
{ path: "home/.config/nvim/monaco-neovim-wasm/motion.vim", data: ue },
|
|
1207
|
+
{ path: "home/.config/nvim/monaco-neovim-wasm/scrolling.vim", data: me },
|
|
1208
|
+
{ path: "home/.config/nvim/monaco-neovim-wasm/host-commands.vim", data: Ce }
|
|
1186
1209
|
] : []
|
|
1187
1210
|
))
|
|
1188
1211
|
}), this.opts.status("starting..."), this.primeSent = !1, setTimeout(() => {
|
|
@@ -1194,7 +1217,7 @@ class ce {
|
|
|
1194
1217
|
}
|
|
1195
1218
|
}
|
|
1196
1219
|
stop(t = !1) {
|
|
1197
|
-
this.session && (this.opts.reuseWorker ? this.session.stop({ terminate: !1, silent: !0 }) : (this.session.dispose(), this.session = null)), this.bufHandle = null, this.primeSent = !1, this.visualSelectionActive = !1, this.delegateInsertToMonaco = !1, this.recordingRegister = "", this.recordingRefreshArmed = !1, this.recordingRefreshTimer && (clearTimeout(this.recordingRefreshTimer), this.recordingRefreshTimer = null), this.exitingInsertMode = !1, this.pendingKeysAfterExit = "", this.exitInsertTimer && (clearTimeout(this.exitInsertTimer), this.exitInsertTimer = null), this.applyingFromNvim = !1, this.clearBufferStates(), this.cursorSyncTimer && (clearTimeout(this.cursorSyncTimer), this.cursorSyncTimer = null), this.nvimChannelId = null, this.hostAutocmdInstalled = !1, this.notifyChain = Promise.resolve(), this.visualSelectionRefreshTimer && (clearTimeout(this.visualSelectionRefreshTimer), this.visualSelectionRefreshTimer = null), this.cursorRefreshTimer && (clearTimeout(this.cursorRefreshTimer), this.cursorRefreshTimer = null), this.selectionSyncTimer && (clearTimeout(this.selectionSyncTimer), this.selectionSyncTimer = null), this.pendingSelection = null, this.cursorRefreshPending = !1, this.cursorRefreshInFlight = !1, this.setCmdline(null), this.setMessage(null), this.setPopupmenu(null, -1), this.resyncTimer && (clearTimeout(this.resyncTimer), this.resyncTimer = null), this.resizeTimer && (clearTimeout(this.resizeTimer), this.resizeTimer = null), t || this.opts.status("stopped", !0), this.disposeEditorListeners();
|
|
1220
|
+
this.session && (this.opts.reuseWorker ? this.session.stop({ terminate: !1, silent: !0 }) : (this.session.dispose(), this.session = null)), this.bufHandle = null, this.primeSent = !1, this.visualSelectionActive = !1, this.delegateInsertToMonaco = !1, this.nvimBlocking = !1, this.recordingRegister = "", this.recordingRefreshArmed = !1, this.recordingRefreshTimer && (clearTimeout(this.recordingRefreshTimer), this.recordingRefreshTimer = null), this.exitingInsertMode = !1, this.pendingKeysAfterExit = "", this.exitInsertTimer && (clearTimeout(this.exitInsertTimer), this.exitInsertTimer = null), this.applyingFromNvim = !1, this.clearBufferStates(), this.cursorSyncTimer && (clearTimeout(this.cursorSyncTimer), this.cursorSyncTimer = null), this.nvimChannelId = null, this.hostAutocmdInstalled = !1, this.notifyChain = Promise.resolve(), this.visualSelectionRefreshTimer && (clearTimeout(this.visualSelectionRefreshTimer), this.visualSelectionRefreshTimer = null), this.cursorRefreshTimer && (clearTimeout(this.cursorRefreshTimer), this.cursorRefreshTimer = null), this.selectionSyncTimer && (clearTimeout(this.selectionSyncTimer), this.selectionSyncTimer = null), this.pendingSelection = null, this.cursorRefreshPending = !1, this.cursorRefreshInFlight = !1, this.setCmdline(null), this.setMessage(null), this.setPopupmenu(null, -1), this.clearIgnoreNextInputEvent(), this.pendingRedrawEvents = [], this.stagingRedrawFrame = !1, this.stagedCmdlineText = void 0, this.stagedCmdlineCursorByte = void 0, this.stagedMessageText = void 0, this.stagedPopupItems = void 0, this.stagedPopupSelected = void 0, this.stagedSearchRefresh = !1, this.resyncTimer && (clearTimeout(this.resyncTimer), this.resyncTimer = null), this.resizeTimer && (clearTimeout(this.resizeTimer), this.resizeTimer = null), t || this.opts.status("stopped", !0), this.disposeEditorListeners();
|
|
1198
1221
|
}
|
|
1199
1222
|
dispose() {
|
|
1200
1223
|
this.session && (this.session.dispose(), this.session = null), this.stop(!0);
|
|
@@ -1212,7 +1235,7 @@ class ce {
|
|
|
1212
1235
|
this.sendNotify("nvim_input", [String(t ?? "")]);
|
|
1213
1236
|
}
|
|
1214
1237
|
type(t, e = !0) {
|
|
1215
|
-
const i =
|
|
1238
|
+
const i = _(String(t ?? ""), e);
|
|
1216
1239
|
i && this.sendNotify("nvim_input", [i]);
|
|
1217
1240
|
}
|
|
1218
1241
|
paste(t) {
|
|
@@ -1222,14 +1245,14 @@ class ce {
|
|
|
1222
1245
|
const i = String(t ?? ""), s = Array.isArray(e) ? e : [];
|
|
1223
1246
|
if (this.execLuaAvailable !== !1)
|
|
1224
1247
|
try {
|
|
1225
|
-
const
|
|
1226
|
-
return this.execLuaAvailable = !0,
|
|
1227
|
-
} catch (
|
|
1228
|
-
const
|
|
1229
|
-
if (
|
|
1248
|
+
const o = await this.rpcCall("nvim_exec_lua", [i, s]);
|
|
1249
|
+
return this.execLuaAvailable = !0, o;
|
|
1250
|
+
} catch (o) {
|
|
1251
|
+
const c = o?.message || String(o);
|
|
1252
|
+
if (c.includes("Invalid method") && c.includes("nvim_exec_lua"))
|
|
1230
1253
|
this.execLuaAvailable = !1;
|
|
1231
1254
|
else
|
|
1232
|
-
throw
|
|
1255
|
+
throw o;
|
|
1233
1256
|
}
|
|
1234
1257
|
const n = `(function(...)
|
|
1235
1258
|
${i}
|
|
@@ -1316,7 +1339,7 @@ end)(unpack(_A))`;
|
|
|
1316
1339
|
})
|
|
1317
1340
|
), this.disposables.push(
|
|
1318
1341
|
this.editor.onDidScrollChange(() => {
|
|
1319
|
-
this.opts.searchHighlights && (this.compositionActive || this.
|
|
1342
|
+
this.opts.searchHighlights && (this.compositionActive || this.requestSearchHighlightRefresh());
|
|
1320
1343
|
})
|
|
1321
1344
|
), this.disposables.push(
|
|
1322
1345
|
this.editor.onDidScrollChange(() => {
|
|
@@ -1344,10 +1367,10 @@ end)(unpack(_A))`;
|
|
|
1344
1367
|
const t = this.editor.getModel();
|
|
1345
1368
|
if (!t) return;
|
|
1346
1369
|
try {
|
|
1347
|
-
const i = t.uri, s = i?.scheme ?? "", n = i?.authority ?? "",
|
|
1370
|
+
const i = t.uri, s = i?.scheme ?? "", n = i?.authority ?? "", o = i?.path ?? "";
|
|
1348
1371
|
if (s === "nvim" && n === "buf") {
|
|
1349
|
-
const
|
|
1350
|
-
Number.isFinite(
|
|
1372
|
+
const c = /^\/(\d+)$/.exec(o), a = c ? Number(c[1]) : NaN;
|
|
1373
|
+
Number.isFinite(a) && a > 0 && (this.bufHandle = a);
|
|
1351
1374
|
}
|
|
1352
1375
|
} catch {
|
|
1353
1376
|
}
|
|
@@ -1363,8 +1386,8 @@ end)(unpack(_A))`;
|
|
|
1363
1386
|
}
|
|
1364
1387
|
computeGridSize() {
|
|
1365
1388
|
try {
|
|
1366
|
-
const t = this.editor.getLayoutInfo(), e = Math.max(0, Number(t?.contentWidth ?? t?.width ?? 0) || 0), i = Math.max(0, Number(t?.contentHeight ?? t?.height ?? 0) || 0), s = this.editor.getOption(y.editor.EditorOption.fontInfo), n = Math.max(1, Number(s?.typicalHalfwidthCharacterWidth ?? s?.maxDigitWidth ?? 0) || 0),
|
|
1367
|
-
if (Number.isFinite(
|
|
1389
|
+
const t = this.editor.getLayoutInfo(), e = Math.max(0, Number(t?.contentWidth ?? t?.width ?? 0) || 0), i = Math.max(0, Number(t?.contentHeight ?? t?.height ?? 0) || 0), s = this.editor.getOption(y.editor.EditorOption.fontInfo), n = Math.max(1, Number(s?.typicalHalfwidthCharacterWidth ?? s?.maxDigitWidth ?? 0) || 0), o = Math.max(1, Number(s?.lineHeight ?? 0) || 0), c = Math.max(this.opts.minCols, Math.floor(e / n)), a = Math.max(this.opts.minRows, Math.floor(i / o));
|
|
1390
|
+
if (Number.isFinite(c) && Number.isFinite(a) && c > 0 && a > 0) return { cols: c, rows: a };
|
|
1368
1391
|
} catch {
|
|
1369
1392
|
}
|
|
1370
1393
|
return { cols: this.opts.cols, rows: this.opts.rows };
|
|
@@ -1406,11 +1429,11 @@ end)(unpack(_A))`;
|
|
|
1406
1429
|
if (!t || this.cmdlineVisible) return;
|
|
1407
1430
|
const e = this.editor.getModel();
|
|
1408
1431
|
if (!e) return;
|
|
1409
|
-
const i = this.editor.getSelection(), n = (i && !i.isEmpty() ? i.getStartPosition() : null) ?? this.editor.getPosition() ?? this.lastCursorPos ?? new y.Position(1, 1),
|
|
1410
|
-
let
|
|
1411
|
-
|
|
1412
|
-
const
|
|
1413
|
-
this.optimisticCursorPrevPos =
|
|
1432
|
+
const i = this.editor.getSelection(), n = (i && !i.isEmpty() ? i.getStartPosition() : null) ?? this.editor.getPosition() ?? this.lastCursorPos ?? new y.Position(1, 1), o = String(t).split(/\r?\n/);
|
|
1433
|
+
let c = n.lineNumber, a = n.column;
|
|
1434
|
+
o.length <= 1 ? a += Array.from(o[0] ?? "").length : (c += o.length - 1, a = 1 + Array.from(o[o.length - 1] ?? "").length);
|
|
1435
|
+
const g = e.validatePosition(new y.Position(c, a)), I = this.editor.getPosition() ?? this.lastCursorPos ?? n;
|
|
1436
|
+
this.optimisticCursorPrevPos = I, this.optimisticCursorPos = g, this.optimisticCursorUntil = (typeof performance < "u" && performance.now ? performance.now() : Date.now()) + 120, this.lastCursorPos = g, !this.compositionActive && (this.suppressCursorSync = !0, this.editor.setPosition(g), this.suppressCursorSync = !1);
|
|
1414
1437
|
}
|
|
1415
1438
|
positionPreedit() {
|
|
1416
1439
|
if (!this.preeditEl || !this.preeditVisible) return;
|
|
@@ -1537,14 +1560,14 @@ end)(unpack(_A))`;
|
|
|
1537
1560
|
await this.rpcCall("nvim_ui_attach", [this.uiCols || this.opts.cols, this.uiRows || this.opts.rows, this.opts.uiAttachOptions]);
|
|
1538
1561
|
} catch {
|
|
1539
1562
|
}
|
|
1540
|
-
for (const
|
|
1541
|
-
|
|
1563
|
+
for (const o of this.opts.startupCommands)
|
|
1564
|
+
o && this.sendNotify("nvim_command", [o]);
|
|
1542
1565
|
if (this.opts.startupLua)
|
|
1543
1566
|
try {
|
|
1544
1567
|
await this.execLua(this.opts.startupLua, []);
|
|
1545
1568
|
} catch {
|
|
1546
1569
|
}
|
|
1547
|
-
const t = await this.rpcCall("nvim_get_current_buf", []), e =
|
|
1570
|
+
const t = await this.rpcCall("nvim_get_current_buf", []), e = F(t) ?? 1;
|
|
1548
1571
|
if (this.bufHandle = e, await this.rpcCall("nvim_buf_attach", [e, !0, {}]) !== !0) throw new Error("nvim_buf_attach failed");
|
|
1549
1572
|
this.ensureActiveState(), this.opts.syncTabstop && this.syncTabstopFromMonaco();
|
|
1550
1573
|
const s = await this.rpcCall("nvim_buf_get_lines", [e, 0, -1, !1]);
|
|
@@ -1552,13 +1575,13 @@ end)(unpack(_A))`;
|
|
|
1552
1575
|
const n = await this.seedBuffer(e, this.nextSeedLines);
|
|
1553
1576
|
this.nextSeedLines = null, n && n.length && this.applyBuffer(n);
|
|
1554
1577
|
try {
|
|
1555
|
-
const
|
|
1556
|
-
if (
|
|
1557
|
-
const
|
|
1558
|
-
|
|
1578
|
+
const o = this.ensureActiveState();
|
|
1579
|
+
if (o) {
|
|
1580
|
+
const c = await this.rpcCall("nvim_buf_get_name", [e]);
|
|
1581
|
+
o.name = typeof c == "string" ? c : "", o.name && this.buffersByName.set(o.name, e);
|
|
1559
1582
|
try {
|
|
1560
|
-
const
|
|
1561
|
-
|
|
1583
|
+
const a = await this.rpcCall("nvim_buf_get_option", [e, "filetype"]);
|
|
1584
|
+
o.filetype = typeof a == "string" ? a : "";
|
|
1562
1585
|
} catch {
|
|
1563
1586
|
}
|
|
1564
1587
|
}
|
|
@@ -1572,23 +1595,25 @@ end)(unpack(_A))`;
|
|
|
1572
1595
|
}
|
|
1573
1596
|
handleClipboardCopy(t) {
|
|
1574
1597
|
const e = (t ?? []).join(`
|
|
1575
|
-
`)
|
|
1598
|
+
`);
|
|
1599
|
+
this.lastClipboardText = e;
|
|
1600
|
+
const i = this.opts.clipboard;
|
|
1576
1601
|
if (i !== null) {
|
|
1577
1602
|
if (i?.writeText) {
|
|
1578
1603
|
i.writeText(e).catch(() => {
|
|
1579
1604
|
navigator.clipboard?.writeText ? navigator.clipboard.writeText(e).catch(() => {
|
|
1580
|
-
|
|
1581
|
-
}) :
|
|
1605
|
+
J(e);
|
|
1606
|
+
}) : J(e);
|
|
1582
1607
|
});
|
|
1583
1608
|
return;
|
|
1584
1609
|
}
|
|
1585
1610
|
if (navigator.clipboard?.writeText) {
|
|
1586
1611
|
navigator.clipboard.writeText(e).catch(() => {
|
|
1587
|
-
|
|
1612
|
+
J(e);
|
|
1588
1613
|
});
|
|
1589
1614
|
return;
|
|
1590
1615
|
}
|
|
1591
|
-
|
|
1616
|
+
J(e);
|
|
1592
1617
|
}
|
|
1593
1618
|
}
|
|
1594
1619
|
handleRequest(t, e, i) {
|
|
@@ -1638,26 +1663,33 @@ end)(unpack(_A))`;
|
|
|
1638
1663
|
if (t === "monaco_cursor") {
|
|
1639
1664
|
const [i, s] = e;
|
|
1640
1665
|
try {
|
|
1641
|
-
const
|
|
1642
|
-
if (
|
|
1666
|
+
const o = this.ignoreInsertExitCursor, c = this.nowMs();
|
|
1667
|
+
if (o && c < o.untilMs && !this.delegateInsertToMonaco && Number(i) === o.line && Number(s) === o.col0 && o.col0 > 0) {
|
|
1643
1668
|
this.debugLog(`nvim->monaco cursor: ignore stale post-exit insert cursor ln=${Number(i)} col0=${Number(s)}`);
|
|
1644
1669
|
return;
|
|
1645
1670
|
}
|
|
1646
|
-
|
|
1671
|
+
o && c >= o.untilMs && (this.ignoreInsertExitCursor = null);
|
|
1647
1672
|
} catch {
|
|
1648
1673
|
}
|
|
1649
|
-
const n =
|
|
1674
|
+
const n = P(this.editor, Number(i), Number(s));
|
|
1650
1675
|
if (this.debugLog(`nvim->monaco cursor: ln=${Number(i)} col0=${Number(s)} -> line=${n.line} col=${n.col} delegateInsert=${this.delegateInsertToMonaco} exitingInsert=${this.exitingInsertMode} mode=${JSON.stringify(this.lastMode)}`), this.delegateInsertToMonaco && !this.exitingInsertMode) {
|
|
1651
|
-
const
|
|
1652
|
-
this.lastCursorPos =
|
|
1676
|
+
const o = this.editor.getModel(), c = o ? o.validatePosition(new y.Position(n.line, n.col)) : new y.Position(n.line, n.col);
|
|
1677
|
+
this.lastCursorPos = c;
|
|
1653
1678
|
return;
|
|
1654
1679
|
}
|
|
1655
|
-
this.updateCursor(n.line, n.col),
|
|
1680
|
+
this.updateCursor(n.line, n.col), H(this.lastMode) && this.scheduleVisualSelectionRefresh();
|
|
1656
1681
|
return;
|
|
1657
1682
|
}
|
|
1658
1683
|
if (t === "monaco_mode") {
|
|
1659
|
-
|
|
1660
|
-
|
|
1684
|
+
let i = "", s;
|
|
1685
|
+
const n = e?.[0], o = e?.[1];
|
|
1686
|
+
if (typeof n == "string")
|
|
1687
|
+
i = String(n);
|
|
1688
|
+
else if (n && typeof n == "object") {
|
|
1689
|
+
const c = n;
|
|
1690
|
+
typeof c.mode == "string" && (i = String(c.mode)), typeof c.blocking == "boolean" && (s = !!c.blocking);
|
|
1691
|
+
}
|
|
1692
|
+
typeof o == "boolean" && (s = !!o), this.hostAutocmdInstalled || (this.hostAutocmdInstalled = !0), this.debugLog(`nvim->monaco mode: ${JSON.stringify(this.lastMode)} -> ${JSON.stringify(i)} blocking=${s}`), this.applyNvimMode(i, s);
|
|
1661
1693
|
return;
|
|
1662
1694
|
}
|
|
1663
1695
|
if (t === "monaco_recording") {
|
|
@@ -1666,49 +1698,49 @@ end)(unpack(_A))`;
|
|
|
1666
1698
|
return;
|
|
1667
1699
|
}
|
|
1668
1700
|
if (t === "nvim_buf_lines_event") {
|
|
1669
|
-
const [i, s, n,
|
|
1670
|
-
if (!
|
|
1671
|
-
const
|
|
1672
|
-
if (!
|
|
1701
|
+
const [i, s, n, o, c] = e, a = F(i);
|
|
1702
|
+
if (!a) return;
|
|
1703
|
+
const g = this.bufHandle != null && a === this.bufHandle ? this.ensureActiveState() : this.buffers.get(a) ?? null;
|
|
1704
|
+
if (!g || this.bufHandle != null && a === this.bufHandle && this.delegateInsertToMonaco && !this.exitingInsertMode && this.nowMs() < this.ignoreActiveBufLinesEventsUntil)
|
|
1673
1705
|
return;
|
|
1674
|
-
if (this.bufHandle != null &&
|
|
1706
|
+
if (this.bufHandle != null && a === this.bufHandle && this.compositionActive) {
|
|
1675
1707
|
this.pendingResyncAfterComposition = !0;
|
|
1676
1708
|
return;
|
|
1677
1709
|
}
|
|
1678
|
-
const
|
|
1679
|
-
if (
|
|
1710
|
+
const I = g.model, h = Number(n), u = Number(o), m = Array.isArray(c) ? c.map((f) => String(f ?? "")) : null;
|
|
1711
|
+
if (I && Number.isInteger(h) && Number.isInteger(u) && h >= 0 && u >= h && m)
|
|
1680
1712
|
try {
|
|
1681
|
-
const
|
|
1682
|
-
if (
|
|
1683
|
-
const
|
|
1684
|
-
let
|
|
1713
|
+
const f = this.bufHandle != null && a === this.bufHandle && this.editor.getModel() === I;
|
|
1714
|
+
if (f && this.delegateInsertToMonaco) {
|
|
1715
|
+
const G = this.computeLinePatch(I, h, u, m);
|
|
1716
|
+
let A = !1;
|
|
1685
1717
|
try {
|
|
1686
|
-
|
|
1718
|
+
A = I.getValueInRange(G.range) === G.text;
|
|
1687
1719
|
} catch {
|
|
1688
1720
|
}
|
|
1689
|
-
if (!
|
|
1690
|
-
if (
|
|
1721
|
+
if (!A) {
|
|
1722
|
+
if (g.pendingFullSync || g.pendingBufEdits.length) {
|
|
1691
1723
|
this.scheduleResync();
|
|
1692
1724
|
return;
|
|
1693
1725
|
}
|
|
1694
|
-
this.applyLinePatchToModel(
|
|
1726
|
+
this.applyLinePatchToModel(I, h, u, m);
|
|
1695
1727
|
try {
|
|
1696
|
-
|
|
1728
|
+
g.shadowLines = I.getLinesContent();
|
|
1697
1729
|
} catch {
|
|
1698
1730
|
}
|
|
1699
1731
|
}
|
|
1700
|
-
} else
|
|
1732
|
+
} else f ? this.applyLinePatch(I, h, u, m) : this.applyLinePatchToModel(I, h, u, m);
|
|
1701
1733
|
} catch {
|
|
1702
1734
|
}
|
|
1703
1735
|
else
|
|
1704
1736
|
try {
|
|
1705
|
-
const
|
|
1706
|
-
this.bufHandle != null &&
|
|
1737
|
+
const f = await this.rpcCall("nvim_buf_get_lines", [a, 0, -1, !1]), G = Array.isArray(f) ? f : [""];
|
|
1738
|
+
this.bufHandle != null && a === this.bufHandle && this.editor.getModel() === I ? this.applyBuffer(G) : this.setModelText(I, G);
|
|
1707
1739
|
} catch {
|
|
1708
1740
|
}
|
|
1709
|
-
this.bufHandle != null &&
|
|
1741
|
+
this.bufHandle != null && a === this.bufHandle && H(this.lastMode) && this.scheduleVisualSelectionRefresh();
|
|
1710
1742
|
} else if (t === "nvim_buf_detach_event") {
|
|
1711
|
-
const i =
|
|
1743
|
+
const i = F(e?.[0]);
|
|
1712
1744
|
if (i && this.buffers.has(i)) {
|
|
1713
1745
|
const s = this.buffers.get(i);
|
|
1714
1746
|
if (s.name && this.buffersByName.delete(s.name), s.createdModel)
|
|
@@ -1719,27 +1751,144 @@ end)(unpack(_A))`;
|
|
|
1719
1751
|
this.buffers.delete(i);
|
|
1720
1752
|
}
|
|
1721
1753
|
i && this.bufHandle === i && (this.bufHandle = null);
|
|
1722
|
-
} else t === "redraw" && this.
|
|
1754
|
+
} else t === "redraw" && this.handleRedrawNotify(e);
|
|
1755
|
+
}
|
|
1756
|
+
handleRedrawNotify(t) {
|
|
1757
|
+
if (!Array.isArray(t)) return;
|
|
1758
|
+
for (const n of t)
|
|
1759
|
+
Array.isArray(n) && this.pendingRedrawEvents.push(n);
|
|
1760
|
+
if (!this.pendingRedrawEvents.length) return;
|
|
1761
|
+
let e = -1;
|
|
1762
|
+
for (let n = 0; n < this.pendingRedrawEvents.length; n += 1) {
|
|
1763
|
+
const o = this.pendingRedrawEvents[n];
|
|
1764
|
+
(Array.isArray(o) ? o[0] : null) === "flush" && (e = n);
|
|
1765
|
+
}
|
|
1766
|
+
if (e < 0) return;
|
|
1767
|
+
const i = this.pendingRedrawEvents.slice(0, e + 1);
|
|
1768
|
+
this.pendingRedrawEvents = this.pendingRedrawEvents.slice(e + 1);
|
|
1769
|
+
let s = 0;
|
|
1770
|
+
for (let n = 0; n < i.length; n += 1) {
|
|
1771
|
+
const o = i[n];
|
|
1772
|
+
if ((Array.isArray(o) ? o[0] : null) === "flush") {
|
|
1773
|
+
const a = i.slice(s, n + 1);
|
|
1774
|
+
s = n + 1, this.processRedrawFrame(a);
|
|
1775
|
+
}
|
|
1776
|
+
}
|
|
1777
|
+
s < i.length && this.pendingRedrawEvents.unshift(...i.slice(s));
|
|
1778
|
+
}
|
|
1779
|
+
beginRedrawFrame() {
|
|
1780
|
+
this.stagingRedrawFrame = !0, this.stagedCmdlineText = void 0, this.stagedCmdlineCursorByte = void 0, this.stagedMessageText = void 0, this.stagedPopupItems = void 0, this.stagedPopupSelected = void 0, this.stagedSearchRefresh = !1;
|
|
1781
|
+
}
|
|
1782
|
+
endRedrawFrame() {
|
|
1783
|
+
if (this.stagingRedrawFrame = !1, this.stagedCmdlineText !== void 0 && this.setCmdline(this.stagedCmdlineText), this.stagedCmdlineCursorByte !== void 0 && this.setCmdlineCursor(this.stagedCmdlineCursorByte), this.stagedMessageText !== void 0 && this.setMessage(this.stagedMessageText), this.stagedPopupItems !== void 0)
|
|
1784
|
+
this.setPopupmenu(this.stagedPopupItems, Number.isFinite(Number(this.stagedPopupSelected)) ? Number(this.stagedPopupSelected) : -1);
|
|
1785
|
+
else if (this.stagedPopupSelected !== void 0) {
|
|
1786
|
+
const t = Number(this.stagedPopupSelected);
|
|
1787
|
+
this.updatePopupmenuSelection(Number.isFinite(t) ? t : -1);
|
|
1788
|
+
}
|
|
1789
|
+
this.stagedSearchRefresh && this.scheduleSearchHighlightRefresh();
|
|
1790
|
+
}
|
|
1791
|
+
processRedrawFrame(t) {
|
|
1792
|
+
this.beginRedrawFrame();
|
|
1793
|
+
try {
|
|
1794
|
+
for (const e of t) {
|
|
1795
|
+
if (!Array.isArray(e) || e.length === 0) continue;
|
|
1796
|
+
const i = e[0];
|
|
1797
|
+
if (i === "flush") break;
|
|
1798
|
+
if (typeof i != "string") continue;
|
|
1799
|
+
const s = e.slice(1), n = s.length === 1 && Array.isArray(s[0]) ? s[0] : s;
|
|
1800
|
+
this.stageRedrawEvent(i, n);
|
|
1801
|
+
}
|
|
1802
|
+
} finally {
|
|
1803
|
+
this.endRedrawFrame();
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
stageRedrawEvent(t, e) {
|
|
1807
|
+
if (t === "cmdline_hide") {
|
|
1808
|
+
this.stagedCmdlineText = null, this.stagedCmdlineCursorByte = null, this.stagedSearchRefresh = !0;
|
|
1809
|
+
return;
|
|
1810
|
+
}
|
|
1811
|
+
if (t === "cmdline_show") {
|
|
1812
|
+
const i = e[0], s = Math.max(0, Number(e[1] ?? 0) || 0), n = typeof e[2] == "string" ? e[2] : "", o = typeof e[3] == "string" ? e[3] : "", c = Math.max(0, Number(e[4] ?? 0) || 0), a = o || n || "", g = " ".repeat(c), I = z(i), h = `${g}${a}${I}`, u = E(`${g}${a}`), m = E(I);
|
|
1813
|
+
this.cmdlineCursorOffsetBytes = u, this.cmdlineCursorContentBytes = m;
|
|
1814
|
+
const b = s <= m ? this.cmdlineCursorOffsetBytes + s : s;
|
|
1815
|
+
this.stagedCmdlineText = h, this.stagedCmdlineCursorByte = b, this.stagedSearchRefresh = !0;
|
|
1816
|
+
return;
|
|
1817
|
+
}
|
|
1818
|
+
if (t === "cmdline_pos") {
|
|
1819
|
+
const i = Math.max(0, Number(e[0] ?? 0) || 0), s = this.cmdlineCursorOffsetBytes > 0 && i <= this.cmdlineCursorContentBytes ? this.cmdlineCursorOffsetBytes + i : i;
|
|
1820
|
+
this.stagedCmdlineCursorByte = s, this.stagedSearchRefresh = !0;
|
|
1821
|
+
return;
|
|
1822
|
+
}
|
|
1823
|
+
if (t === "msg_clear") {
|
|
1824
|
+
this.stagedMessageText = null;
|
|
1825
|
+
return;
|
|
1826
|
+
}
|
|
1827
|
+
if (t === "msg_show") {
|
|
1828
|
+
const i = typeof e[0] == "string" ? e[0] : "";
|
|
1829
|
+
if (i === "return_prompt") return;
|
|
1830
|
+
const s = e[1], n = !!e[2], o = !!e[4], c = z(s);
|
|
1831
|
+
if (i === "empty" && !c) {
|
|
1832
|
+
this.stagedMessageText = null;
|
|
1833
|
+
return;
|
|
1834
|
+
}
|
|
1835
|
+
if (!c) return;
|
|
1836
|
+
const a = this.stagedMessageText !== void 0 ? this.stagedMessageText ?? "" : this.messageEl?.textContent ?? "";
|
|
1837
|
+
if (o && a) {
|
|
1838
|
+
this.stagedMessageText = `${a}${c}`;
|
|
1839
|
+
return;
|
|
1840
|
+
}
|
|
1841
|
+
if (n) {
|
|
1842
|
+
this.stagedMessageText = c;
|
|
1843
|
+
return;
|
|
1844
|
+
}
|
|
1845
|
+
this.stagedMessageText = c;
|
|
1846
|
+
return;
|
|
1847
|
+
}
|
|
1848
|
+
if (t === "msg_showmode" || t === "msg_showcmd" || t === "msg_ruler") {
|
|
1849
|
+
const i = e[0], s = z(i);
|
|
1850
|
+
this.stagedMessageText = s || null;
|
|
1851
|
+
return;
|
|
1852
|
+
}
|
|
1853
|
+
if (t === "popupmenu_hide") {
|
|
1854
|
+
this.stagedPopupItems = null, this.stagedPopupSelected = -1;
|
|
1855
|
+
return;
|
|
1856
|
+
}
|
|
1857
|
+
if (t === "popupmenu_show") {
|
|
1858
|
+
const i = e[0], s = Number(e[1] ?? -1), n = We(i);
|
|
1859
|
+
this.stagedPopupItems = n, this.stagedPopupSelected = Number.isFinite(s) ? s : -1;
|
|
1860
|
+
return;
|
|
1861
|
+
}
|
|
1862
|
+
if (t === "popupmenu_select") {
|
|
1863
|
+
const i = Number(e[0] ?? -1);
|
|
1864
|
+
this.stagedPopupSelected = Number.isFinite(i) ? i : -1;
|
|
1865
|
+
return;
|
|
1866
|
+
}
|
|
1867
|
+
if (t === "mode_change") {
|
|
1868
|
+
const i = typeof e[0] == "string" ? e[0] : "";
|
|
1869
|
+
this.hostAutocmdInstalled || this.applyNvimMode(i);
|
|
1870
|
+
return;
|
|
1871
|
+
}
|
|
1723
1872
|
}
|
|
1724
1873
|
computeLinePatch(t, e, i, s) {
|
|
1725
|
-
const n = t.getLineCount(),
|
|
1726
|
-
let
|
|
1874
|
+
const n = t.getLineCount(), o = Math.min(e, n), c = Math.min(i, n), a = new y.Position(n, t.getLineMaxColumn(n)), I = c >= n && s.length === 0 && o > 0 ? new y.Position(o, t.getLineMaxColumn(o)) : o < n ? new y.Position(o + 1, 1) : a, h = c < n ? new y.Position(c + 1, 1) : a;
|
|
1875
|
+
let u = s.join(`
|
|
1727
1876
|
`);
|
|
1728
|
-
return e >= n && i >= n && s.length > 0 && (
|
|
1729
|
-
${
|
|
1730
|
-
`), { range: new y.Range(
|
|
1877
|
+
return e >= n && i >= n && s.length > 0 && (u = `
|
|
1878
|
+
${u}`), i < n && s.length > 0 && (u += `
|
|
1879
|
+
`), { range: new y.Range(I.lineNumber, I.column, h.lineNumber, h.column), text: u };
|
|
1731
1880
|
}
|
|
1732
1881
|
applyLinePatch(t, e, i, s) {
|
|
1733
|
-
const n = this.lastCursorPos ?? this.editor.getPosition() ?? new y.Position(1, 1),
|
|
1882
|
+
const n = this.lastCursorPos ?? this.editor.getPosition() ?? new y.Position(1, 1), o = this.computeLinePatch(t, e, i, s);
|
|
1734
1883
|
try {
|
|
1735
|
-
if (t.getValueInRange(
|
|
1884
|
+
if (t.getValueInRange(o.range) === o.text) return;
|
|
1736
1885
|
} catch {
|
|
1737
1886
|
}
|
|
1738
|
-
if (this.suppressCursorSync = !0, this.applyingFromNvim = !0, t.applyEdits([{ range:
|
|
1739
|
-
const
|
|
1740
|
-
if (
|
|
1887
|
+
if (this.suppressCursorSync = !0, this.applyingFromNvim = !0, t.applyEdits([{ range: o.range, text: o.text }]), this.applyingFromNvim = !1, n && this.editor.setPosition(n), this.suppressCursorSync = !1, this.delegateInsertToMonaco) {
|
|
1888
|
+
const c = this.getActiveState();
|
|
1889
|
+
if (c && c.model === t)
|
|
1741
1890
|
try {
|
|
1742
|
-
|
|
1891
|
+
c.shadowLines = t.getLinesContent();
|
|
1743
1892
|
} catch {
|
|
1744
1893
|
}
|
|
1745
1894
|
}
|
|
@@ -1813,7 +1962,7 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
1813
1962
|
this.cmdlineEl.textContent = this.cmdlineTextRaw, this.cmdlineCursorByte = null;
|
|
1814
1963
|
return;
|
|
1815
1964
|
}
|
|
1816
|
-
const e = this.cmdlineTextRaw, i = Math.max(0, Math.min(Number(t) || 0,
|
|
1965
|
+
const e = this.cmdlineTextRaw, i = Math.max(0, Math.min(Number(t) || 0, E(e))), s = Math.max(0, Math.min(e.length, K(e, i)));
|
|
1817
1966
|
this.cmdlineCursorByte = i, this.cmdlineEl.textContent = `${e.slice(0, s)}▏${e.slice(s)}`;
|
|
1818
1967
|
}
|
|
1819
1968
|
setMessage(t) {
|
|
@@ -1847,10 +1996,10 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
1847
1996
|
for (let i = 0; i < t.length; i += 1) {
|
|
1848
1997
|
const s = t[i], n = document.createElement("div");
|
|
1849
1998
|
n.style.padding = "2px 10px", n.style.display = "flex", n.style.gap = "10px", n.style.justifyContent = "space-between", n.style.background = i === e ? "rgba(255,255,255,0.12)" : "transparent";
|
|
1850
|
-
const
|
|
1851
|
-
|
|
1852
|
-
const
|
|
1853
|
-
|
|
1999
|
+
const o = document.createElement("span");
|
|
2000
|
+
o.textContent = s.word ?? "";
|
|
2001
|
+
const c = document.createElement("span");
|
|
2002
|
+
c.style.opacity = "0.7", c.textContent = s.menu ?? s.kind ?? "", n.appendChild(o), n.appendChild(c), this.popupEl.appendChild(n);
|
|
1854
2003
|
}
|
|
1855
2004
|
this.popupEl.style.display = "block";
|
|
1856
2005
|
}
|
|
@@ -1878,10 +2027,10 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
1878
2027
|
} catch {
|
|
1879
2028
|
}
|
|
1880
2029
|
if (i === "wrappedLine" && (e === "down" || e === "up")) {
|
|
1881
|
-
const
|
|
1882
|
-
for (let
|
|
2030
|
+
const c = e === "down" ? "cursorDown" : "cursorUp";
|
|
2031
|
+
for (let a = 0; a < s; a += 1)
|
|
1883
2032
|
try {
|
|
1884
|
-
this.editor.trigger("monaco-neovim-wasm",
|
|
2033
|
+
this.editor.trigger("monaco-neovim-wasm", c, null);
|
|
1885
2034
|
} catch {
|
|
1886
2035
|
}
|
|
1887
2036
|
return !0;
|
|
@@ -1889,8 +2038,8 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
1889
2038
|
return !1;
|
|
1890
2039
|
};
|
|
1891
2040
|
this.suppressCursorSync = !0, n();
|
|
1892
|
-
const
|
|
1893
|
-
|
|
2041
|
+
const o = this.editor.getPosition();
|
|
2042
|
+
o && (this.lastCursorPos = o, this.applyScrolloff(o)), this.suppressCursorSync = !1, this.requestSearchHighlightRefresh();
|
|
1894
2043
|
}
|
|
1895
2044
|
getScrolloffLines() {
|
|
1896
2045
|
return this.opts.scrolloff != null ? Math.max(0, Math.floor(this.opts.scrolloff)) : this.opts.syncScrolloff ? Math.max(0, Math.floor(this.nvimScrolloff)) : 0;
|
|
@@ -1903,87 +2052,87 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
1903
2052
|
if (!i) return !1;
|
|
1904
2053
|
const s = Math.max(1, Number(this.editor.getOption(y.editor.EditorOption.lineHeight)) || 0), n = e * s;
|
|
1905
2054
|
if (n <= 0) return !1;
|
|
1906
|
-
let
|
|
2055
|
+
let o = 0;
|
|
1907
2056
|
try {
|
|
1908
|
-
const
|
|
1909
|
-
|
|
2057
|
+
const b = this.editor.getLayoutInfo();
|
|
2058
|
+
o = Math.max(0, Number(b?.contentHeight ?? b?.height ?? 0) || 0);
|
|
1910
2059
|
} catch {
|
|
1911
2060
|
}
|
|
1912
|
-
if (
|
|
1913
|
-
const
|
|
2061
|
+
if (o <= 0) return !1;
|
|
2062
|
+
const c = () => {
|
|
1914
2063
|
try {
|
|
1915
2064
|
this.editor.revealPositionInCenterIfOutsideViewport(i);
|
|
1916
2065
|
} catch {
|
|
1917
2066
|
}
|
|
1918
2067
|
};
|
|
1919
|
-
let
|
|
2068
|
+
let a = null;
|
|
1920
2069
|
try {
|
|
1921
|
-
|
|
2070
|
+
a = this.editor.getScrolledVisiblePosition(i);
|
|
1922
2071
|
} catch {
|
|
1923
2072
|
}
|
|
1924
|
-
if (!
|
|
1925
|
-
|
|
2073
|
+
if (!a) {
|
|
2074
|
+
c();
|
|
1926
2075
|
try {
|
|
1927
|
-
|
|
2076
|
+
a = this.editor.getScrolledVisiblePosition(i);
|
|
1928
2077
|
} catch {
|
|
1929
2078
|
}
|
|
1930
2079
|
}
|
|
1931
|
-
if (!
|
|
1932
|
-
const
|
|
2080
|
+
if (!a || !Number.isFinite(a.top) || !Number.isFinite(a.height)) return !1;
|
|
2081
|
+
const g = this.editor.getScrollTop(), I = a.top, h = a.top + a.height, u = Math.max(0, o - n);
|
|
1933
2082
|
let m = 0;
|
|
1934
|
-
if (
|
|
2083
|
+
if (I < n ? m = I - n : h > u && (m = h - u), !m) return !1;
|
|
1935
2084
|
try {
|
|
1936
|
-
this.editor.setScrollTop(Math.max(0,
|
|
2085
|
+
this.editor.setScrollTop(Math.max(0, g + m));
|
|
1937
2086
|
} catch {
|
|
1938
2087
|
}
|
|
1939
2088
|
return !0;
|
|
1940
2089
|
}
|
|
1941
2090
|
applyMonacoScroll(t) {
|
|
1942
|
-
const e = typeof t.by == "string" ? t.by : "", i = typeof t.direction == "string" ? t.direction : "", s = Math.max(1, Number(t.value ?? 1) || 1), n = !!t.moveCursor,
|
|
1943
|
-
let
|
|
1944
|
-
if (e === "page")
|
|
1945
|
-
else if (e === "halfPage")
|
|
1946
|
-
else if (e === "line")
|
|
2091
|
+
const e = typeof t.by == "string" ? t.by : "", i = typeof t.direction == "string" ? t.direction : "", s = Math.max(1, Number(t.value ?? 1) || 1), n = !!t.moveCursor, o = typeof t.cursorBy == "string" ? t.cursorBy : "wrappedLine", c = Math.max(3, this.uiRows || this.opts.rows), a = this.editor.getOption(y.editor.EditorOption.fontInfo), g = Math.max(1, Number(a?.lineHeight ?? 0) || 0), I = Math.max(1, c - 2), h = Math.max(1, Math.floor(I / 2));
|
|
2092
|
+
let u = s;
|
|
2093
|
+
if (e === "page") u = I * s;
|
|
2094
|
+
else if (e === "halfPage") u = h * s;
|
|
2095
|
+
else if (e === "line") u = s;
|
|
1947
2096
|
else return !1;
|
|
1948
2097
|
const m = i === "up" ? -1 : i === "down" ? 1 : 0;
|
|
1949
2098
|
if (!m) return !1;
|
|
1950
2099
|
this.suppressCursorSync = !0;
|
|
1951
2100
|
try {
|
|
1952
|
-
const
|
|
1953
|
-
this.editor.setScrollTop(
|
|
2101
|
+
const f = this.editor.getScrollTop(), G = Math.max(0, f + m * u * g);
|
|
2102
|
+
this.editor.setScrollTop(G);
|
|
1954
2103
|
} catch {
|
|
1955
2104
|
}
|
|
1956
|
-
let
|
|
2105
|
+
let b = !1;
|
|
1957
2106
|
if (n)
|
|
1958
2107
|
try {
|
|
1959
2108
|
this.applyMonacoCursorMove({
|
|
1960
2109
|
to: m > 0 ? "down" : "up",
|
|
1961
|
-
by:
|
|
1962
|
-
value:
|
|
1963
|
-
}),
|
|
2110
|
+
by: o,
|
|
2111
|
+
value: u
|
|
2112
|
+
}), b = !0;
|
|
1964
2113
|
} catch {
|
|
1965
2114
|
}
|
|
1966
|
-
return this.suppressCursorSync = !1,
|
|
2115
|
+
return this.suppressCursorSync = !1, b;
|
|
1967
2116
|
}
|
|
1968
2117
|
applyMonacoReveal(t) {
|
|
1969
2118
|
const e = typeof t.direction == "string" ? t.direction : "", i = !!t.resetCursor, s = this.editor.getPosition();
|
|
1970
2119
|
if (!s) return !1;
|
|
1971
|
-
const n = s.lineNumber,
|
|
2120
|
+
const n = s.lineNumber, o = Math.max(1, this.uiRows || this.opts.rows), c = this.editor.getOption(y.editor.EditorOption.fontInfo), a = Math.max(1, Number(c?.lineHeight ?? 0) || 0);
|
|
1972
2121
|
this.suppressCursorSync = !0;
|
|
1973
2122
|
try {
|
|
1974
2123
|
if (e === "top") {
|
|
1975
|
-
const
|
|
1976
|
-
this.editor.setScrollTop(
|
|
2124
|
+
const g = this.editor.getTopForLineNumber(n);
|
|
2125
|
+
this.editor.setScrollTop(g);
|
|
1977
2126
|
} else if (e === "center")
|
|
1978
2127
|
this.editor.revealLineInCenter(n);
|
|
1979
2128
|
else if (e === "bottom") {
|
|
1980
|
-
const
|
|
1981
|
-
this.editor.setScrollTop(
|
|
2129
|
+
const g = this.editor.getTopForLineNumber(n), I = Math.max(0, g - (o - 1) * a);
|
|
2130
|
+
this.editor.setScrollTop(I);
|
|
1982
2131
|
}
|
|
1983
2132
|
if (i) {
|
|
1984
|
-
const
|
|
1985
|
-
if (
|
|
1986
|
-
const
|
|
2133
|
+
const g = this.editor.getModel();
|
|
2134
|
+
if (g) {
|
|
2135
|
+
const I = g.getLineContent(n) ?? "", h = /\S/.exec(I), u = h ? h.index + 1 : 1, m = g.validatePosition(new y.Position(n, u));
|
|
1987
2136
|
this.editor.setPosition(m), this.lastCursorPos = m;
|
|
1988
2137
|
}
|
|
1989
2138
|
}
|
|
@@ -1997,30 +2146,30 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
1997
2146
|
const i = this.editor.getModel();
|
|
1998
2147
|
if (!i) return;
|
|
1999
2148
|
const s = Math.max(1, Number(t.value ?? 1) || 1);
|
|
2000
|
-
let n = 1,
|
|
2149
|
+
let n = 1, o = i.getLineCount();
|
|
2001
2150
|
try {
|
|
2002
|
-
const
|
|
2003
|
-
|
|
2151
|
+
const u = this.editor.getVisibleRanges();
|
|
2152
|
+
u && u.length && (n = Math.min(...u.map((m) => m.startLineNumber)), o = Math.max(...u.map((m) => m.endLineNumber)));
|
|
2004
2153
|
} catch {
|
|
2005
2154
|
}
|
|
2006
|
-
n = Math.max(1, Math.min(n, i.getLineCount())),
|
|
2007
|
-
let
|
|
2155
|
+
n = Math.max(1, Math.min(n, i.getLineCount())), o = Math.max(1, Math.min(o, i.getLineCount())), o < n && (o = n);
|
|
2156
|
+
let c = n;
|
|
2008
2157
|
if (e === "top")
|
|
2009
|
-
|
|
2158
|
+
c = n + (s - 1);
|
|
2010
2159
|
else if (e === "middle")
|
|
2011
|
-
|
|
2160
|
+
c = Math.floor((n + o) / 2);
|
|
2012
2161
|
else if (e === "bottom")
|
|
2013
|
-
|
|
2162
|
+
c = o - (s - 1);
|
|
2014
2163
|
else
|
|
2015
2164
|
return;
|
|
2016
|
-
|
|
2017
|
-
const
|
|
2165
|
+
c = Math.max(n, Math.min(o, c));
|
|
2166
|
+
const a = i.getLineContent(c) ?? "", g = /\S/.exec(a), I = g ? g.index + 1 : 1, h = i.validatePosition(new y.Position(c, I));
|
|
2018
2167
|
this.suppressCursorSync = !0;
|
|
2019
2168
|
try {
|
|
2020
|
-
this.editor.setPosition(
|
|
2169
|
+
this.editor.setPosition(h);
|
|
2021
2170
|
} catch {
|
|
2022
2171
|
}
|
|
2023
|
-
this.lastCursorPos =
|
|
2172
|
+
this.lastCursorPos = h, this.suppressCursorSync = !1;
|
|
2024
2173
|
}
|
|
2025
2174
|
syncTabstopFromMonaco() {
|
|
2026
2175
|
const t = this.editor.getModel();
|
|
@@ -2042,176 +2191,103 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
2042
2191
|
for (let i = 0; i < e.length; i += 1)
|
|
2043
2192
|
e[i].style.background = i === t ? "rgba(255,255,255,0.12)" : "transparent";
|
|
2044
2193
|
}
|
|
2045
|
-
handleRedraw(t) {
|
|
2046
|
-
if (Array.isArray(t))
|
|
2047
|
-
for (const e of t) {
|
|
2048
|
-
if (!Array.isArray(e) || e.length === 0) continue;
|
|
2049
|
-
const i = e[0];
|
|
2050
|
-
if (typeof i != "string") continue;
|
|
2051
|
-
const s = e.slice(1), n = s.length === 1 && Array.isArray(s[0]) ? s[0] : s;
|
|
2052
|
-
if (i === "cmdline_hide") {
|
|
2053
|
-
this.setCmdline(null), this.scheduleSearchHighlightRefresh();
|
|
2054
|
-
continue;
|
|
2055
|
-
}
|
|
2056
|
-
if (i === "cmdline_show") {
|
|
2057
|
-
const r = n[0], l = Math.max(0, Number(n[1] ?? 0) || 0), c = typeof n[2] == "string" ? n[2] : "", u = typeof n[3] == "string" ? n[3] : "", d = Math.max(0, Number(n[4] ?? 0) || 0), f = u || c || "", p = " ".repeat(d), m = k(r), a = `${p}${f}${m}`;
|
|
2058
|
-
this.setCmdline(a);
|
|
2059
|
-
const h = B(`${p}${f}`), g = B(m);
|
|
2060
|
-
this.cmdlineCursorOffsetBytes = h, this.cmdlineCursorContentBytes = g;
|
|
2061
|
-
const b = l <= g ? this.cmdlineCursorOffsetBytes + l : l;
|
|
2062
|
-
this.setCmdlineCursor(b), this.scheduleSearchHighlightRefresh();
|
|
2063
|
-
continue;
|
|
2064
|
-
}
|
|
2065
|
-
if (i === "cmdline_pos") {
|
|
2066
|
-
const r = Math.max(0, Number(n[0] ?? 0) || 0), l = this.cmdlineCursorOffsetBytes > 0 && r <= this.cmdlineCursorContentBytes ? this.cmdlineCursorOffsetBytes + r : r;
|
|
2067
|
-
this.setCmdlineCursor(l), this.scheduleSearchHighlightRefresh();
|
|
2068
|
-
continue;
|
|
2069
|
-
}
|
|
2070
|
-
if (i === "msg_clear") {
|
|
2071
|
-
this.setMessage(null);
|
|
2072
|
-
continue;
|
|
2073
|
-
}
|
|
2074
|
-
if (i === "msg_show") {
|
|
2075
|
-
const r = typeof n[0] == "string" ? n[0] : "", l = n[1], c = !!n[2], u = !!n[4], d = k(l);
|
|
2076
|
-
if (r === "empty" && !d) {
|
|
2077
|
-
this.setMessage(null);
|
|
2078
|
-
continue;
|
|
2079
|
-
}
|
|
2080
|
-
if (!d) continue;
|
|
2081
|
-
if (u && this.messageEl?.textContent) {
|
|
2082
|
-
this.setMessage(`${this.messageEl.textContent}${d}`);
|
|
2083
|
-
continue;
|
|
2084
|
-
}
|
|
2085
|
-
if (c) {
|
|
2086
|
-
this.setMessage(d);
|
|
2087
|
-
continue;
|
|
2088
|
-
}
|
|
2089
|
-
this.setMessage(d);
|
|
2090
|
-
continue;
|
|
2091
|
-
}
|
|
2092
|
-
if (i === "msg_showmode" || i === "msg_showcmd" || i === "msg_ruler") {
|
|
2093
|
-
const r = n[0], l = k(r);
|
|
2094
|
-
this.setMessage(l || null);
|
|
2095
|
-
continue;
|
|
2096
|
-
}
|
|
2097
|
-
if (i === "popupmenu_hide") {
|
|
2098
|
-
this.setPopupmenu(null, -1);
|
|
2099
|
-
continue;
|
|
2100
|
-
}
|
|
2101
|
-
if (i === "popupmenu_show") {
|
|
2102
|
-
const r = n[0], l = Number(n[1] ?? -1), c = _e(r);
|
|
2103
|
-
this.setPopupmenu(c, Number.isFinite(l) ? l : -1);
|
|
2104
|
-
continue;
|
|
2105
|
-
}
|
|
2106
|
-
if (i === "popupmenu_select") {
|
|
2107
|
-
const r = Number(n[0] ?? -1);
|
|
2108
|
-
this.updatePopupmenuSelection(Number.isFinite(r) ? r : -1);
|
|
2109
|
-
continue;
|
|
2110
|
-
}
|
|
2111
|
-
if (i === "mode_change") {
|
|
2112
|
-
const r = typeof n[0] == "string" ? n[0] : "";
|
|
2113
|
-
this.hostAutocmdInstalled || this.applyNvimMode(r);
|
|
2114
|
-
continue;
|
|
2115
|
-
}
|
|
2116
|
-
}
|
|
2117
|
-
}
|
|
2118
2194
|
initTextInputListeners() {
|
|
2119
2195
|
const t = this.editor.getDomNode();
|
|
2120
2196
|
if (!t) return;
|
|
2121
|
-
const e = t.ownerDocument || document, i = e.defaultView || window, s = (
|
|
2197
|
+
const e = t.ownerDocument || document, i = e.defaultView || window, s = (r) => {
|
|
2122
2198
|
try {
|
|
2123
|
-
|
|
2199
|
+
r.stopImmediatePropagation?.();
|
|
2124
2200
|
} catch {
|
|
2125
2201
|
}
|
|
2126
2202
|
try {
|
|
2127
|
-
|
|
2203
|
+
r.stopPropagation();
|
|
2128
2204
|
} catch {
|
|
2129
2205
|
}
|
|
2130
|
-
}, n = (
|
|
2206
|
+
}, n = (r) => {
|
|
2131
2207
|
try {
|
|
2132
2208
|
if (typeof this.editor.hasTextFocus == "function" ? !!this.editor.hasTextFocus() : !1) return !0;
|
|
2133
|
-
const
|
|
2134
|
-
if (
|
|
2135
|
-
const
|
|
2136
|
-
return !!(
|
|
2209
|
+
const C = r.target;
|
|
2210
|
+
if (C && t.contains(C)) return !0;
|
|
2211
|
+
const p = e.activeElement;
|
|
2212
|
+
return !!(p && t.contains(p));
|
|
2137
2213
|
} catch {
|
|
2138
2214
|
return !1;
|
|
2139
2215
|
}
|
|
2140
|
-
},
|
|
2216
|
+
}, o = (r) => {
|
|
2141
2217
|
try {
|
|
2142
|
-
const
|
|
2143
|
-
return !
|
|
2218
|
+
const d = r;
|
|
2219
|
+
return !d || typeof d.tagName != "string" ? null : d;
|
|
2144
2220
|
} catch {
|
|
2145
2221
|
return null;
|
|
2146
2222
|
}
|
|
2147
|
-
},
|
|
2148
|
-
if (!n(
|
|
2149
|
-
const
|
|
2150
|
-
if (
|
|
2151
|
-
if (
|
|
2152
|
-
if (!this.opts.shouldHandleKey(
|
|
2153
|
-
s(
|
|
2223
|
+
}, c = (r) => {
|
|
2224
|
+
if (!n(r) || this.compositionActive || r.isComposing || r.getModifierState?.("AltGraph")) return;
|
|
2225
|
+
const d = this.delegateInsertToMonaco && !this.exitingInsertMode;
|
|
2226
|
+
if (d) {
|
|
2227
|
+
if (r.key === "Escape") {
|
|
2228
|
+
if (!this.opts.shouldHandleKey(r)) return;
|
|
2229
|
+
s(r);
|
|
2154
2230
|
try {
|
|
2155
|
-
|
|
2231
|
+
r.preventDefault();
|
|
2156
2232
|
} catch {
|
|
2157
2233
|
}
|
|
2158
|
-
if (this.compositionActive ||
|
|
2234
|
+
if (this.compositionActive || r.isComposing) {
|
|
2159
2235
|
this.pendingEscAfterComposition = !0;
|
|
2160
2236
|
return;
|
|
2161
2237
|
}
|
|
2162
2238
|
this.exitDelegatedInsertMode("<Esc>");
|
|
2163
2239
|
return;
|
|
2164
2240
|
}
|
|
2165
|
-
const
|
|
2166
|
-
(
|
|
2167
|
-
}
|
|
2168
|
-
if (!
|
|
2169
|
-
if (!this.opts.shouldHandleKey(
|
|
2170
|
-
const
|
|
2171
|
-
if (!
|
|
2172
|
-
s(
|
|
2241
|
+
const Z = r.key;
|
|
2242
|
+
(Z === "ArrowLeft" || Z === "ArrowRight" || Z === "ArrowUp" || Z === "ArrowDown" || Z === "Home" || Z === "End" || Z === "PageUp" || Z === "PageDown" || Z === "Tab" || Z === "Enter") && (this.delegatedInsertReplayPossible = !1);
|
|
2243
|
+
}
|
|
2244
|
+
if (!d && (r.key === "Backspace" || r.key === "Delete" || r.key === "Escape")) {
|
|
2245
|
+
if (!this.opts.shouldHandleKey(r)) return;
|
|
2246
|
+
const Z = this.opts.translateKey(r);
|
|
2247
|
+
if (!Z) return;
|
|
2248
|
+
s(r);
|
|
2173
2249
|
try {
|
|
2174
|
-
|
|
2250
|
+
r.preventDefault();
|
|
2175
2251
|
} catch {
|
|
2176
2252
|
}
|
|
2177
|
-
if (this.exitingInsertMode &&
|
|
2178
|
-
this.exitingInsertMode ? this.pendingKeysAfterExit +=
|
|
2253
|
+
if (this.exitingInsertMode && Z === "<Esc>") return;
|
|
2254
|
+
this.exitingInsertMode ? this.pendingKeysAfterExit += Z : this.sendInput(Z);
|
|
2179
2255
|
return;
|
|
2180
2256
|
}
|
|
2181
|
-
if (
|
|
2182
|
-
const
|
|
2183
|
-
if (!!!(
|
|
2184
|
-
if (!this.opts.shouldHandleKey(
|
|
2185
|
-
s(
|
|
2257
|
+
if (S(this.lastMode) && !this.delegateInsertToMonaco && !this.exitingInsertMode && !r.ctrlKey && !r.metaKey && typeof r.key == "string" && r.key.length === 1) {
|
|
2258
|
+
const Z = /^[\x20-\x7E]$/.test(r.key);
|
|
2259
|
+
if (!!!(r.altKey && Z)) {
|
|
2260
|
+
if (!this.opts.shouldHandleKey(r)) return;
|
|
2261
|
+
s(r);
|
|
2186
2262
|
return;
|
|
2187
2263
|
}
|
|
2188
2264
|
}
|
|
2189
|
-
if (!
|
|
2190
|
-
const
|
|
2191
|
-
if (!
|
|
2192
|
-
if (this.hasExplicitModAllowlist(
|
|
2193
|
-
if (!this.shouldForwardModifiedKeys(
|
|
2194
|
-
} else if (
|
|
2195
|
-
const
|
|
2196
|
-
if (
|
|
2197
|
-
s(
|
|
2265
|
+
if (!r.ctrlKey && !r.altKey && !r.metaKey) return;
|
|
2266
|
+
const C = this.modifiedKeyName(r);
|
|
2267
|
+
if (!C || !this.opts.shouldHandleKey(r)) return;
|
|
2268
|
+
if (this.hasExplicitModAllowlist(d)) {
|
|
2269
|
+
if (!this.shouldForwardModifiedKeys(r, d)) return;
|
|
2270
|
+
} else if (d || !r.ctrlKey || r.altKey || r.metaKey || C !== "f" && C !== "b" && C !== "d" && C !== "u" && C !== "e" && C !== "y" && C !== "v") return;
|
|
2271
|
+
const p = this.opts.translateKey(r);
|
|
2272
|
+
if (p) {
|
|
2273
|
+
s(r);
|
|
2198
2274
|
try {
|
|
2199
|
-
|
|
2275
|
+
r.preventDefault();
|
|
2200
2276
|
} catch {
|
|
2201
2277
|
}
|
|
2202
|
-
this.exitingInsertMode ? (this.debugLog(`keydown(capture) buffer: key=${JSON.stringify(
|
|
2278
|
+
this.exitingInsertMode ? (this.debugLog(`keydown(capture) buffer: key=${JSON.stringify(r.key)} code=${JSON.stringify(r.code)} mods=${r.ctrlKey ? "C" : ""}${r.altKey ? "A" : ""}${r.metaKey ? "D" : ""}${r.shiftKey ? "S" : ""} -> ${p}`), this.pendingKeysAfterExit += p) : d && (p === "<C-[>" || p === "<C-c>") ? (this.debugLog(`keydown(capture) exit insert: key=${JSON.stringify(r.key)} code=${JSON.stringify(r.code)} mods=${r.ctrlKey ? "C" : ""}${r.altKey ? "A" : ""}${r.metaKey ? "D" : ""}${r.shiftKey ? "S" : ""} -> ${p}`), this.exitDelegatedInsertMode(p)) : (d && this.flushPendingMonacoSync(), this.debugLog(`keydown(capture) send: key=${JSON.stringify(r.key)} code=${JSON.stringify(r.code)} mods=${r.ctrlKey ? "C" : ""}${r.altKey ? "A" : ""}${r.metaKey ? "D" : ""}${r.shiftKey ? "S" : ""} -> ${p}`), this.sendInput(p));
|
|
2203
2279
|
}
|
|
2204
|
-
},
|
|
2205
|
-
if (n(
|
|
2280
|
+
}, a = (r) => {
|
|
2281
|
+
if (n(r)) {
|
|
2206
2282
|
if (this.compositionActive = !0, this.debugLog(`compositionstart delegateInsert=${this.delegateInsertToMonaco} mode=${JSON.stringify(this.lastMode)}`), this.delegateInsertToMonaco) {
|
|
2207
2283
|
this.setPreedit(null);
|
|
2208
2284
|
return;
|
|
2209
2285
|
}
|
|
2210
2286
|
this.setPreedit("");
|
|
2211
2287
|
}
|
|
2212
|
-
},
|
|
2213
|
-
if (!n(
|
|
2214
|
-
if (this.compositionActive = !1, this.setPreedit(null), this.debugLog(`compositionend delegateInsert=${this.delegateInsertToMonaco} mode=${JSON.stringify(this.lastMode)} data=${JSON.stringify(
|
|
2288
|
+
}, g = (r) => {
|
|
2289
|
+
if (!n(r)) return;
|
|
2290
|
+
if (this.compositionActive = !1, this.setPreedit(null), this.debugLog(`compositionend delegateInsert=${this.delegateInsertToMonaco} mode=${JSON.stringify(this.lastMode)} data=${JSON.stringify(r.data ?? "")}`), this.delegateInsertToMonaco) {
|
|
2215
2291
|
if (this.pendingEscAfterComposition) {
|
|
2216
2292
|
this.pendingEscAfterComposition = !1, this.exitDelegatedInsertMode("<Esc>");
|
|
2217
2293
|
return;
|
|
@@ -2219,75 +2295,185 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
2219
2295
|
this.exitingInsertMode || this.scheduleCursorSyncToNvim();
|
|
2220
2296
|
return;
|
|
2221
2297
|
}
|
|
2222
|
-
const
|
|
2223
|
-
if (
|
|
2224
|
-
const
|
|
2225
|
-
|
|
2298
|
+
const d = o(r.target);
|
|
2299
|
+
if (Y(this.lastMode) && !S(this.lastMode)) {
|
|
2300
|
+
const C = typeof r.data == "string" ? r.data : "", p = !C && d && d.tagName === "TEXTAREA" && d.value ? String(d.value) : !C && d?.textContent ? String(d.textContent) : "", Z = C || p;
|
|
2301
|
+
Z && this.sendImeText(Z);
|
|
2302
|
+
}
|
|
2303
|
+
if (S(this.lastMode)) {
|
|
2304
|
+
const C = typeof r.data == "string" ? r.data : "", p = !C && d && d.tagName === "TEXTAREA" && d.value ? String(d.value) : !C && d?.textContent ? String(d.textContent) : "", Z = C || p;
|
|
2305
|
+
Z && this.sendImeText(Z);
|
|
2226
2306
|
}
|
|
2227
2307
|
try {
|
|
2228
|
-
|
|
2308
|
+
d && d.tagName === "TEXTAREA" ? d.value = "" : d && (d.textContent = "");
|
|
2229
2309
|
} catch {
|
|
2230
2310
|
}
|
|
2231
2311
|
this.pendingResyncAfterComposition && (this.pendingResyncAfterComposition = !1, this.scheduleResync());
|
|
2232
|
-
},
|
|
2233
|
-
if (!n(
|
|
2234
|
-
const
|
|
2235
|
-
this.setPreedit(
|
|
2236
|
-
},
|
|
2237
|
-
if (n(
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2312
|
+
}, I = (r) => {
|
|
2313
|
+
if (!n(r) || (this.compositionActive || (this.compositionActive = !0), this.delegateInsertToMonaco)) return;
|
|
2314
|
+
const d = o(r.target), C = typeof r.data == "string" ? r.data : d && d.tagName === "TEXTAREA" && d.value ? String(d.value) : d?.textContent ? String(d.textContent) : "";
|
|
2315
|
+
this.setPreedit(C || "");
|
|
2316
|
+
}, h = (r) => {
|
|
2317
|
+
if (!n(r) || this.delegateInsertToMonaco && !this.exitingInsertMode) return;
|
|
2318
|
+
const d = o(r.target);
|
|
2319
|
+
s(r);
|
|
2320
|
+
try {
|
|
2321
|
+
r.preventDefault?.();
|
|
2322
|
+
} catch {
|
|
2323
|
+
}
|
|
2324
|
+
if (Y(this.lastMode) && !this.compositionActive) {
|
|
2325
|
+
const C = r, p = typeof C.inputType == "string" ? String(C.inputType) : "", Z = !!C.isComposing, R = typeof C.data == "string" ? C.data : "";
|
|
2326
|
+
if (!Z && !p.includes("Composition")) {
|
|
2327
|
+
if (p === "insertText" || p === "insertReplacementText" || p === "insertFromDrop") {
|
|
2328
|
+
R && (this.armIgnoreNextInputEvent(C.target, 120), this.sendImeText(R));
|
|
2329
|
+
try {
|
|
2330
|
+
d?.tagName === "TEXTAREA" ? d.value = "" : d && (d.textContent = "");
|
|
2331
|
+
} catch {
|
|
2332
|
+
}
|
|
2333
|
+
return;
|
|
2334
|
+
}
|
|
2335
|
+
if (p === "insertLineBreak" || p === "insertParagraph") {
|
|
2336
|
+
this.armIgnoreNextInputEvent(C.target, 120), this.sendInput("<CR>");
|
|
2337
|
+
try {
|
|
2338
|
+
d?.tagName === "TEXTAREA" ? d.value = "" : d && (d.textContent = "");
|
|
2339
|
+
} catch {
|
|
2340
|
+
}
|
|
2341
|
+
return;
|
|
2342
|
+
}
|
|
2343
|
+
if (p === "deleteContentBackward") {
|
|
2344
|
+
this.armIgnoreNextInputEvent(C.target, 120), this.sendInput("<BS>");
|
|
2345
|
+
try {
|
|
2346
|
+
d?.tagName === "TEXTAREA" ? d.value = "" : d && (d.textContent = "");
|
|
2347
|
+
} catch {
|
|
2348
|
+
}
|
|
2349
|
+
return;
|
|
2350
|
+
}
|
|
2351
|
+
if (p === "deleteContentForward") {
|
|
2352
|
+
this.armIgnoreNextInputEvent(C.target, 120), this.sendInput("<Del>");
|
|
2353
|
+
try {
|
|
2354
|
+
d?.tagName === "TEXTAREA" ? d.value = "" : d && (d.textContent = "");
|
|
2355
|
+
} catch {
|
|
2356
|
+
}
|
|
2357
|
+
return;
|
|
2358
|
+
}
|
|
2246
2359
|
}
|
|
2247
2360
|
}
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
if (this.
|
|
2254
|
-
|
|
2361
|
+
if (S(this.lastMode) && !this.compositionActive) {
|
|
2362
|
+
const C = r, p = typeof C.data == "string" ? C.data : "", Z = typeof C.inputType == "string" ? String(C.inputType) : "";
|
|
2363
|
+
!C.isComposing && !Z.includes("Composition") && p && this.sendImeText(p);
|
|
2364
|
+
}
|
|
2365
|
+
}, u = (r) => {
|
|
2366
|
+
if (!n(r) || this.delegateInsertToMonaco && !this.exitingInsertMode) return;
|
|
2367
|
+
const d = o(r.target);
|
|
2368
|
+
s(r);
|
|
2369
|
+
const C = r;
|
|
2370
|
+
if (this.shouldIgnoreNextInputEvent(C.target)) {
|
|
2371
|
+
this.clearIgnoreNextInputEvent();
|
|
2255
2372
|
try {
|
|
2256
|
-
|
|
2373
|
+
d?.tagName === "TEXTAREA" ? d.value = "" : d && (d.textContent = "");
|
|
2257
2374
|
} catch {
|
|
2258
2375
|
}
|
|
2259
2376
|
return;
|
|
2260
2377
|
}
|
|
2261
2378
|
if (!this.compositionActive) {
|
|
2262
|
-
if (
|
|
2263
|
-
const
|
|
2264
|
-
|
|
2379
|
+
if (Y(this.lastMode) && !S(this.lastMode)) {
|
|
2380
|
+
const p = typeof C.data == "string" ? C.data : "", Z = !p && d?.tagName === "TEXTAREA" && d.value ? String(d.value) : !p && d?.textContent ? String(d.textContent) : "", R = p || Z;
|
|
2381
|
+
R && (this.armIgnoreNextInputEvent(C.target, 120), this.sendImeText(R));
|
|
2382
|
+
}
|
|
2383
|
+
if (S(this.lastMode)) {
|
|
2384
|
+
const p = typeof C.data == "string" ? C.data : "", Z = !p && d?.tagName === "TEXTAREA" && d.value ? String(d.value) : !p && d?.textContent ? String(d.textContent) : "", R = p || Z;
|
|
2385
|
+
R && this.sendImeText(R);
|
|
2265
2386
|
}
|
|
2266
2387
|
try {
|
|
2267
|
-
|
|
2388
|
+
d?.tagName === "TEXTAREA" ? d.value = "" : d && (d.textContent = "");
|
|
2268
2389
|
} catch {
|
|
2269
2390
|
}
|
|
2270
2391
|
}
|
|
2271
|
-
}, m = (
|
|
2272
|
-
if (!n(
|
|
2273
|
-
const
|
|
2274
|
-
s(
|
|
2275
|
-
const
|
|
2276
|
-
|
|
2392
|
+
}, m = (r) => {
|
|
2393
|
+
if (!n(r) || this.delegateInsertToMonaco && !this.exitingInsertMode) return;
|
|
2394
|
+
const d = o(r.target);
|
|
2395
|
+
s(r);
|
|
2396
|
+
const C = r.clipboardData?.getData("text/plain") ?? "";
|
|
2397
|
+
C && (r.preventDefault(), this.armIgnoreNextInputEvent(r.target, 150), this.pasteText(C));
|
|
2398
|
+
try {
|
|
2399
|
+
d?.tagName === "TEXTAREA" ? d.value = "" : d && (d.textContent = "");
|
|
2400
|
+
} catch {
|
|
2401
|
+
}
|
|
2402
|
+
};
|
|
2403
|
+
let b = !1, f = "left", G = null, A = "", B = null;
|
|
2404
|
+
const w = (r) => `${r.shiftKey ? "S" : ""}${r.ctrlKey ? "C" : ""}${r.altKey ? "A" : ""}${r.metaKey ? "D" : ""}`, v = (r) => r.button === 1 ? "middle" : r.button === 2 ? "right" : "left", N = (r) => {
|
|
2277
2405
|
try {
|
|
2278
|
-
|
|
2406
|
+
const p = this.editor.getTargetAtClientPoint?.(r.clientX, r.clientY)?.position;
|
|
2407
|
+
return p ? new y.Position(p.lineNumber, p.column) : null;
|
|
2279
2408
|
} catch {
|
|
2409
|
+
return null;
|
|
2410
|
+
}
|
|
2411
|
+
}, V = () => {
|
|
2412
|
+
B = null, b && G && (this.ignoreSelectionSyncUntil = this.nowMs() + 200, this.sendNvimMouse(f, "drag", A, G));
|
|
2413
|
+
}, $ = (r) => {
|
|
2414
|
+
if (!n(r) || this.delegateInsertToMonaco && !this.exitingInsertMode || this.compositionActive || r.isComposing || r.button !== 0 && r.button !== 1 && r.button !== 2) return;
|
|
2415
|
+
const d = N(r);
|
|
2416
|
+
if (d) {
|
|
2417
|
+
s(r);
|
|
2418
|
+
try {
|
|
2419
|
+
r.preventDefault();
|
|
2420
|
+
} catch {
|
|
2421
|
+
}
|
|
2422
|
+
try {
|
|
2423
|
+
this.editor.focus();
|
|
2424
|
+
} catch {
|
|
2425
|
+
}
|
|
2426
|
+
b = !0, f = v(r), A = w(r), G = d, B && (clearTimeout(B), B = null), this.ignoreSelectionSyncUntil = this.nowMs() + 250, this.sendNvimMouse(f, "press", A, d);
|
|
2427
|
+
}
|
|
2428
|
+
}, q = (r) => {
|
|
2429
|
+
if (!b || !n(r) || this.delegateInsertToMonaco && !this.exitingInsertMode || this.compositionActive || r.isComposing) return;
|
|
2430
|
+
const d = N(r);
|
|
2431
|
+
if (d) {
|
|
2432
|
+
s(r);
|
|
2433
|
+
try {
|
|
2434
|
+
r.preventDefault();
|
|
2435
|
+
} catch {
|
|
2436
|
+
}
|
|
2437
|
+
A = w(r), G = d, !B && (B = window.setTimeout(V, 16));
|
|
2438
|
+
}
|
|
2439
|
+
}, ee = (r) => {
|
|
2440
|
+
if (!b) return;
|
|
2441
|
+
b = !1;
|
|
2442
|
+
const d = n(r);
|
|
2443
|
+
if (d && this.delegateInsertToMonaco && !this.exitingInsertMode) return;
|
|
2444
|
+
const C = N(r) ?? G;
|
|
2445
|
+
if (C) {
|
|
2446
|
+
if (d) {
|
|
2447
|
+
s(r);
|
|
2448
|
+
try {
|
|
2449
|
+
r.preventDefault();
|
|
2450
|
+
} catch {
|
|
2451
|
+
}
|
|
2452
|
+
}
|
|
2453
|
+
B && (clearTimeout(B), B = null), A = w(r), G = C, this.ignoreSelectionSyncUntil = this.nowMs() + 250, this.sendNvimMouse(f, "release", A, C);
|
|
2454
|
+
}
|
|
2455
|
+
}, te = (r) => {
|
|
2456
|
+
if (n(r) && !(this.delegateInsertToMonaco && !this.exitingInsertMode)) {
|
|
2457
|
+
s(r);
|
|
2458
|
+
try {
|
|
2459
|
+
r.preventDefault();
|
|
2460
|
+
} catch {
|
|
2461
|
+
}
|
|
2280
2462
|
}
|
|
2281
2463
|
};
|
|
2282
2464
|
this.disposables.push(
|
|
2283
2465
|
// Capture phase to ensure we see events even if Monaco stops propagation.
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2466
|
+
X(i, "keydown", c, !0),
|
|
2467
|
+
X(i, "beforeinput", h, !0),
|
|
2468
|
+
X(i, "input", u, !0),
|
|
2469
|
+
X(i, "paste", m, !0),
|
|
2470
|
+
X(i, "mousedown", $, !0),
|
|
2471
|
+
X(i, "mousemove", q, !0),
|
|
2472
|
+
X(i, "mouseup", ee, !0),
|
|
2473
|
+
X(i, "contextmenu", te, !0),
|
|
2474
|
+
X(i, "compositionstart", a, !0),
|
|
2475
|
+
X(i, "compositionupdate", I, !0),
|
|
2476
|
+
X(i, "compositionend", g, !0)
|
|
2291
2477
|
);
|
|
2292
2478
|
}
|
|
2293
2479
|
scheduleResync() {
|
|
@@ -2383,35 +2569,35 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
2383
2569
|
let s = 0, n = 0;
|
|
2384
2570
|
if (i && t !== i)
|
|
2385
2571
|
try {
|
|
2386
|
-
const
|
|
2387
|
-
s = Number.isFinite(
|
|
2572
|
+
const I = i.getBoundingClientRect(), h = t.getBoundingClientRect();
|
|
2573
|
+
s = Number.isFinite(h.left - I.left) ? h.left - I.left : 0, n = Number.isFinite(h.top - I.top) ? h.top - I.top : 0;
|
|
2388
2574
|
} catch {
|
|
2389
2575
|
}
|
|
2390
|
-
const
|
|
2391
|
-
if (
|
|
2576
|
+
const o = Array.isArray(this.visualVirtualRawRanges) ? this.visualVirtualRawRanges : [];
|
|
2577
|
+
if (o.length === 0) {
|
|
2392
2578
|
try {
|
|
2393
2579
|
t.replaceChildren();
|
|
2394
2580
|
} catch {
|
|
2395
2581
|
}
|
|
2396
2582
|
return;
|
|
2397
2583
|
}
|
|
2398
|
-
const
|
|
2399
|
-
for (const
|
|
2400
|
-
const
|
|
2401
|
-
if (!Number.isFinite(
|
|
2402
|
-
const
|
|
2403
|
-
if (
|
|
2404
|
-
const
|
|
2405
|
-
if (!
|
|
2406
|
-
const
|
|
2407
|
-
if (
|
|
2408
|
-
const
|
|
2409
|
-
if (!Number.isFinite(
|
|
2410
|
-
const
|
|
2411
|
-
|
|
2584
|
+
const c = this.editor.getOption(y.editor.EditorOption.fontInfo), a = Math.max(1, Number(c?.typicalHalfwidthCharacterWidth ?? c?.maxDigitWidth ?? 0) || 0), g = document.createDocumentFragment();
|
|
2585
|
+
for (const I of o) {
|
|
2586
|
+
const h = Number(I?.start?.line), u = Number(I?.start_vcol), m = Number(I?.end_vcol), b = Number(I?.disp);
|
|
2587
|
+
if (!Number.isFinite(h) || !Number.isFinite(u) || !Number.isFinite(m) || !Number.isFinite(b)) continue;
|
|
2588
|
+
const f = h + 1;
|
|
2589
|
+
if (f < 1 || f > e.getLineCount()) continue;
|
|
2590
|
+
const G = Math.min(u, m), A = Math.max(u, m), B = this.editor.getScrolledVisiblePosition(new y.Position(f, 1));
|
|
2591
|
+
if (!B) continue;
|
|
2592
|
+
const w = A - G + 1;
|
|
2593
|
+
if (w <= 0) continue;
|
|
2594
|
+
const v = B.left + Math.max(0, G - 1) * a, N = w * a;
|
|
2595
|
+
if (!Number.isFinite(N) || N <= 0) continue;
|
|
2596
|
+
const V = document.createElement("div");
|
|
2597
|
+
V.className = "monaco-neovim-visual-virtual", V.style.left = `${Math.max(0, v - s)}px`, V.style.top = `${Math.max(0, B.top - n)}px`, V.style.width = `${N}px`, V.style.height = `${Math.max(0, B.height)}px`, g.appendChild(V);
|
|
2412
2598
|
}
|
|
2413
2599
|
try {
|
|
2414
|
-
t.replaceChildren(
|
|
2600
|
+
t.replaceChildren(g);
|
|
2415
2601
|
} catch {
|
|
2416
2602
|
}
|
|
2417
2603
|
}
|
|
@@ -2465,11 +2651,11 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
2465
2651
|
let e = 1, i = t.getLineCount();
|
|
2466
2652
|
try {
|
|
2467
2653
|
const n = this.editor.getVisibleRanges();
|
|
2468
|
-
n && n.length && (e = Math.min(...n.map((
|
|
2654
|
+
n && n.length && (e = Math.min(...n.map((o) => o.startLineNumber)), i = Math.max(...n.map((o) => o.endLineNumber)));
|
|
2469
2655
|
} catch {
|
|
2470
2656
|
}
|
|
2471
2657
|
e = Math.max(1, Math.min(e, t.getLineCount())), i = Math.max(1, Math.min(i, t.getLineCount()));
|
|
2472
|
-
const s = await this.execLua(
|
|
2658
|
+
const s = await this.execLua(ye, [e, i]);
|
|
2473
2659
|
this.applySearchHighlights(s, t);
|
|
2474
2660
|
} catch {
|
|
2475
2661
|
}
|
|
@@ -2486,113 +2672,113 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
2486
2672
|
this.clearSearchHighlights();
|
|
2487
2673
|
return;
|
|
2488
2674
|
}
|
|
2489
|
-
const n = Array.isArray(i.matches) ? i.matches : [],
|
|
2490
|
-
if (
|
|
2491
|
-
const m = e.getLineContent(
|
|
2492
|
-
return
|
|
2675
|
+
const n = Array.isArray(i.matches) ? i.matches : [], o = i.current && typeof i.current == "object" ? i.current : null, c = o && Number.isFinite(Number(o.l)) ? `${Number(o.l)}:${Number(o.s)}:${Number(o.e)}` : null, a = [], g = 2e3, I = /* @__PURE__ */ new Map(), h = (u) => {
|
|
2676
|
+
if (I.has(u)) return I.get(u);
|
|
2677
|
+
const m = e.getLineContent(u) ?? "";
|
|
2678
|
+
return I.set(u, m), m;
|
|
2493
2679
|
};
|
|
2494
|
-
for (let
|
|
2495
|
-
const m = n[
|
|
2496
|
-
if (!Number.isFinite(
|
|
2497
|
-
const
|
|
2498
|
-
if (
|
|
2499
|
-
const
|
|
2500
|
-
if (
|
|
2501
|
-
const
|
|
2502
|
-
|
|
2503
|
-
range: new y.Range(
|
|
2504
|
-
options: { inlineClassName:
|
|
2680
|
+
for (let u = 0; u < n.length && a.length < g; u += 1) {
|
|
2681
|
+
const m = n[u], b = Number(m?.l), f = Number(m?.s), G = Number(m?.e);
|
|
2682
|
+
if (!Number.isFinite(b) || !Number.isFinite(f) || !Number.isFinite(G)) continue;
|
|
2683
|
+
const A = b + 1;
|
|
2684
|
+
if (A < 1 || A > e.getLineCount()) continue;
|
|
2685
|
+
const B = h(A), w = K(B, Math.max(0, f)) + 1, v = K(B, Math.max(0, G)) + 1;
|
|
2686
|
+
if (v <= w) continue;
|
|
2687
|
+
const N = `${b}:${f}:${G}`, V = c && N === c ? "monaco-neovim-search-current" : "monaco-neovim-search-match";
|
|
2688
|
+
a.push({
|
|
2689
|
+
range: new y.Range(A, w, A, v),
|
|
2690
|
+
options: { inlineClassName: V }
|
|
2505
2691
|
});
|
|
2506
2692
|
}
|
|
2507
2693
|
this.ensureSearchStyle();
|
|
2508
2694
|
try {
|
|
2509
|
-
this.searchDecorationIds = this.editor.deltaDecorations(this.searchDecorationIds,
|
|
2695
|
+
this.searchDecorationIds = this.editor.deltaDecorations(this.searchDecorationIds, a);
|
|
2510
2696
|
} catch {
|
|
2511
2697
|
this.searchDecorationIds = [];
|
|
2512
2698
|
}
|
|
2513
2699
|
}
|
|
2514
2700
|
applyVisualDecorations(t, e, i = [], s = "") {
|
|
2515
2701
|
this.ensureVisualStyle();
|
|
2516
|
-
const n = typeof s == "string" && s ? s :
|
|
2517
|
-
if (
|
|
2518
|
-
let
|
|
2519
|
-
for (const
|
|
2520
|
-
const
|
|
2521
|
-
|
|
2522
|
-
}
|
|
2523
|
-
Number.isFinite(
|
|
2524
|
-
range: new y.Range(
|
|
2702
|
+
const n = typeof s == "string" && s ? s : we(e), o = n === "V", c = n === "", a = [];
|
|
2703
|
+
if (o) {
|
|
2704
|
+
let g = 1 / 0, I = -1 / 0;
|
|
2705
|
+
for (const h of t) {
|
|
2706
|
+
const u = h.getStartPosition(), m = h.getEndPosition();
|
|
2707
|
+
g = Math.min(g, u.lineNumber, m.lineNumber), I = Math.max(I, u.lineNumber, m.lineNumber);
|
|
2708
|
+
}
|
|
2709
|
+
Number.isFinite(g) && Number.isFinite(I) && I >= g && a.push({
|
|
2710
|
+
range: new y.Range(g, 1, I, 1),
|
|
2525
2711
|
options: { isWholeLine: !0, className: "monaco-neovim-visual-line" }
|
|
2526
2712
|
});
|
|
2527
|
-
} else if (!
|
|
2528
|
-
for (const
|
|
2529
|
-
const
|
|
2530
|
-
|
|
2531
|
-
range: y.Range.fromPositions(
|
|
2713
|
+
} else if (!c)
|
|
2714
|
+
for (const g of t) {
|
|
2715
|
+
const I = g.getStartPosition(), h = g.getEndPosition();
|
|
2716
|
+
a.push({
|
|
2717
|
+
range: y.Range.fromPositions(I, h),
|
|
2532
2718
|
options: { className: "monaco-neovim-visual-inline" }
|
|
2533
2719
|
});
|
|
2534
2720
|
}
|
|
2535
|
-
|
|
2721
|
+
c ? (this.visualVirtualRawRanges = Array.isArray(i) ? i : [], this.visualVirtualActive = !0, this.renderVisualVirtualOverlay()) : this.clearVisualVirtualOverlay();
|
|
2536
2722
|
try {
|
|
2537
|
-
this.visualDecorationIds = this.editor.deltaDecorations(this.visualDecorationIds,
|
|
2723
|
+
this.visualDecorationIds = this.editor.deltaDecorations(this.visualDecorationIds, a), this.visualSelectionActive = a.length > 0 || c;
|
|
2538
2724
|
} catch {
|
|
2539
2725
|
this.visualDecorationIds = [], this.visualSelectionActive = !1;
|
|
2540
2726
|
}
|
|
2541
2727
|
if (this.visualSelectionActive && !this.compositionActive) {
|
|
2542
|
-
const
|
|
2543
|
-
if (
|
|
2728
|
+
const g = this.editor.getPosition();
|
|
2729
|
+
if (g)
|
|
2544
2730
|
try {
|
|
2545
|
-
this.suppressCursorSync = !0, this.editor.setSelection(new y.Selection(
|
|
2731
|
+
this.suppressCursorSync = !0, this.editor.setSelection(new y.Selection(g.lineNumber, g.column, g.lineNumber, g.column));
|
|
2546
2732
|
} catch {
|
|
2547
2733
|
} finally {
|
|
2548
2734
|
this.suppressCursorSync = !1;
|
|
2549
2735
|
}
|
|
2550
2736
|
}
|
|
2551
2737
|
}
|
|
2552
|
-
applyNvimMode(t) {
|
|
2553
|
-
const
|
|
2554
|
-
if (!
|
|
2555
|
-
const
|
|
2556
|
-
this.lastMode =
|
|
2557
|
-
const
|
|
2558
|
-
if (
|
|
2559
|
-
this.delegateInsertToMonaco =
|
|
2560
|
-
const
|
|
2561
|
-
if (
|
|
2738
|
+
applyNvimMode(t, e) {
|
|
2739
|
+
const i = typeof t == "string" ? t : "", s = e == null ? this.nvimBlocking : !!e, n = !!(i && i !== this.lastMode), o = s !== this.nvimBlocking;
|
|
2740
|
+
if (!n && !o) return;
|
|
2741
|
+
const c = this.lastMode;
|
|
2742
|
+
n && (this.lastMode = i, S(i) && (this.ignoreNextInputEvent = !1), this.setMonacoHighlightsSuppressed(H(i))), this.nvimBlocking = s;
|
|
2743
|
+
const a = Y(this.lastMode) && !this.recordingRegister && !this.nvimBlocking;
|
|
2744
|
+
if (a !== this.delegateInsertToMonaco) {
|
|
2745
|
+
this.delegateInsertToMonaco = a, this.setEditorReadOnly(!a);
|
|
2746
|
+
const g = this.ensureActiveState();
|
|
2747
|
+
if (a) {
|
|
2562
2748
|
this.setPreedit(null), this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !0;
|
|
2563
2749
|
{
|
|
2564
|
-
const
|
|
2565
|
-
if (
|
|
2750
|
+
const I = this.recentNormalKeys, h = I.slice(-1), u = I.slice(-2), m = /* @__PURE__ */ new Set(["i", "a", "I", "A", "o", "O", "s", "S", "C", "R"]);
|
|
2751
|
+
if (u === "cc")
|
|
2566
2752
|
this.lastDelegatedInsertPrefix = "cc";
|
|
2567
|
-
else if (
|
|
2568
|
-
this.lastDelegatedInsertPrefix =
|
|
2753
|
+
else if (m.has(h))
|
|
2754
|
+
this.lastDelegatedInsertPrefix = h;
|
|
2569
2755
|
else {
|
|
2570
|
-
const
|
|
2571
|
-
if (
|
|
2572
|
-
let f =
|
|
2573
|
-
for (; f > 0 && /\d/.test(
|
|
2574
|
-
this.lastDelegatedInsertPrefix =
|
|
2756
|
+
const b = I.lastIndexOf("c");
|
|
2757
|
+
if (b >= 0) {
|
|
2758
|
+
let f = b;
|
|
2759
|
+
for (; f > 0 && /\d/.test(I[f - 1] ?? ""); ) f -= 1;
|
|
2760
|
+
this.lastDelegatedInsertPrefix = I.slice(f);
|
|
2575
2761
|
} else
|
|
2576
2762
|
this.lastDelegatedInsertPrefix = null;
|
|
2577
2763
|
}
|
|
2578
2764
|
}
|
|
2579
|
-
|
|
2765
|
+
g && (g.shadowLines = this.editor.getModel()?.getLinesContent() ?? null, g.pendingBufEdits = [], g.pendingFullSync = !1, g.pendingCursorSync = !1);
|
|
2580
2766
|
} else
|
|
2581
|
-
|
|
2767
|
+
g && ((g.pendingBufEdits.length || g.pendingCursorSync || g.pendingFullSync) && this.flushPendingMonacoSync(), g.shadowLines = null, g.pendingBufEdits = [], g.pendingFullSync = !1, g.pendingCursorSync = !1), this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1;
|
|
2582
2768
|
}
|
|
2583
|
-
if (this.exitingInsertMode && !
|
|
2769
|
+
if (this.exitingInsertMode && !Y(this.lastMode)) {
|
|
2584
2770
|
this.exitInsertTimer && (clearTimeout(this.exitInsertTimer), this.exitInsertTimer = null), this.exitingInsertMode = !1;
|
|
2585
|
-
const
|
|
2586
|
-
this.pendingKeysAfterExit = "",
|
|
2771
|
+
const g = this.pendingKeysAfterExit;
|
|
2772
|
+
this.pendingKeysAfterExit = "", g && this.sendInput(g);
|
|
2587
2773
|
}
|
|
2588
|
-
if (this.applyCursorStyle(
|
|
2774
|
+
if (n && (this.applyCursorStyle(i), this.opts.onModeChange && this.opts.onModeChange(i), this.updateVisualSelection(i)), n && H(c) && !H(i))
|
|
2589
2775
|
try {
|
|
2590
|
-
const
|
|
2591
|
-
|
|
2776
|
+
const g = this.editor.getPosition() ?? this.lastCursorPos;
|
|
2777
|
+
g && !this.compositionActive && (this.suppressCursorSync = !0, this.editor.setSelection(new y.Selection(g.lineNumber, g.column, g.lineNumber, g.column)), this.suppressCursorSync = !1);
|
|
2592
2778
|
} catch {
|
|
2593
2779
|
this.suppressCursorSync = !1;
|
|
2594
2780
|
}
|
|
2595
|
-
this.
|
|
2781
|
+
this.requestSearchHighlightRefresh();
|
|
2596
2782
|
}
|
|
2597
2783
|
setEditorReadOnly(t) {
|
|
2598
2784
|
const e = !!t;
|
|
@@ -2629,7 +2815,7 @@ ${p}`), i < n && s.length > 0 && (p += `
|
|
|
2629
2815
|
try {
|
|
2630
2816
|
const e = this.editor.getModel(), i = this.editor.getPosition();
|
|
2631
2817
|
if (e && i) {
|
|
2632
|
-
const s = e.getLineContent(i.lineNumber) ?? "", n =
|
|
2818
|
+
const s = e.getLineContent(i.lineNumber) ?? "", n = W(s, Math.max(0, i.column - 1));
|
|
2633
2819
|
this.ignoreInsertExitCursor = { line: i.lineNumber, col0: n, untilMs: this.nowMs() + 400 }, this.debugLog(`exitDelegatedInsertMode: sync cursor before exit: line=${i.lineNumber} col=${i.column} (byteCol0=${n})`), await this.rpcCall("nvim_win_set_cursor", [0, [i.lineNumber, n]]);
|
|
2634
2820
|
}
|
|
2635
2821
|
} catch {
|
|
@@ -2719,7 +2905,7 @@ vim.opt.ei = ei
|
|
|
2719
2905
|
return;
|
|
2720
2906
|
const s = this.opts.translateKey(e);
|
|
2721
2907
|
if (!s) return;
|
|
2722
|
-
this.
|
|
2908
|
+
this.armIgnoreNextInputEvent(e.target, 120), t.preventDefault(), this.pendingKeysAfterExit += s;
|
|
2723
2909
|
return;
|
|
2724
2910
|
}
|
|
2725
2911
|
if (this.delegateInsertToMonaco) {
|
|
@@ -2741,7 +2927,7 @@ vim.opt.ei = ei
|
|
|
2741
2927
|
}
|
|
2742
2928
|
return;
|
|
2743
2929
|
}
|
|
2744
|
-
if (
|
|
2930
|
+
if (S(this.lastMode) && !this.compositionActive && !e.isComposing && !e.getModifierState?.("AltGraph") && !e.ctrlKey && !e.metaKey && typeof e.key == "string" && e.key.length === 1) {
|
|
2745
2931
|
const s = /^[\x20-\x7E]$/.test(e.key);
|
|
2746
2932
|
if (!!!(e.altKey && s))
|
|
2747
2933
|
return this.opts.shouldHandleKey(e), void 0;
|
|
@@ -2752,11 +2938,11 @@ vim.opt.ei = ei
|
|
|
2752
2938
|
this.compositionActive = !0;
|
|
2753
2939
|
return;
|
|
2754
2940
|
}
|
|
2755
|
-
if (this.compositionActive || e.isComposing || !this.opts.shouldHandleKey(e) || this.hasExplicitModAllowlist(!1) && !this.shouldForwardModifiedKeys(e, !1))
|
|
2941
|
+
if (this.compositionActive || e.isComposing || !this.opts.shouldHandleKey(e) || this.hasExplicitModAllowlist(!1) && !this.shouldForwardModifiedKeys(e, !1) || Y(this.lastMode) && !this.delegateInsertToMonaco && !this.exitingInsertMode && !e.ctrlKey && !e.metaKey && !e.altKey && (e.key === "Dead" || typeof e.key == "string" && e.key.length === 1))
|
|
2756
2942
|
return;
|
|
2757
2943
|
const i = this.opts.translateKey(e);
|
|
2758
2944
|
if (i) {
|
|
2759
|
-
if (this.
|
|
2945
|
+
if (this.armIgnoreNextInputEvent(e.target, 120), t.preventDefault(), this.lastMode.startsWith("n")) {
|
|
2760
2946
|
if (i === "q" ? this.recordingRegister ? (this.recordingRegister = "", this.scheduleRecordingRefresh()) : this.recordingRefreshArmed = !0 : this.recordingRefreshArmed && typeof i == "string" && i.length === 1 && (this.recordingRefreshArmed = !1, this.recordingRegister = i, this.scheduleRecordingRefresh()), i === "." && this.lastDelegatedDotRepeat) {
|
|
2761
2947
|
const { prefix: s, keys: n } = this.lastDelegatedDotRepeat;
|
|
2762
2948
|
this.sendInput(s), this.sendInput(n), this.sendInput("<Esc>");
|
|
@@ -2764,20 +2950,37 @@ vim.opt.ei = ei
|
|
|
2764
2950
|
}
|
|
2765
2951
|
this.lastDelegatedDotRepeat && (/* @__PURE__ */ new Set(["c", "d", "y", "p", "x", "s", "r", "~", "J", ":"])).has(i) && (this.lastDelegatedDotRepeat = null);
|
|
2766
2952
|
}
|
|
2767
|
-
!
|
|
2953
|
+
!Y(this.lastMode) && i.length === 1 && !i.startsWith("<") && (this.recentNormalKeys = (this.recentNormalKeys + i).slice(-16)), this.sendInput(i);
|
|
2768
2954
|
}
|
|
2769
2955
|
}
|
|
2770
2956
|
handleMouse(t) {
|
|
2771
2957
|
if (this.delegateInsertToMonaco || !this.bufHandle || !t.target?.position) return;
|
|
2772
|
-
const { lineNumber: e, column: i } = t.target.position, s = this.editor.getModel(), n = Math.max(0, i - 1),
|
|
2773
|
-
this.sendNotify("nvim_win_set_cursor", [0, [e,
|
|
2958
|
+
const { lineNumber: e, column: i } = t.target.position, s = this.editor.getModel(), n = Math.max(0, i - 1), o = s ? s.getLineContent(e) ?? "" : "", c = s ? W(o, n) : n;
|
|
2959
|
+
this.sendNotify("nvim_win_set_cursor", [0, [e, c]]);
|
|
2960
|
+
}
|
|
2961
|
+
async sendNvimMouse(t, e, i, s) {
|
|
2962
|
+
if (!this.session || !this.session.isRunning() || !this.bufHandle) return;
|
|
2963
|
+
const n = this.editor.getModel();
|
|
2964
|
+
if (!n) return;
|
|
2965
|
+
const o = Math.max(1, Number(s.lineNumber) || 1), c = Math.max(0, Number(s.column) - 1 || 0), a = n.getLineContent(o) ?? "", g = W(a, c), I = String(i ?? ""), h = String(t ?? "left"), u = String(e ?? "press"), m = `
|
|
2966
|
+
local api, fn = vim.api, vim.fn
|
|
2967
|
+
local button, action, mods, lnum, col0 = ...
|
|
2968
|
+
pcall(api.nvim_win_set_cursor, 0, { lnum, col0 })
|
|
2969
|
+
local row = (fn.winline() or 1) - 1
|
|
2970
|
+
local col = (fn.wincol() or 1) - 1
|
|
2971
|
+
pcall(api.nvim_input_mouse, button, action, mods, 0, row, col)
|
|
2972
|
+
`;
|
|
2973
|
+
try {
|
|
2974
|
+
await this.execLua(m, [h, u, I, o, g]);
|
|
2975
|
+
} catch {
|
|
2976
|
+
}
|
|
2774
2977
|
}
|
|
2775
2978
|
handleSelection(t) {
|
|
2776
|
-
if (this.delegateInsertToMonaco || !this.session || !this.session.isRunning() || !this.bufHandle || this.suppressCursorSync || this.compositionActive || t?.isComposing) return;
|
|
2979
|
+
if (this.delegateInsertToMonaco || !this.session || !this.session.isRunning() || !this.bufHandle || this.suppressCursorSync || this.compositionActive || t?.isComposing || this.ignoreSelectionSyncUntil > this.nowMs()) return;
|
|
2777
2980
|
const e = t.selection;
|
|
2778
2981
|
if (e && t.source === "mouse") {
|
|
2779
2982
|
if (e.isEmpty()) {
|
|
2780
|
-
|
|
2983
|
+
H(this.lastMode) && this.sendInput("<Esc>");
|
|
2781
2984
|
return;
|
|
2782
2985
|
}
|
|
2783
2986
|
this.pendingSelection = new y.Selection(
|
|
@@ -2797,7 +3000,7 @@ vim.opt.ei = ei
|
|
|
2797
3000
|
if (this.delegateInsertToMonaco || !this.session || !this.session.isRunning() || !this.bufHandle) return;
|
|
2798
3001
|
const e = this.editor.getModel();
|
|
2799
3002
|
if (!e) return;
|
|
2800
|
-
const i = t.selectionStartLineNumber, s = Math.max(0, t.selectionStartColumn - 1), n = t.positionLineNumber,
|
|
3003
|
+
const i = t.selectionStartLineNumber, s = Math.max(0, t.selectionStartColumn - 1), n = t.positionLineNumber, o = Math.max(0, t.positionColumn - 1), c = e.getLineContent(i) ?? "", a = e.getLineContent(n) ?? "", g = W(c, s), I = W(a, o);
|
|
2801
3004
|
await this.execLua(`
|
|
2802
3005
|
local api = vim.api
|
|
2803
3006
|
local fn = vim.fn
|
|
@@ -2810,7 +3013,7 @@ end
|
|
|
2810
3013
|
api.nvim_win_set_cursor(0, { a_line, a_col0 })
|
|
2811
3014
|
api.nvim_feedkeys("v", "n", false)
|
|
2812
3015
|
api.nvim_win_set_cursor(0, { b_line, b_col0 })
|
|
2813
|
-
`, [i,
|
|
3016
|
+
`, [i, g, n, I]);
|
|
2814
3017
|
}
|
|
2815
3018
|
sendInput(t) {
|
|
2816
3019
|
this.sendNotify("nvim_input", [t]);
|
|
@@ -2883,20 +3086,20 @@ api.nvim_win_set_cursor(0, { b_line, b_col0 })
|
|
|
2883
3086
|
i.pendingFullSync = !0, i.pendingCursorSync = !0, i.shadowLines = e.getLinesContent(), this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1, this.scheduleFlushPendingMonacoSync();
|
|
2884
3087
|
return;
|
|
2885
3088
|
}
|
|
2886
|
-
const s = t.changes[0], n = s.range,
|
|
2887
|
-
if (
|
|
2888
|
-
if (i.shadowLines[
|
|
3089
|
+
const s = t.changes[0], n = s.range, o = n.startLineNumber - 1, c = n.endLineNumber - 1;
|
|
3090
|
+
if (o < 0 || c < 0) return;
|
|
3091
|
+
if (i.shadowLines[o] == null || i.shadowLines[c] == null) {
|
|
2889
3092
|
i.pendingFullSync = !0, i.pendingCursorSync = !0, i.shadowLines = e.getLinesContent(), this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1, this.scheduleFlushPendingMonacoSync();
|
|
2890
3093
|
return;
|
|
2891
3094
|
}
|
|
2892
|
-
const
|
|
3095
|
+
const a = i.shadowLines[o] ?? "", g = i.shadowLines[c] ?? "", I = Math.max(0, n.startColumn - 1), h = Math.max(0, n.endColumn - 1), u = W(a, I), m = W(g, h), b = String(s.text ?? ""), f = b.length ? b.split(/\r?\n/) : [];
|
|
2893
3096
|
try {
|
|
2894
|
-
const
|
|
2895
|
-
|
|
2896
|
-
`) ? (
|
|
3097
|
+
const G = Math.max(0, Number(s.rangeLength ?? 0) || 0);
|
|
3098
|
+
o === c && !b.includes(`
|
|
3099
|
+
`) ? (G > 0 && (this.dotRepeatBackspaces += G, this.dotRepeatKeys += "<BS>".repeat(G)), b && (this.dotRepeatKeys += _(b, !0)), this.dotRepeatKeys.length > 2e4 && (this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1)) : (this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1);
|
|
2897
3100
|
} catch {
|
|
2898
3101
|
}
|
|
2899
|
-
i.pendingBufEdits.push({ startRow:
|
|
3102
|
+
i.pendingBufEdits.push({ startRow: o, startColByte: u, endRow: c, endColByte: m, lines: f }), Ne(i.shadowLines, o, I, c, h, b), i.pendingCursorSync = !0, this.scheduleFlushPendingMonacoSync();
|
|
2900
3103
|
}
|
|
2901
3104
|
scheduleCursorSyncToNvim() {
|
|
2902
3105
|
if (!this.delegateInsertToMonaco || this.exitingInsertMode) return;
|
|
@@ -2931,8 +3134,8 @@ api.nvim_win_set_cursor(0, { b_line, b_col0 })
|
|
|
2931
3134
|
if (!this.session || !this.session.isRunning() || !this.bufHandle || !t && !this.delegateInsertToMonaco) return;
|
|
2932
3135
|
const e = this.editor.getModel(), i = this.editor.getPosition();
|
|
2933
3136
|
if (!e || !i) return;
|
|
2934
|
-
const s = i.lineNumber, n = e.getLineContent(s) ?? "",
|
|
2935
|
-
this.sendNotify("nvim_win_set_cursor", [0, [s,
|
|
3137
|
+
const s = i.lineNumber, n = e.getLineContent(s) ?? "", o = W(n, Math.max(0, i.column - 1));
|
|
3138
|
+
this.sendNotify("nvim_win_set_cursor", [0, [s, o]]);
|
|
2936
3139
|
}
|
|
2937
3140
|
scheduleVisualSelectionRefresh() {
|
|
2938
3141
|
this.visualSelectionRefreshTimer || (this.visualSelectionRefreshTimer = window.setTimeout(() => {
|
|
@@ -2945,7 +3148,7 @@ api.nvim_win_set_cursor(0, { b_line, b_col0 })
|
|
|
2945
3148
|
const t = await this.rpcCall("nvim_get_api_info", []), e = Array.isArray(t) ? Number(t[0]) : NaN;
|
|
2946
3149
|
if (!Number.isFinite(e) || e <= 0) return;
|
|
2947
3150
|
this.nvimChannelId = e;
|
|
2948
|
-
const i = this.opts.wrappedLineMotions ? "true" : "false", s = this.opts.scrollMotions ? "true" : "false", n = this.opts.syncScrolloff && this.opts.scrolloff == null ? "true" : "false",
|
|
3151
|
+
const i = this.opts.wrappedLineMotions ? "true" : "false", s = this.opts.scrollMotions ? "true" : "false", n = this.opts.syncScrolloff && this.opts.scrolloff == null ? "true" : "false", o = this.opts.hostCommands ? "true" : "false", a = `
|
|
2949
3152
|
local chan = ...
|
|
2950
3153
|
local api = vim.api
|
|
2951
3154
|
vim.g.monaco_neovim_wasm_chan = chan
|
|
@@ -2981,8 +3184,10 @@ local function send_cursor()
|
|
|
2981
3184
|
end
|
|
2982
3185
|
|
|
2983
3186
|
local function send_mode()
|
|
2984
|
-
local
|
|
2985
|
-
|
|
3187
|
+
local info = api.nvim_get_mode() or {}
|
|
3188
|
+
local m = info.mode or ""
|
|
3189
|
+
local blocking = info.blocking and true or false
|
|
3190
|
+
vim.rpcnotify(chan, "monaco_mode", m, blocking)
|
|
2986
3191
|
end
|
|
2987
3192
|
|
|
2988
3193
|
local function send_scrolloff()
|
|
@@ -3002,7 +3207,7 @@ end
|
|
|
3002
3207
|
if ${s} then
|
|
3003
3208
|
pcall(vim.cmd, "silent! source $HOME/.config/nvim/monaco-neovim-wasm/scrolling.vim")
|
|
3004
3209
|
end
|
|
3005
|
-
if ${
|
|
3210
|
+
if ${o} then
|
|
3006
3211
|
pcall(vim.cmd, "silent! source $HOME/.config/nvim/monaco-neovim-wasm/host-commands.vim")
|
|
3007
3212
|
end
|
|
3008
3213
|
|
|
@@ -3058,7 +3263,7 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3058
3263
|
filetype = (vim.bo[api.nvim_get_current_buf()] and vim.bo[api.nvim_get_current_buf()].filetype) or "",
|
|
3059
3264
|
})
|
|
3060
3265
|
`;
|
|
3061
|
-
await this.execLua(
|
|
3266
|
+
await this.execLua(a, [e]), this.hostAutocmdInstalled = !0;
|
|
3062
3267
|
} catch {
|
|
3063
3268
|
}
|
|
3064
3269
|
}
|
|
@@ -3089,42 +3294,42 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3089
3294
|
return;
|
|
3090
3295
|
}
|
|
3091
3296
|
try {
|
|
3092
|
-
const
|
|
3093
|
-
if (
|
|
3094
|
-
const
|
|
3095
|
-
await this.openText({ path: n, text:
|
|
3096
|
-
} catch (
|
|
3097
|
-
this.opts.status(`edit failed: ${
|
|
3297
|
+
const o = await s.readFile(n);
|
|
3298
|
+
if (o == null) return;
|
|
3299
|
+
const c = o instanceof Uint8Array ? new TextDecoder().decode(o) : String(o);
|
|
3300
|
+
await this.openText({ path: n, text: c }), this.opts.status(`opened: ${n}`);
|
|
3301
|
+
} catch (o) {
|
|
3302
|
+
this.opts.status(`edit failed: ${o?.message ?? o}`, !0);
|
|
3098
3303
|
}
|
|
3099
3304
|
return;
|
|
3100
3305
|
}
|
|
3101
3306
|
if (e === "write" || e === "wq") {
|
|
3102
|
-
const n = this.editor.getModel(),
|
|
3103
|
-
let
|
|
3104
|
-
if (!
|
|
3307
|
+
const n = this.editor.getModel(), o = n ? n.getValue() : "";
|
|
3308
|
+
let c = typeof i.path == "string" ? String(i.path) : "";
|
|
3309
|
+
if (!c)
|
|
3105
3310
|
try {
|
|
3106
|
-
const
|
|
3107
|
-
typeof
|
|
3311
|
+
const a = await this.rpcCall("nvim_buf_get_name", [0]);
|
|
3312
|
+
typeof a == "string" && (c = a);
|
|
3108
3313
|
} catch {
|
|
3109
3314
|
}
|
|
3110
|
-
if (
|
|
3315
|
+
if (c || (c = this.opts.seedName), !s.writeFile) {
|
|
3111
3316
|
this.opts.status("write: fileSystem.writeFile not set", !0);
|
|
3112
3317
|
return;
|
|
3113
3318
|
}
|
|
3114
3319
|
try {
|
|
3115
|
-
await s.writeFile(
|
|
3320
|
+
await s.writeFile(c, o);
|
|
3116
3321
|
try {
|
|
3117
|
-
await this.rpcCall("nvim_buf_set_name", [0,
|
|
3322
|
+
await this.rpcCall("nvim_buf_set_name", [0, c]);
|
|
3118
3323
|
} catch {
|
|
3119
3324
|
}
|
|
3120
3325
|
try {
|
|
3121
3326
|
await this.rpcCall("nvim_buf_set_option", [0, "modified", !1]);
|
|
3122
3327
|
} catch {
|
|
3123
3328
|
}
|
|
3124
|
-
const
|
|
3125
|
-
|
|
3126
|
-
} catch (
|
|
3127
|
-
this.opts.status(`write failed: ${
|
|
3329
|
+
const a = this.getActiveState();
|
|
3330
|
+
a && (a.name && a.name !== c && this.buffersByName.delete(a.name), a.name = c, this.buffersByName.set(c, a.id)), this.opts.status(`written: ${c}`), e === "wq" && this.opts.status("wq requested (provide onHostCommand to close the editor)");
|
|
3331
|
+
} catch (a) {
|
|
3332
|
+
this.opts.status(`write failed: ${a?.message ?? a}`, !0);
|
|
3128
3333
|
}
|
|
3129
3334
|
return;
|
|
3130
3335
|
}
|
|
@@ -3145,19 +3350,19 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3145
3350
|
await this.rpcCall("nvim_buf_attach", [e, !1, {}]);
|
|
3146
3351
|
} catch {
|
|
3147
3352
|
}
|
|
3148
|
-
let
|
|
3353
|
+
let c = [""];
|
|
3149
3354
|
try {
|
|
3150
|
-
const
|
|
3151
|
-
Array.isArray(
|
|
3355
|
+
const u = await this.rpcCall("nvim_buf_get_lines", [e, 0, -1, !1]);
|
|
3356
|
+
Array.isArray(u) && (c = u.map((m) => String(m ?? "")));
|
|
3152
3357
|
} catch {
|
|
3153
3358
|
}
|
|
3154
|
-
const
|
|
3155
|
-
`),
|
|
3359
|
+
const a = y.Uri.from({ scheme: "nvim", authority: "buf", path: `/${e}` }), g = c.join(`
|
|
3360
|
+
`), I = s && y.languages.getLanguages().some((u) => u.id === s), h = y.editor.createModel(g, I ? s : void 0, a);
|
|
3156
3361
|
n = {
|
|
3157
3362
|
id: e,
|
|
3158
3363
|
name: i || "",
|
|
3159
3364
|
filetype: s || "",
|
|
3160
|
-
model:
|
|
3365
|
+
model: h,
|
|
3161
3366
|
createdModel: !0,
|
|
3162
3367
|
shadowLines: null,
|
|
3163
3368
|
pendingBufEdits: [],
|
|
@@ -3181,7 +3386,7 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3181
3386
|
}
|
|
3182
3387
|
n.pendingBufEdits = [], n.pendingFullSync = !1, n.pendingCursorSync = !1;
|
|
3183
3388
|
}
|
|
3184
|
-
this.opts.syncTabstop && this.syncTabstopFromMonaco(), this.
|
|
3389
|
+
this.opts.syncTabstop && this.syncTabstopFromMonaco(), this.requestSearchHighlightRefresh();
|
|
3185
3390
|
}
|
|
3186
3391
|
handleBufDelete(t) {
|
|
3187
3392
|
const e = Number(t.buf);
|
|
@@ -3200,8 +3405,8 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3200
3405
|
let n = this.buffersByName.get(s) ?? null;
|
|
3201
3406
|
if (!n)
|
|
3202
3407
|
try {
|
|
3203
|
-
const
|
|
3204
|
-
n =
|
|
3408
|
+
const o = await this.rpcCall("nvim_create_buf", [!0, !1]);
|
|
3409
|
+
n = F(o) ?? Number(o);
|
|
3205
3410
|
} catch {
|
|
3206
3411
|
n = null;
|
|
3207
3412
|
}
|
|
@@ -3234,36 +3439,52 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3234
3439
|
return this.session ? this.session.call(t, e) : Promise.reject(new Error("session not started"));
|
|
3235
3440
|
}
|
|
3236
3441
|
doClipboardPaste(t) {
|
|
3237
|
-
const e = (
|
|
3238
|
-
|
|
3239
|
-
|
|
3240
|
-
|
|
3241
|
-
|
|
3442
|
+
const e = (n) => {
|
|
3443
|
+
this.lastClipboardText = n == null ? "" : String(n);
|
|
3444
|
+
const o = (n || "").split(/\r?\n/);
|
|
3445
|
+
this.sendRpcResponse(t, null, [o, "v"]);
|
|
3446
|
+
}, i = () => {
|
|
3447
|
+
try {
|
|
3448
|
+
return typeof navigator < "u" && navigator?.webdriver || typeof window > "u" || typeof window.prompt != "function" ? null : window.prompt("Paste text");
|
|
3449
|
+
} catch {
|
|
3450
|
+
return null;
|
|
3451
|
+
}
|
|
3452
|
+
}, s = this.opts.clipboard;
|
|
3453
|
+
if (s === null) {
|
|
3242
3454
|
e("");
|
|
3243
3455
|
return;
|
|
3244
3456
|
}
|
|
3245
|
-
if (
|
|
3246
|
-
|
|
3247
|
-
const
|
|
3248
|
-
e(
|
|
3457
|
+
if (s?.readText) {
|
|
3458
|
+
s.readText().then((n) => e(n || "")).catch(() => {
|
|
3459
|
+
const n = i();
|
|
3460
|
+
e(n ?? this.lastClipboardText ?? "");
|
|
3249
3461
|
});
|
|
3250
3462
|
return;
|
|
3251
3463
|
}
|
|
3252
3464
|
if (!navigator.clipboard?.readText) {
|
|
3253
|
-
const
|
|
3254
|
-
e(
|
|
3465
|
+
const n = i();
|
|
3466
|
+
e(n ?? this.lastClipboardText ?? "");
|
|
3255
3467
|
return;
|
|
3256
3468
|
}
|
|
3257
|
-
navigator.clipboard.readText().then((
|
|
3258
|
-
const
|
|
3259
|
-
e(
|
|
3469
|
+
navigator.clipboard.readText().then((n) => e(n || "")).catch(() => {
|
|
3470
|
+
const n = i();
|
|
3471
|
+
e(n ?? this.lastClipboardText ?? "");
|
|
3260
3472
|
});
|
|
3261
3473
|
}
|
|
3262
3474
|
updateCursor(t, e) {
|
|
3263
|
-
const i = this.editor.getModel(), s = Math.max(1, Number(t) || 1), n = Math.max(1, Number(e) || 1),
|
|
3264
|
-
if (this.debugLog(`updateCursor: line=${
|
|
3265
|
-
const
|
|
3266
|
-
|
|
3475
|
+
const i = this.editor.getModel(), s = Math.max(1, Number(t) || 1), n = Math.max(1, Number(e) || 1), o = i ? i.validatePosition(new y.Position(s, n)) : new y.Position(s, n);
|
|
3476
|
+
if (this.debugLog(`updateCursor: line=${o.lineNumber} col=${o.column} (from line=${s} col=${n}) visual=${this.visualSelectionActive} mode=${JSON.stringify(this.lastMode)}`), this.lastCursorPos = o, this.compositionActive) return;
|
|
3477
|
+
const c = this.editor.getPosition();
|
|
3478
|
+
c && c.lineNumber === o.lineNumber && c.column === o.column || (this.suppressCursorSync = !0, this.editor.setPosition(this.lastCursorPos), this.visualSelectionActive && this.editor.setSelection(new y.Selection(o.lineNumber, o.column, o.lineNumber, o.column)), this.applyScrolloff(this.lastCursorPos) || this.editor.revealPositionInCenterIfOutsideViewport(this.lastCursorPos), this.suppressCursorSync = !1), this.requestSearchHighlightRefresh();
|
|
3479
|
+
}
|
|
3480
|
+
requestSearchHighlightRefresh() {
|
|
3481
|
+
if (this.opts.searchHighlights) {
|
|
3482
|
+
if (this.stagingRedrawFrame) {
|
|
3483
|
+
this.stagedSearchRefresh = !0;
|
|
3484
|
+
return;
|
|
3485
|
+
}
|
|
3486
|
+
this.scheduleSearchHighlightRefresh();
|
|
3487
|
+
}
|
|
3267
3488
|
}
|
|
3268
3489
|
scheduleCursorRefresh() {
|
|
3269
3490
|
if (this.compositionActive || this.cursorRefreshTimer) return;
|
|
@@ -3287,12 +3508,12 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3287
3508
|
try {
|
|
3288
3509
|
const e = await this.rpcCall("nvim_win_get_cursor", [0]);
|
|
3289
3510
|
if (Array.isArray(e) && e.length >= 2) {
|
|
3290
|
-
const i = Number(e[0]), s = Number(e[1]), n =
|
|
3291
|
-
if (this.optimisticCursorPos && this.optimisticCursorUntil >
|
|
3292
|
-
const
|
|
3293
|
-
|
|
3511
|
+
const i = Number(e[0]), s = Number(e[1]), n = P(this.editor, i, s), o = new y.Position(n.line, n.col), c = typeof performance < "u" && performance.now ? performance.now() : Date.now();
|
|
3512
|
+
if (this.optimisticCursorPos && this.optimisticCursorUntil > c) {
|
|
3513
|
+
const a = this.optimisticCursorPrevPos;
|
|
3514
|
+
a && o.lineNumber === a.lineNumber && o.column === a.column || o.lineNumber < this.optimisticCursorPos.lineNumber || o.lineNumber === this.optimisticCursorPos.lineNumber && o.column < this.optimisticCursorPos.column || (this.optimisticCursorPos = null, this.optimisticCursorPrevPos = null, this.optimisticCursorUntil = 0, this.updateCursor(o.lineNumber, o.column));
|
|
3294
3515
|
} else
|
|
3295
|
-
this.optimisticCursorPos = null, this.optimisticCursorPrevPos = null, this.optimisticCursorUntil = 0, this.updateCursor(
|
|
3516
|
+
this.optimisticCursorPos = null, this.optimisticCursorPrevPos = null, this.optimisticCursorUntil = 0, this.updateCursor(o.lineNumber, o.column);
|
|
3296
3517
|
}
|
|
3297
3518
|
if (!this.lastMode)
|
|
3298
3519
|
try {
|
|
@@ -3310,24 +3531,24 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3310
3531
|
}
|
|
3311
3532
|
}
|
|
3312
3533
|
applyCursorStyle(t) {
|
|
3313
|
-
const e = typeof t == "string" ? t : "", i = e.startsWith("i") || e.startsWith("R"), s = i ? "line" : "block", n = i ? "blink" : "solid",
|
|
3314
|
-
s === this.lastCursorStyle && n === this.lastCursorBlink &&
|
|
3534
|
+
const e = typeof t == "string" ? t : "", i = e.startsWith("i") || e.startsWith("R"), s = i ? "line" : "block", n = i ? "blink" : "solid", o = i ? this.initialCursorWidth || 1 : this.typicalFullWidth;
|
|
3535
|
+
s === this.lastCursorStyle && n === this.lastCursorBlink && o === this.lastCursorWidth || (this.editor.updateOptions({ cursorStyle: s, cursorBlinking: n, cursorWidth: o }), this.lastCursorStyle = s, this.lastCursorBlink = n, this.lastCursorWidth = o);
|
|
3315
3536
|
}
|
|
3316
3537
|
async updateVisualSelection(t) {
|
|
3317
|
-
const e =
|
|
3538
|
+
const e = H(t), i = ++this.visualSelectionToken;
|
|
3318
3539
|
if (!e) {
|
|
3319
3540
|
this.clearVisualDecorations();
|
|
3320
3541
|
return;
|
|
3321
3542
|
}
|
|
3322
3543
|
try {
|
|
3323
|
-
const { selections: s, raw: n, tail:
|
|
3544
|
+
const { selections: s, raw: n, tail: o } = await this.fetchVisualRanges();
|
|
3324
3545
|
if (i !== this.visualSelectionToken || !s.length) return;
|
|
3325
|
-
this.applyVisualDecorations(s, t, n,
|
|
3546
|
+
this.applyVisualDecorations(s, t, n, o);
|
|
3326
3547
|
} catch {
|
|
3327
3548
|
}
|
|
3328
3549
|
}
|
|
3329
3550
|
async fetchVisualRanges() {
|
|
3330
|
-
const t = await this.execLua(
|
|
3551
|
+
const t = await this.execLua(be, []);
|
|
3331
3552
|
let e = [], i = "";
|
|
3332
3553
|
if (Array.isArray(t))
|
|
3333
3554
|
e = t;
|
|
@@ -3335,11 +3556,11 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3335
3556
|
const n = t;
|
|
3336
3557
|
i = typeof n.tail == "string" ? n.tail : "", e = Array.isArray(n.ranges) ? n.ranges : [];
|
|
3337
3558
|
}
|
|
3338
|
-
return { selections: e.map(
|
|
3559
|
+
return { selections: e.map(Ae(this.editor)).filter((n) => !!n), raw: e, tail: i };
|
|
3339
3560
|
}
|
|
3340
3561
|
async syncVisualSelectionColor() {
|
|
3341
3562
|
try {
|
|
3342
|
-
const e = await this.fetchVisualBg() || "#3e4451", i =
|
|
3563
|
+
const e = await this.fetchVisualBg() || "#3e4451", i = L(e, 0.45), s = L(e, 0.3);
|
|
3343
3564
|
y.editor.defineTheme(this.opts.visualThemeName, {
|
|
3344
3565
|
base: "vs-dark",
|
|
3345
3566
|
inherit: !0,
|
|
@@ -3383,19 +3604,19 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3383
3604
|
}
|
|
3384
3605
|
async fetchVisualBg() {
|
|
3385
3606
|
try {
|
|
3386
|
-
const t = await this.rpcCall("nvim_get_hl", [0, { name: "Visual", link: !1 }]), e =
|
|
3607
|
+
const t = await this.rpcCall("nvim_get_hl", [0, { name: "Visual", link: !1 }]), e = Q(t);
|
|
3387
3608
|
if (e) return e;
|
|
3388
3609
|
} catch {
|
|
3389
3610
|
}
|
|
3390
3611
|
try {
|
|
3391
|
-
const t = await this.rpcCall("nvim_get_hl_by_name", ["Visual", !0]), e =
|
|
3612
|
+
const t = await this.rpcCall("nvim_get_hl_by_name", ["Visual", !0]), e = Q(t);
|
|
3392
3613
|
if (e) return e;
|
|
3393
3614
|
} catch {
|
|
3394
3615
|
}
|
|
3395
3616
|
return null;
|
|
3396
3617
|
}
|
|
3397
3618
|
async seedBuffer(t, e) {
|
|
3398
|
-
const i =
|
|
3619
|
+
const i = F(t);
|
|
3399
3620
|
if (!i || i <= 0) return null;
|
|
3400
3621
|
const s = e ?? this.opts.seedLines;
|
|
3401
3622
|
if (!s || !s.length) return null;
|
|
@@ -3406,105 +3627,105 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3406
3627
|
}
|
|
3407
3628
|
}
|
|
3408
3629
|
}
|
|
3409
|
-
function
|
|
3410
|
-
return new
|
|
3630
|
+
function Se(l, t = {}) {
|
|
3631
|
+
return new fe(l, t);
|
|
3411
3632
|
}
|
|
3412
|
-
function
|
|
3413
|
-
return Math.min(Math.max(
|
|
3633
|
+
function k(l, t, e) {
|
|
3634
|
+
return Math.min(Math.max(l, t), e);
|
|
3414
3635
|
}
|
|
3415
|
-
function
|
|
3636
|
+
function E(l) {
|
|
3416
3637
|
try {
|
|
3417
|
-
return new TextEncoder().encode(String(
|
|
3638
|
+
return new TextEncoder().encode(String(l ?? "")).length;
|
|
3418
3639
|
} catch {
|
|
3419
|
-
return String(
|
|
3640
|
+
return String(l ?? "").length;
|
|
3420
3641
|
}
|
|
3421
3642
|
}
|
|
3422
|
-
function
|
|
3423
|
-
const i = Math.max(1, Number(t) || 1), s = Math.max(1, (Number(e) || 0) + 1), n =
|
|
3643
|
+
function P(l, t, e) {
|
|
3644
|
+
const i = Math.max(1, Number(t) || 1), s = Math.max(1, (Number(e) || 0) + 1), n = l.getModel();
|
|
3424
3645
|
if (!n)
|
|
3425
3646
|
return { line: i, col: s };
|
|
3426
|
-
const
|
|
3427
|
-
return { line:
|
|
3647
|
+
const o = n.getLineCount(), c = k(i, 1, o), a = n.getLineContent(c) ?? "", g = n.getLineMaxColumn(c), I = Math.max(0, Number(e) || 0), h = K(a, I), u = k(h + 1, 1, g);
|
|
3648
|
+
return { line: c, col: u };
|
|
3428
3649
|
}
|
|
3429
|
-
function
|
|
3430
|
-
const e = String(
|
|
3650
|
+
function _(l, t = !0) {
|
|
3651
|
+
const e = String(l ?? "");
|
|
3431
3652
|
if (!e) return "";
|
|
3432
3653
|
const i = e.replace(/\r\n/g, `
|
|
3433
3654
|
`).replace(/\r/g, `
|
|
3434
3655
|
`).replace(/</g, "<lt>");
|
|
3435
3656
|
return t ? i.replace(/\n/g, "<CR>") : i;
|
|
3436
3657
|
}
|
|
3437
|
-
function
|
|
3438
|
-
const t =
|
|
3658
|
+
function Ze(l) {
|
|
3659
|
+
const t = l.key;
|
|
3439
3660
|
if (!t || t === "Dead" || t === "Unidentified") return null;
|
|
3440
|
-
const e = !!
|
|
3661
|
+
const e = !!l.getModifierState?.("AltGraph"), i = l.ctrlKey && !e, s = l.altKey && !e, n = l.metaKey && !e, o = l.shiftKey, c = (h) => h === "<" ? "lt" : h, a = (h) => h === "<" ? "<lt>" : h, g = (h, u = !1) => {
|
|
3441
3662
|
const m = [];
|
|
3442
|
-
i && m.push("C-"),
|
|
3443
|
-
const
|
|
3444
|
-
return m.length ? `<${m.join("")}${
|
|
3663
|
+
i && m.push("C-"), u && o && m.push("S-"), s && m.push("A-"), n && m.push("D-");
|
|
3664
|
+
const b = c(h);
|
|
3665
|
+
return m.length ? `<${m.join("")}${b}>` : `<${b}>`;
|
|
3445
3666
|
};
|
|
3446
|
-
if (typeof
|
|
3447
|
-
switch (
|
|
3667
|
+
if (typeof l.code == "string" && l.code.startsWith("Numpad") || typeof KeyboardEvent?.DOM_KEY_LOCATION_NUMPAD == "number" && l.location === KeyboardEvent.DOM_KEY_LOCATION_NUMPAD) {
|
|
3668
|
+
switch (l.code) {
|
|
3448
3669
|
case "NumpadEnter":
|
|
3449
|
-
return
|
|
3670
|
+
return g("kEnter", !0);
|
|
3450
3671
|
case "NumpadAdd":
|
|
3451
|
-
return
|
|
3672
|
+
return g("kPlus", !0);
|
|
3452
3673
|
case "NumpadSubtract":
|
|
3453
|
-
return
|
|
3674
|
+
return g("kMinus", !0);
|
|
3454
3675
|
case "NumpadMultiply":
|
|
3455
|
-
return
|
|
3676
|
+
return g("kMultiply", !0);
|
|
3456
3677
|
case "NumpadDivide":
|
|
3457
|
-
return
|
|
3678
|
+
return g("kDivide", !0);
|
|
3458
3679
|
case "NumpadDecimal":
|
|
3459
|
-
return
|
|
3680
|
+
return g("kPoint", !0);
|
|
3460
3681
|
}
|
|
3461
|
-
if (/^\d$/.test(t)) return
|
|
3682
|
+
if (/^\d$/.test(t)) return g(`k${t}`, !0);
|
|
3462
3683
|
}
|
|
3463
3684
|
switch (t) {
|
|
3464
3685
|
case "Backspace":
|
|
3465
|
-
return
|
|
3686
|
+
return g("BS", !0);
|
|
3466
3687
|
case "Enter":
|
|
3467
|
-
return
|
|
3688
|
+
return g("CR", !0);
|
|
3468
3689
|
case "Escape":
|
|
3469
|
-
return
|
|
3690
|
+
return g("Esc", !0);
|
|
3470
3691
|
case "Tab":
|
|
3471
|
-
return
|
|
3692
|
+
return o && !i && !s && !n ? "<S-Tab>" : g("Tab", !0);
|
|
3472
3693
|
case "ArrowUp":
|
|
3473
|
-
return
|
|
3694
|
+
return g("Up", !0);
|
|
3474
3695
|
case "ArrowDown":
|
|
3475
|
-
return
|
|
3696
|
+
return g("Down", !0);
|
|
3476
3697
|
case "ArrowLeft":
|
|
3477
|
-
return
|
|
3698
|
+
return g("Left", !0);
|
|
3478
3699
|
case "ArrowRight":
|
|
3479
|
-
return
|
|
3700
|
+
return g("Right", !0);
|
|
3480
3701
|
case "Delete":
|
|
3481
|
-
return
|
|
3702
|
+
return g("Del", !0);
|
|
3482
3703
|
case "Home":
|
|
3483
|
-
return
|
|
3704
|
+
return g("Home", !0);
|
|
3484
3705
|
case "End":
|
|
3485
|
-
return
|
|
3706
|
+
return g("End", !0);
|
|
3486
3707
|
case "PageUp":
|
|
3487
|
-
return
|
|
3708
|
+
return g("PageUp", !0);
|
|
3488
3709
|
case "PageDown":
|
|
3489
|
-
return
|
|
3710
|
+
return g("PageDown", !0);
|
|
3490
3711
|
case "Insert":
|
|
3491
|
-
return
|
|
3712
|
+
return g("Insert", !0);
|
|
3492
3713
|
}
|
|
3493
|
-
if (/^F\d{1,2}$/.test(t)) return
|
|
3714
|
+
if (/^F\d{1,2}$/.test(t)) return g(t, !0);
|
|
3494
3715
|
if (t.length === 1) {
|
|
3495
|
-
if (!i && !s && !n) return
|
|
3716
|
+
if (!i && !s && !n) return a(t);
|
|
3496
3717
|
if (t === " " && i && !s && !n) return "<Nul>";
|
|
3497
|
-
const
|
|
3498
|
-
return `<${(i ? "C-" : "") + (s ? "A-" : "") + (n ? "D-" : "")}${
|
|
3718
|
+
const h = /^[A-Za-z]$/.test(t) ? t.toLowerCase() : t, u = c(h);
|
|
3719
|
+
return `<${(i ? "C-" : "") + (s ? "A-" : "") + (n ? "D-" : "")}${u}>`;
|
|
3499
3720
|
}
|
|
3500
3721
|
return null;
|
|
3501
3722
|
}
|
|
3502
|
-
function
|
|
3503
|
-
if (!
|
|
3504
|
-
const t =
|
|
3505
|
-
if (
|
|
3723
|
+
function Ge(l) {
|
|
3724
|
+
if (!l || l.length === 0) return null;
|
|
3725
|
+
const t = l[0];
|
|
3726
|
+
if (l.length === 1)
|
|
3506
3727
|
return t <= 127 ? t : t - 256;
|
|
3507
|
-
const e = new DataView(
|
|
3728
|
+
const e = new DataView(l.buffer, l.byteOffset, l.byteLength);
|
|
3508
3729
|
switch (t) {
|
|
3509
3730
|
case 204:
|
|
3510
3731
|
return e.getUint8(1);
|
|
@@ -3526,78 +3747,78 @@ function he(o) {
|
|
|
3526
3747
|
return t;
|
|
3527
3748
|
}
|
|
3528
3749
|
}
|
|
3529
|
-
function
|
|
3530
|
-
return
|
|
3750
|
+
function Be(l) {
|
|
3751
|
+
return l instanceof Uint8Array ? l : l instanceof ArrayBuffer ? new Uint8Array(l) : Array.isArray(l) ? new Uint8Array(l) : Number.isInteger(l) ? new Uint8Array([l & 255]) : l && l.type === "Buffer" && Array.isArray(l.data) ? new Uint8Array(l.data) : null;
|
|
3531
3752
|
}
|
|
3532
|
-
function
|
|
3533
|
-
if (
|
|
3534
|
-
const e =
|
|
3753
|
+
function F(l) {
|
|
3754
|
+
if (l && typeof l == "object" && typeof l.type == "number") {
|
|
3755
|
+
const e = Be(l.data);
|
|
3535
3756
|
if (e) {
|
|
3536
|
-
const i =
|
|
3757
|
+
const i = Ge(e);
|
|
3537
3758
|
if (i != null && i > 0) return i;
|
|
3538
3759
|
}
|
|
3539
3760
|
}
|
|
3540
|
-
const t = Number(
|
|
3761
|
+
const t = Number(l);
|
|
3541
3762
|
return Number.isInteger(t) && t > 0 ? t : null;
|
|
3542
3763
|
}
|
|
3543
|
-
function
|
|
3764
|
+
function K(l, t) {
|
|
3544
3765
|
let e = 0, i = 0;
|
|
3545
3766
|
const s = Math.max(0, Number(t) || 0);
|
|
3546
3767
|
for (; e < s; ) {
|
|
3547
|
-
if (i >=
|
|
3768
|
+
if (i >= l.length)
|
|
3548
3769
|
return i + (s - e);
|
|
3549
|
-
const n =
|
|
3550
|
-
if (e +
|
|
3551
|
-
e +=
|
|
3770
|
+
const n = l.codePointAt(i), o = D(n ?? 0);
|
|
3771
|
+
if (e + o > s) return i;
|
|
3772
|
+
e += o, i += o === 4 ? 2 : 1;
|
|
3552
3773
|
}
|
|
3553
3774
|
return i;
|
|
3554
3775
|
}
|
|
3555
|
-
function
|
|
3776
|
+
function W(l, t) {
|
|
3556
3777
|
const e = Math.max(0, Number(t) || 0);
|
|
3557
3778
|
let i = 0, s = 0;
|
|
3558
|
-
for (; s < e && s <
|
|
3559
|
-
const n =
|
|
3560
|
-
i +=
|
|
3779
|
+
for (; s < e && s < l.length; ) {
|
|
3780
|
+
const n = l.codePointAt(s), o = D(n ?? 0);
|
|
3781
|
+
i += o, s += o === 4 ? 2 : 1;
|
|
3561
3782
|
}
|
|
3562
3783
|
return i;
|
|
3563
3784
|
}
|
|
3564
|
-
function
|
|
3565
|
-
return
|
|
3785
|
+
function D(l) {
|
|
3786
|
+
return l == null ? 0 : l <= 127 ? 1 : l <= 2047 ? 2 : l >= 55296 && l <= 57343 ? 4 : l < 65535 ? 3 : 4;
|
|
3566
3787
|
}
|
|
3567
|
-
function
|
|
3788
|
+
function Ae(l) {
|
|
3568
3789
|
return (t) => {
|
|
3569
3790
|
if (!t || !t.start || !t.end) return null;
|
|
3570
|
-
const e = O(
|
|
3791
|
+
const e = O(l, t.start, !1), i = O(l, t.end, !!t.inclusive);
|
|
3571
3792
|
return !e || !i ? null : new y.Selection(e.lineNumber, e.column, i.lineNumber, i.column);
|
|
3572
3793
|
};
|
|
3573
3794
|
}
|
|
3574
|
-
function O(
|
|
3795
|
+
function O(l, t, e) {
|
|
3575
3796
|
if (!t || typeof t.line != "number" || typeof t.col != "number") return null;
|
|
3576
|
-
const i =
|
|
3797
|
+
const i = l.getModel(), s = k(t.line + 1, 1, i?.getLineCount() || 1 / 0);
|
|
3577
3798
|
if (!i) {
|
|
3578
|
-
const
|
|
3579
|
-
return { lineNumber: s, column:
|
|
3799
|
+
const I = Math.max(1, t.col + 1);
|
|
3800
|
+
return { lineNumber: s, column: I + (e ? 1 : 0) };
|
|
3580
3801
|
}
|
|
3581
|
-
const n = i.getLineContent(s) ?? "",
|
|
3582
|
-
let
|
|
3802
|
+
const n = i.getLineContent(s) ?? "", o = Math.max(0, Number(t.col) || 0);
|
|
3803
|
+
let c = o;
|
|
3583
3804
|
if (e) {
|
|
3584
|
-
const
|
|
3585
|
-
if (
|
|
3586
|
-
const
|
|
3587
|
-
|
|
3805
|
+
const I = K(n, o);
|
|
3806
|
+
if (I < n.length) {
|
|
3807
|
+
const h = n.codePointAt(I);
|
|
3808
|
+
c = o + D(h ?? 0);
|
|
3588
3809
|
}
|
|
3589
3810
|
}
|
|
3590
|
-
const
|
|
3591
|
-
return { lineNumber: s, column:
|
|
3811
|
+
const a = K(n, c) + 1, g = i.getLineMaxColumn(s);
|
|
3812
|
+
return { lineNumber: s, column: k(a, 1, g) };
|
|
3592
3813
|
}
|
|
3593
|
-
function
|
|
3594
|
-
const t = typeof
|
|
3814
|
+
function H(l) {
|
|
3815
|
+
const t = typeof l == "string" ? l : "";
|
|
3595
3816
|
return t.includes("v") || t.includes("V") || t.includes("") || t.includes("s") || t.includes("S") || t.includes("");
|
|
3596
3817
|
}
|
|
3597
|
-
function
|
|
3598
|
-
if (!
|
|
3818
|
+
function Re(l) {
|
|
3819
|
+
if (!l || !Array.isArray(l) || l.length === 0) return;
|
|
3599
3820
|
const t = new TextEncoder(), e = [];
|
|
3600
|
-
for (const i of
|
|
3821
|
+
for (const i of l) {
|
|
3601
3822
|
if (!i) continue;
|
|
3602
3823
|
const s = String(i.path ?? "");
|
|
3603
3824
|
if (!s) continue;
|
|
@@ -3606,71 +3827,71 @@ function pe(o) {
|
|
|
3606
3827
|
}
|
|
3607
3828
|
return e.length ? e : void 0;
|
|
3608
3829
|
}
|
|
3609
|
-
function
|
|
3610
|
-
const e = Array.isArray(t) ? t.filter(Boolean) : [], i = Array.isArray(
|
|
3830
|
+
function Xe(l, t) {
|
|
3831
|
+
const e = Array.isArray(t) ? t.filter(Boolean) : [], i = Array.isArray(l) ? l.filter(Boolean) : [], s = [...e, ...i];
|
|
3611
3832
|
return s.length ? s : void 0;
|
|
3612
3833
|
}
|
|
3613
|
-
function
|
|
3614
|
-
const e =
|
|
3615
|
-
if (e.length !== 6) return
|
|
3616
|
-
const i = Math.round(
|
|
3834
|
+
function L(l, t) {
|
|
3835
|
+
const e = l.replace("#", "");
|
|
3836
|
+
if (e.length !== 6) return l;
|
|
3837
|
+
const i = Math.round(k(t, 0, 1) * 255);
|
|
3617
3838
|
return `#${e}${i.toString(16).padStart(2, "0")}`;
|
|
3618
3839
|
}
|
|
3619
|
-
function
|
|
3620
|
-
if (!
|
|
3621
|
-
const t =
|
|
3622
|
-
return typeof e == "number" && e >= 0 ?
|
|
3840
|
+
function Q(l) {
|
|
3841
|
+
if (!l || typeof l != "object") return null;
|
|
3842
|
+
const t = l, e = t.background ?? t.bg;
|
|
3843
|
+
return typeof e == "number" && e >= 0 ? Ve(e) : typeof t.background == "string" && t.background.startsWith("#") ? t.background : typeof t.bg == "string" && t.bg.startsWith("#") ? t.bg : null;
|
|
3623
3844
|
}
|
|
3624
|
-
function
|
|
3625
|
-
return `#${Number(
|
|
3845
|
+
function Ve(l) {
|
|
3846
|
+
return `#${Number(l >>> 0).toString(16).padStart(6, "0").slice(-6)}`;
|
|
3626
3847
|
}
|
|
3627
|
-
function
|
|
3628
|
-
return
|
|
3848
|
+
function X(l, t, e, i) {
|
|
3849
|
+
return l.addEventListener(t, e, i), { dispose: () => l.removeEventListener(t, e, i) };
|
|
3629
3850
|
}
|
|
3630
|
-
function
|
|
3631
|
-
return (typeof
|
|
3851
|
+
function Y(l) {
|
|
3852
|
+
return (typeof l == "string" ? l : "").startsWith("i");
|
|
3632
3853
|
}
|
|
3633
|
-
function
|
|
3634
|
-
const t = typeof
|
|
3854
|
+
function we(l) {
|
|
3855
|
+
const t = typeof l == "string" ? l : "";
|
|
3635
3856
|
return t.length ? t[t.length - 1] : "";
|
|
3636
3857
|
}
|
|
3637
|
-
function
|
|
3638
|
-
const t = typeof
|
|
3858
|
+
function S(l) {
|
|
3859
|
+
const t = typeof l == "string" ? l : "";
|
|
3639
3860
|
return t === "c" || t.startsWith("c");
|
|
3640
3861
|
}
|
|
3641
|
-
function
|
|
3642
|
-
const
|
|
3643
|
-
let
|
|
3644
|
-
if (
|
|
3645
|
-
|
|
3862
|
+
function Ne(l, t, e, i, s, n) {
|
|
3863
|
+
const o = l[t] ?? "", c = l[i] ?? "", a = o.slice(0, Math.max(0, e)), g = c.slice(Math.max(0, s)), h = String(n ?? "").split(/\r?\n/);
|
|
3864
|
+
let u;
|
|
3865
|
+
if (h.length <= 1)
|
|
3866
|
+
u = [`${a}${h[0] ?? ""}${g}`];
|
|
3646
3867
|
else {
|
|
3647
|
-
const m = `${
|
|
3648
|
-
|
|
3868
|
+
const m = `${a}${h[0] ?? ""}`, b = `${h[h.length - 1] ?? ""}${g}`, f = h.slice(1, -1);
|
|
3869
|
+
u = [m, ...f, b];
|
|
3649
3870
|
}
|
|
3650
|
-
|
|
3871
|
+
l.splice(t, Math.max(0, i - t + 1), ...u);
|
|
3651
3872
|
}
|
|
3652
|
-
function
|
|
3653
|
-
if (!
|
|
3654
|
-
if (typeof
|
|
3655
|
-
if (!Array.isArray(
|
|
3873
|
+
function z(l) {
|
|
3874
|
+
if (!l) return "";
|
|
3875
|
+
if (typeof l == "string") return l;
|
|
3876
|
+
if (!Array.isArray(l)) return "";
|
|
3656
3877
|
let t = "";
|
|
3657
|
-
for (const e of
|
|
3878
|
+
for (const e of l) {
|
|
3658
3879
|
if (typeof e == "string") {
|
|
3659
3880
|
t += e;
|
|
3660
3881
|
continue;
|
|
3661
3882
|
}
|
|
3662
3883
|
if (Array.isArray(e)) {
|
|
3663
|
-
typeof e[1] == "string" ? t += e[1] : typeof e[0] == "string" ? t += e[0] : t +=
|
|
3884
|
+
typeof e[1] == "string" ? t += e[1] : typeof e[0] == "string" ? t += e[0] : t += z(e);
|
|
3664
3885
|
continue;
|
|
3665
3886
|
}
|
|
3666
3887
|
e && typeof e == "object" && typeof e.text == "string" && (t += e.text);
|
|
3667
3888
|
}
|
|
3668
3889
|
return t;
|
|
3669
3890
|
}
|
|
3670
|
-
function
|
|
3671
|
-
if (!Array.isArray(
|
|
3891
|
+
function We(l) {
|
|
3892
|
+
if (!Array.isArray(l)) return [];
|
|
3672
3893
|
const t = [];
|
|
3673
|
-
for (const e of
|
|
3894
|
+
for (const e of l) {
|
|
3674
3895
|
if (Array.isArray(e)) {
|
|
3675
3896
|
t.push({
|
|
3676
3897
|
word: String(e[0] ?? ""),
|
|
@@ -3687,12 +3908,12 @@ function _e(o) {
|
|
|
3687
3908
|
}
|
|
3688
3909
|
return t.filter((e) => e.word.length > 0);
|
|
3689
3910
|
}
|
|
3690
|
-
const Ce = new URL("./nvimWorker.js", import.meta.url), we = new URL("./nvimWorkerAsyncify.js", import.meta.url);
|
|
3911
|
+
const He = new URL("data:video/mp2t;base64,aW1wb3J0IHsKICBXQVNJLAogIHdhc2ksCiAgRGlyZWN0b3J5LAogIEZpbGUsCiAgUHJlb3BlbkRpcmVjdG9yeSwKICBGZCwKICBJbm9kZSwKfSBmcm9tICJAYmpvcm4zL2Jyb3dzZXJfd2FzaV9zaGltIjsKaW1wb3J0IHsgZ3VuemlwU3luYyB9IGZyb20gImZmbGF0ZSI7CmltcG9ydCB7IERlY29kZXIgfSBmcm9tICIuL21zZ3BhY2siOwp0eXBlIFN0YXJ0TWVzc2FnZSA9IHsKICB0eXBlOiAic3RhcnQiOwogIGNvbHM/OiBudW1iZXI7CiAgcm93cz86IG51bWJlcjsKICB3YXNtUGF0aDogc3RyaW5nOwogIHJ1bnRpbWVQYXRoOiBzdHJpbmc7CiAgaW5wdXRCdWZmZXI/OiBTaGFyZWRBcnJheUJ1ZmZlciB8IG51bGw7CiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGw7CiAgZmlsZXM/OiBBcnJheTx7IHBhdGg6IHN0cmluZzsgZGF0YTogVWludDhBcnJheSB8IEFycmF5QnVmZmVyIHwgQXJyYXlMaWtlPG51bWJlcj4gfCB7IHR5cGU6ICJCdWZmZXIiOyBkYXRhOiBudW1iZXJbXSB9IH0+IHwgbnVsbDsKfTsKCnR5cGUgU3RvcE1lc3NhZ2UgPSB7IHR5cGU6ICJzdG9wIiB9OwoKdHlwZSBJbmJvdW5kTWVzc2FnZSA9IFN0YXJ0TWVzc2FnZSB8IFN0b3BNZXNzYWdlOwoKdHlwZSBEaXJOb2RlID0gRGlyZWN0b3J5ICYgeyBjb250ZW50czogTWFwPHN0cmluZywgYW55PiB9OwoKbGV0IHJwY0RlY29kZXI6IERlY29kZXIgfCBudWxsID0gbnVsbDsKbGV0IGFjdGl2ZVdhc2k6IFdBU0kgfCBudWxsID0gbnVsbDsKbGV0IGlucHV0RmQ6IFJpbmdGZCB8IG51bGwgPSBudWxsOwpjb25zdCBzdGRlcnJEZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7CmxldCBsYXN0U3RkZXJyID0gIiI7CmxldCBmYXRhbFNlbnQgPSBmYWxzZTsKbGV0IGNhY2hlZFdhc206IHsgdXJsOiBzdHJpbmc7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsID0gbnVsbDsKbGV0IGNhY2hlZFJ1bnRpbWU6IHsgdXJsOiBzdHJpbmc7IGVudHJpZXM6IFRhckVudHJ5W10gfSB8IG51bGwgPSBudWxsOwoKc2VsZi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIChldikgPT4gewogIGlmIChmYXRhbFNlbnQpIHJldHVybjsKICBmYXRhbFNlbnQgPSB0cnVlOwogIGNvbnN0IG1zZyA9IGV2Lm1lc3NhZ2UgfHwgU3RyaW5nKGV2LmVycm9yIHx8ICJ3b3JrZXIgZXJyb3IiKTsKICBjb25zdCBzdGFjayA9IChldi5lcnJvciBhcyB7IHN0YWNrPzogc3RyaW5nIH0pPy5zdGFjazsKICB0cnkgewogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAic3RhcnQtZXJyb3IiLCBtZXNzYWdlOiBzdGFjayA/IGAke21zZ31cbiR7c3RhY2t9YCA6IG1zZyB9KTsKICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogImV4aXQiLCBjb2RlOiAxLCBsYXN0U3RkZXJyIH0pOwogIH0gY2F0Y2ggKF8pIHsKICB9Cn0pOwoKc2VsZi5hZGRFdmVudExpc3RlbmVyKCJ1bmhhbmRsZWRyZWplY3Rpb24iLCAoZXYpID0+IHsKICBpZiAoZmF0YWxTZW50KSByZXR1cm47CiAgZmF0YWxTZW50ID0gdHJ1ZTsKICBjb25zdCByZWFzb24gPSBldi5yZWFzb247CiAgY29uc3QgbXNnID0gKHJlYXNvbiAmJiAocmVhc29uLm1lc3NhZ2UgfHwgU3RyaW5nKHJlYXNvbikpKSB8fCAidW5oYW5kbGVkIHJlamVjdGlvbiI7CiAgY29uc3Qgc3RhY2sgPSAocmVhc29uIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSk/LnN0YWNrOwogIHRyeSB7CiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bXNnfVxuJHtzdGFja31gIDogbXNnIH0pOwogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiZXhpdCIsIGNvZGU6IDEsIGxhc3RTdGRlcnIgfSk7CiAgfSBjYXRjaCAoXykgewogIH0KfSk7CgpzZWxmLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50PEluYm91bmRNZXNzYWdlPikgPT4gewogIGNvbnN0IHsgdHlwZSB9ID0gZXZlbnQuZGF0YSB8fCB7fTsKICBpZiAodHlwZSA9PT0gInN0YXJ0IikgewogICAgc3RhcnROdmltKGV2ZW50LmRhdGEgYXMgU3RhcnRNZXNzYWdlKS5jYXRjaCgoZXJyKSA9PiB7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInN0YXJ0LWVycm9yIiwgbWVzc2FnZTogZXJyPy5tZXNzYWdlIHx8IFN0cmluZyhlcnIpIH0pOwogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJleGl0IiwgY29kZTogMSB9KTsKICAgIH0pOwogIH0gZWxzZSBpZiAodHlwZSA9PT0gInN0b3AiKSB7CiAgICB0cnkgewogICAgICBhY3RpdmVXYXNpPy53YXNpSW1wb3J0Py5wcm9jX2V4aXQ/LigwKTsKICAgIH0gY2F0Y2ggKF8pIHsKICAgIH0KICAgIGlucHV0RmQgPSBudWxsOwogIH0KfTsKCmNsYXNzIFJpbmdGZCBleHRlbmRzIEZkIHsKICBwcml2YXRlIHJlYWRvbmx5IGN0cmw6IEludDMyQXJyYXk7CiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBVaW50OEFycmF5OwogIHByaXZhdGUgcmVhZG9ubHkgY2FwYWNpdHk6IG51bWJlcjsKCiAgY29uc3RydWN0b3IoYnVmZmVyOiBTaGFyZWRBcnJheUJ1ZmZlcikgewogICAgc3VwZXIoKTsKICAgIHRoaXMuY3RybCA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMik7CiAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheShidWZmZXIsIDgpOwogICAgdGhpcy5jYXBhY2l0eSA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgfQoKICBmZF9mZHN0YXRfZ2V0KCkgewogICAgY29uc3QgZmRzdGF0ID0gbmV3IHdhc2kuRmRzdGF0KHdhc2kuRklMRVRZUEVfUkVHVUxBUl9GSUxFLCAwKTsKICAgIGZkc3RhdC5mc19yaWdodHNfYmFzZSA9IEJpZ0ludCh3YXNpLlJJR0hUU19GRF9SRUFEIHwgd2FzaS5SSUdIVFNfRkRfV1JJVEUpOwogICAgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX1NVQ0NFU1MsIGZkc3RhdCB9OwogIH0KCiAgZmRfY2xvc2UoKSB7IHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7IH0KCiAgZmRfcmVhZChzaXplOiBudW1iZXIpIHsKICAgIGNvbnN0IG1heCA9IE1hdGgubWluKE1hdGgubWF4KDAsIE51bWJlcihzaXplKSB8fCAwKSwgdGhpcy5jYXBhY2l0eSk7CiAgICBpZiAobWF4ID09PSAwKSByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fQUdBSU4sIGRhdGE6IG5ldyBVaW50OEFycmF5KCkgfTsKICAgIGxldCBoZWFkID0gQXRvbWljcy5sb2FkKHRoaXMuY3RybCwgMCk7CiAgICBjb25zdCB0YWlsID0gQXRvbWljcy5sb2FkKHRoaXMuY3RybCwgMSk7CiAgICBpZiAoaGVhZCA9PT0gdGFpbCkgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0FHQUlOLCBkYXRhOiBuZXcgVWludDhBcnJheSgpIH07CiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShtYXgpOwogICAgbGV0IHdyaXR0ZW4gPSAwOwogICAgd2hpbGUgKGhlYWQgIT09IHRhaWwgJiYgd3JpdHRlbiA8IG1heCkgewogICAgICBvdXRbd3JpdHRlbisrXSA9IHRoaXMuZGF0YVtoZWFkXTsKICAgICAgaGVhZCA9IChoZWFkICsgMSkgJSB0aGlzLmNhcGFjaXR5OwogICAgfQogICAgQXRvbWljcy5zdG9yZSh0aGlzLmN0cmwsIDAsIGhlYWQpOwogICAgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX1NVQ0NFU1MsIGRhdGE6IG91dC5zbGljZSgwLCB3cml0dGVuKSB9OwogIH0KCiAgZmRfd3JpdGUoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBud3JpdHRlbjogMCB9OyB9CiAgZmRfc2VlaygpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIG9mZnNldDogMG4gfTsgfQogIGZkX3RlbGwoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBvZmZzZXQ6IDBuIH07IH0KICBmZF9wcmVhZCgpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIGRhdGE6IG5ldyBVaW50OEFycmF5KCkgfTsgfQogIGZkX3B3cml0ZSgpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIG53cml0dGVuOiAwIH07IH0KfQoKY2xhc3MgU2lua0ZkIGV4dGVuZHMgRmQgewogIHByaXZhdGUgcmVhZG9ubHkgb25Xcml0ZTogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHZvaWQ7CgogIGNvbnN0cnVjdG9yKG9uV3JpdGU6IChkYXRhOiBVaW50OEFycmF5KSA9PiB2b2lkKSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5vbldyaXRlID0gb25Xcml0ZTsKICB9CgogIGZkX2Zkc3RhdF9nZXQoKSB7CiAgICBjb25zdCBmZHN0YXQgPSBuZXcgd2FzaS5GZHN0YXQod2FzaS5GSUxFVFlQRV9SRUdVTEFSX0ZJTEUsIDApOwogICAgZmRzdGF0LmZzX3JpZ2h0c19iYXNlID0gQmlnSW50KHdhc2kuUklHSFRTX0ZEX1dSSVRFKTsKICAgIHJldHVybiB7IHJldDogd2FzaS5FUlJOT19TVUNDRVNTLCBmZHN0YXQgfTsKICB9CgogIGZkX3dyaXRlKGRhdGE6IFVpbnQ4QXJyYXkpIHsKICAgIHRoaXMub25Xcml0ZShuZXcgVWludDhBcnJheShkYXRhKSk7CiAgICByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fU1VDQ0VTUywgbndyaXR0ZW46IGRhdGEuYnl0ZUxlbmd0aCB9OwogIH0KCiAgZmRfY2xvc2UoKSB7IHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7IH0KfQoKYXN5bmMgZnVuY3Rpb24gc3RhcnROdmltKHsgY29scywgcm93cywgd2FzbVBhdGgsIHJ1bnRpbWVQYXRoLCBpbnB1dEJ1ZmZlciwgZW52OiBleHRyYUVudiwgZmlsZXMgfTogU3RhcnRNZXNzYWdlKSB7CiAgbGV0IGV4aXRDb2RlID0gMTsKICB0cnkgewogICAgaWYgKCFpbnB1dEJ1ZmZlcikgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6ICJpbnB1dCBidWZmZXIgbWlzc2luZyIgfSk7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogImV4aXQiLCBjb2RlOiAxIH0pOwogICAgICByZXR1cm47CiAgICB9CgogICAgcnBjRGVjb2RlciA9IG51bGw7CiAgICBpbnB1dEZkID0gbmV3IFJpbmdGZChpbnB1dEJ1ZmZlcik7CgogICAgY29uc3Qgd2FzbUJ5dGVzID0gYXdhaXQgZ2V0Q2FjaGVkV2FzbUJ5dGVzKHdhc21QYXRoKTsKICAgIGNvbnN0IHVudGFycmVkID0gYXdhaXQgZ2V0Q2FjaGVkUnVudGltZUVudHJpZXMocnVudGltZVBhdGgpOwogICAgY29uc3QgZnNSb290ID0gYnVpbGRGcyh1bnRhcnJlZCwgKCkgPT4ge30pOwogICAgaWYgKGZpbGVzICYmIEFycmF5LmlzQXJyYXkoZmlsZXMpICYmIGZpbGVzLmxlbmd0aCkgYXBwbHlFeHRyYUZpbGVzKGZzUm9vdCwgZmlsZXMpOwoKICAgIGNvbnN0IHN0ZGluRmQgPSBpbnB1dEZkITsKICAgIGNvbnN0IHN0ZG91dEZkID0gbmV3IFNpbmtGZChoYW5kbGVTdGRvdXQpOwogICAgY29uc3Qgc3RkZXJyRmQgPSBuZXcgU2lua0ZkKChkYXRhKSA9PiB7CiAgICAgIGNvbnN0IG1zZyA9IHN0ZGVyckRlY29kZXIuZGVjb2RlKGRhdGEpOwogICAgICBpZiAobXNnKSB7CiAgICAgICAgbGFzdFN0ZGVyciA9IChsYXN0U3RkZXJyICsgbXNnKS5zbGljZSgtODE5Mik7CiAgICAgIH0KICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAic3RkZXJyIiwgbWVzc2FnZTogbXNnIH0pOwogICAgfSk7CgogICAgY29uc3QgcHJlb3BlbiA9IG5ldyBSb290ZWRQcmVvcGVuRGlyZWN0b3J5KCJudmltIiwgZnNSb290LmNvbnRlbnRzKTsKICAgIGNvbnN0IHRtcERpciA9IGZzUm9vdC5jb250ZW50cy5nZXQoInRtcCIpIGFzIERpcmVjdG9yeSB8IHVuZGVmaW5lZDsKICAgIGNvbnN0IHRtcCA9IHRtcERpcj8uY29udGVudHMgfHwgbmV3IE1hcCgpOwogICAgY29uc3QgcHJlb3BlblRtcCA9IG5ldyBSb290ZWRQcmVvcGVuRGlyZWN0b3J5KCJ0bXAiLCB0bXApOwoKICAgIGNvbnN0IGFyZ3MgPSBbIm52aW0iLCAiLS1oZWFkbGVzcyIsICItLWVtYmVkIiwgIi11IiwgIk5PUkMiLCAiLS1ub3BsdWdpbiIsICItaSIsICJOT05FIiwgIi1uIl07CiAgICBjb25zdCBlbnYgPSBbCiAgICAgICJWSU1SVU5USU1FPS9udmltL3J1bnRpbWUiLAogICAgICAiSE9NRT0vbnZpbS9ob21lIiwKICAgICAgIlBXRD0vbnZpbSIsCiAgICAgICJYREdfQ09ORklHX0hPTUU9L252aW0vaG9tZS8uY29uZmlnIiwKICAgICAgIlhER19EQVRBX0hPTUU9L252aW0vaG9tZS8ubG9jYWwvc2hhcmUiLAogICAgICAiWERHX1NUQVRFX0hPTUU9L252aW0vaG9tZS8ubG9jYWwvc3RhdGUiLAogICAgICAiUEFUSD0vdXNyL2JpbjovYmluIiwKICAgICAgIlRNUERJUj0vbnZpbS90bXAiLAogICAgICBgQ09MVU1OUz0ke2NvbHMgfHwgMTIwfWAsCiAgICAgIGBMSU5FUz0ke3Jvd3MgfHwgNDB9YCwKICAgIF07CiAgICBpZiAoZXh0cmFFbnYgJiYgdHlwZW9mIGV4dHJhRW52ID09PSAib2JqZWN0IikgewogICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhleHRyYUVudikpIHsKICAgICAgICBpZiAoIWspIGNvbnRpbnVlOwogICAgICAgIGVudi5wdXNoKGAke2t9PSR7U3RyaW5nKHYgPz8gIiIpfWApOwogICAgICB9CiAgICB9CiAgICBhY3RpdmVXYXNpID0gbmV3IFdBU0koYXJncywgZW52LCBbc3RkaW5GZCwgc3Rkb3V0RmQsIHN0ZGVyckZkLCBwcmVvcGVuLCBwcmVvcGVuVG1wXSwgeyBkZWJ1ZzogZmFsc2UgfSk7CiAgICBhY3RpdmVXYXNpLmZkc1swXSA9IHN0ZGluRmQ7CiAgICBhY3RpdmVXYXNpLmZkc1sxXSA9IHN0ZG91dEZkOwogICAgYWN0aXZlV2FzaS5mZHNbMl0gPSBzdGRlcnJGZDsKICAgIGFjdGl2ZVdhc2kuZmRzWzNdID0gcHJlb3BlbjsKICAgIGFjdGl2ZVdhc2kuZmRzWzRdID0gcHJlb3BlblRtcDsKICAgIChhY3RpdmVXYXNpIGFzIHVua25vd24gYXMgeyBwcmVvcGVuczogUmVjb3JkPHN0cmluZywgUHJlb3BlbkRpcmVjdG9yeT4gfSkucHJlb3BlbnMgPSB7ICIvbnZpbSI6IHByZW9wZW4sICIvdG1wIjogcHJlb3BlblRtcCB9OwoKICAgIGNvbnN0IGVudkltcG9ydHMgPSBtYWtlRW52KCgpID0+IGFjdGl2ZVdhc2k/Lndhc2lJbXBvcnQ/LnByb2NfZXhpdD8uKDEpKTsKICAgIGNvbnN0IHdhc21JbnN0YW5jZSA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21CeXRlcywgewogICAgICB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiBhY3RpdmVXYXNpLndhc2lJbXBvcnQsCiAgICAgIGVudjogZW52SW1wb3J0cywKICAgIH0pOwogICAgY29uc3QgaW5zdGFuY2VTb3VyY2UgPSB3YXNtSW5zdGFuY2UgYXMgdW5rbm93biBhcyBXZWJBc3NlbWJseS5XZWJBc3NlbWJseUluc3RhbnRpYXRlZFNvdXJjZTsKICAgIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VTb3VyY2UuaW5zdGFuY2UKICAgICAgPz8gKHdhc21JbnN0YW5jZSBhcyB1bmtub3duIGFzIHsgaW5zdGFuY2U6IFdlYkFzc2VtYmx5Lkluc3RhbmNlIH0pLmluc3RhbmNlOwogICAgZXhpdENvZGUgPSBhY3RpdmVXYXNpLnN0YXJ0KGluc3RhbmNlIGFzIGFueSk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBjb25zdCBtZXNzYWdlID0gKGVyciBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycik7CiAgICBjb25zdCBzdGFjayA9IChlcnIgYXMgeyBzdGFjaz86IHN0cmluZyB9KT8uc3RhY2s7CiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bWVzc2FnZX1cbiR7c3RhY2t9YCA6IG1lc3NhZ2UgfSk7CiAgfQoKICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJleGl0IiwgY29kZTogZXhpdENvZGUsIGxhc3RTdGRlcnIgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldENhY2hlZFdhc21CeXRlcyh1cmw6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4gewogIGlmIChjYWNoZWRXYXNtICYmIGNhY2hlZFdhc20udXJsID09PSB1cmwgJiYgY2FjaGVkV2FzbS5ieXRlcz8uYnl0ZUxlbmd0aCkgcmV0dXJuIGNhY2hlZFdhc20uYnl0ZXM7CiAgY29uc3QgYnl0ZXMgPSBhd2FpdCBmZXRjaEJ5dGVzKHVybCk7CiAgY2FjaGVkV2FzbSA9IHsgdXJsLCBieXRlcyB9OwogIHJldHVybiBieXRlczsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkUnVudGltZUVudHJpZXModXJsOiBzdHJpbmcpOiBQcm9taXNlPFRhckVudHJ5W10+IHsKICBpZiAoY2FjaGVkUnVudGltZSAmJiBjYWNoZWRSdW50aW1lLnVybCA9PT0gdXJsICYmIGNhY2hlZFJ1bnRpbWUuZW50cmllcz8ubGVuZ3RoKSByZXR1cm4gY2FjaGVkUnVudGltZS5lbnRyaWVzOwogIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBmZXRjaEJ5dGVzKHVybCk7CiAgbGV0IHJ1bnRpbWVCeXRlczogVWludDhBcnJheTsKICBpZiAobG9va3NMaWtlR3ppcChhcmNoaXZlKSkgewogICAgdHJ5IHsKICAgICAgcnVudGltZUJ5dGVzID0gZ3VuemlwU3luYyhhcmNoaXZlKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBndW56aXAgcnVudGltZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGV9YCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJ1bnRpbWVCeXRlcyA9IGFyY2hpdmU7CiAgfQogIGxldCBlbnRyaWVzOiBUYXJFbnRyeVtdOwogIHRyeSB7CiAgICBlbnRyaWVzID0gdW50YXIocnVudGltZUJ5dGVzKTsKICB9IGNhdGNoIChlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYHVudGFyIHJ1bnRpbWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlfWApOwogIH0KICBjYWNoZWRSdW50aW1lID0geyB1cmwsIGVudHJpZXMgfTsKICByZXR1cm4gZW50cmllczsKfQoKZnVuY3Rpb24gYXBwbHlFeHRyYUZpbGVzKGZzUm9vdDogRGlyTm9kZSwgZmlsZXM6IEFycmF5PHsgcGF0aDogc3RyaW5nOyBkYXRhOiBhbnkgfT4pIHsKICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHsKICAgIGNvbnN0IHJhd1BhdGggPSBTdHJpbmcoZmlsZT8ucGF0aCA/PyAiIik7CiAgICBjb25zdCBjbGVhbiA9IHJhd1BhdGgucmVwbGFjZSgvXlwvKy8sICIiKS5yZXBsYWNlKC9eXC5cLysvLCAiIik7CiAgICBpZiAoIWNsZWFuIHx8IGNsZWFuLmVuZHNXaXRoKCIvIikpIGNvbnRpbnVlOwogICAgY29uc3QgZGF0YSA9IHRvVTgoZmlsZT8uZGF0YSk7CiAgICBpZiAoIWRhdGEpIGNvbnRpbnVlOwogICAgY29uc3QgcGFydHMgPSBjbGVhbi5zcGxpdCgiLyIpLmZpbHRlcihCb29sZWFuKTsKICAgIGlmICghcGFydHMubGVuZ3RoKSBjb250aW51ZTsKICAgIGxldCBkaXI6IERpck5vZGUgPSBmc1Jvb3Q7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkgKz0gMSkgewogICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07CiAgICAgIGlmICghZGlyLmNvbnRlbnRzLmhhcyhwYXJ0KSkgZGlyLmNvbnRlbnRzLnNldChwYXJ0LCBuZXcgRGlyZWN0b3J5KG5ldyBNYXAoKSkpOwogICAgICBkaXIgPSBkaXIuY29udGVudHMuZ2V0KHBhcnQpIGFzIERpck5vZGU7CiAgICB9CiAgICBjb25zdCBsZWFmID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07CiAgICBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBGaWxlKGRhdGEsIHsgcmVhZG9ubHk6IGZhbHNlIH0pKTsKICB9Cn0KCmZ1bmN0aW9uIHRvVTgoZGF0YTogYW55KTogVWludDhBcnJheSB8IG51bGwgewogIGlmICghZGF0YSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KCk7CiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gZGF0YTsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEpOwogIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgaWYgKGRhdGEgJiYgZGF0YS50eXBlID09PSAiQnVmZmVyIiAmJiBBcnJheS5pc0FycmF5KGRhdGEuZGF0YSkpIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmRhdGEpOwogIHRyeSB7CiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFN0cmluZyhkYXRhKSk7CiAgfSBjYXRjaCAoXykgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpmdW5jdGlvbiBoYW5kbGVTdGRvdXQoY2h1bms6IFVpbnQ4QXJyYXkpIHsKICBpZiAoIXJwY0RlY29kZXIpIHsKICAgIHJwY0RlY29kZXIgPSBuZXcgRGVjb2RlcihoYW5kbGVNZXNzYWdlKTsKICB9CiAgdHJ5IHsKICAgIHJwY0RlY29kZXIucHVzaChjaHVuayk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB2b2lkIGVycjsKICAgIHJwY0RlY29kZXIgPSBuZXcgRGVjb2RlcihoYW5kbGVNZXNzYWdlKTsKICB9Cn0KCmZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobXNnOiB1bmtub3duKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KG1zZykgfHwgbXNnLmxlbmd0aCA8IDEpIHJldHVybjsKICBjb25zdCBraW5kID0gbXNnWzBdOwogIGlmIChraW5kID09PSAwKSB7CiAgICBjb25zdCBbLCBtc2dpZCwgbWV0aG9kLCBwYXJhbXNdID0gbXNnOwogICAgaWYgKG1ldGhvZCA9PT0gIndhc20tY2xpcGJvYXJkLXBhc3RlIikgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJjbGlwYm9hcmQtcGFzdGUiLCBtc2dpZCB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInJwYy1yZXF1ZXN0IiwgbXNnaWQsIG1ldGhvZCwgcGFyYW1zIH0pOwogICAgfQogIH0gZWxzZSBpZiAoa2luZCA9PT0gMSkgewogICAgY29uc3QgWywgbXNnaWQsIGVycm9yLCByZXN1bHRdID0gbXNnOwogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAicnBjLXJlc3BvbnNlIiwgbXNnaWQsIGVycm9yLCByZXN1bHQgfSk7CiAgfSBlbHNlIGlmIChraW5kID09PSAyKSB7CiAgICBjb25zdCBbLCBtZXRob2QsIHBhcmFtc10gPSBtc2c7CiAgICBpZiAobWV0aG9kID09PSAid2FzbS1jbGlwYm9hcmQtY29weSIpIHsKICAgICAgY29uc3QgbGluZXMgPSBBcnJheS5pc0FycmF5KHBhcmFtcz8uWzBdKSA/IHBhcmFtc1swXSA6IFtdOwogICAgICBjb25zdCByZWd0eXBlID0gdHlwZW9mIHBhcmFtcz8uWzFdID09PSAic3RyaW5nIiA/IHBhcmFtc1sxXSA6ICJ2IjsKICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiY2xpcGJvYXJkLWNvcHkiLCBsaW5lcywgcmVndHlwZSB9KTsKICAgIH0gZWxzZSBpZiAoCiAgICAgIG1ldGhvZCA9PT0gIm52aW1fYnVmX2xpbmVzX2V2ZW50IgogICAgICB8fCBtZXRob2QgPT09ICJudmltX2J1Zl9kZXRhY2hfZXZlbnQiCiAgICAgIHx8IG1ldGhvZCA9PT0gInJlZHJhdyIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2N1cnNvciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX21vZGUiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm1vbmFjb19jdXJzb3JNb3ZlIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fc2Nyb2xsIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fcmV2ZWFsIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fbW92ZUN1cnNvciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX3Njcm9sbG9mZiIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2hvc3RfY29tbWFuZCIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2J1Zl9lbnRlciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2J1Zl9kZWxldGUiCiAgICApIHsKICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAicnBjLW5vdGlmeSIsIG1ldGhvZCwgcGFyYW1zIH0pOwogICAgfQogIH0KfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hCeXRlcyh1cmw6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4gewogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7CiAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgZmV0Y2ggJHt1cmx9IGZhaWxlZCAoJHtyZXMuc3RhdHVzfSlgKTsKICBjb25zdCBjdCA9IChyZXMuaGVhZGVycy5nZXQoImNvbnRlbnQtdHlwZSIpIHx8ICIiKS50b0xvd2VyQ2FzZSgpOwogIGlmIChjdC5pbmNsdWRlcygidGV4dC9odG1sIikpIHRocm93IG5ldyBFcnJvcihgZmV0Y2ggJHt1cmx9IHJldHVybmVkIEhUTUwgKGxpa2VseSB3cm9uZyBwYXRoIG9yIGRldiBzZXJ2ZXIgZmFsbGJhY2spYCk7CiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpKTsKICBpZiAoIWRhdGEuYnl0ZUxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKGBmZXRjaCAke3VybH0gcmV0dXJuZWQgZW1wdHkgYm9keWApOwogIHJldHVybiBkYXRhOwp9Cgp0eXBlIFRhckVudHJ5ID0geyBuYW1lOiBzdHJpbmc7IHR5cGU6ICJkaXIiIHwgImZpbGUiOyBkYXRhOiBVaW50OEFycmF5IH07CgpmdW5jdGlvbiBsb29rc0xpa2VHemlwKGRhdGE6IFVpbnQ4QXJyYXkpIHsKICByZXR1cm4gZGF0YSAmJiBkYXRhLmxlbmd0aCA+PSAyICYmIGRhdGFbMF0gPT09IDB4MWYgJiYgZGF0YVsxXSA9PT0gMHg4YjsKfQoKZnVuY3Rpb24gdW50YXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBUYXJFbnRyeVtdIHsKICBjb25zdCBmaWxlczogVGFyRW50cnlbXSA9IFtdOwogIGNvbnN0IGRhdGEgPSBieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBieXRlcyA6IG5ldyBVaW50OEFycmF5KGJ5dGVzKTsKICBsZXQgb2Zmc2V0ID0gMDsKICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7CiAgbGV0IHNhZmV0eSA9IDA7CgogIHdoaWxlIChvZmZzZXQgKyA1MTIgPD0gZGF0YS5sZW5ndGgpIHsKICAgIGlmIChzYWZldHkrKyA+IDEwMF8wMDApIHRocm93IG5ldyBFcnJvcigidW50YXIgc2FmZXR5IGJyZWFrIik7CiAgICBjb25zdCBuYW1lID0gZGVjb2RlVGFyU3RyaW5nKGRlY29kZXIsIGRhdGEsIG9mZnNldCwgMTAwKTsKICAgIGNvbnN0IHNpemVUZXh0ID0gZGVjb2RlVGFyU3RyaW5nKGRlY29kZXIsIGRhdGEsIG9mZnNldCArIDEyNCwgMTIpOwogICAgY29uc3QgdHlwZWZsYWcgPSBkYXRhW29mZnNldCArIDE1Nl07CiAgICBjb25zdCBwcmVmaXggPSBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlciwgZGF0YSwgb2Zmc2V0ICsgMzQ1LCAxNTUpOwogICAgaWYgKCFuYW1lICYmICFwcmVmaXgpIGJyZWFrOwogICAgY29uc3Qgc2l6ZVJhdyA9IHNpemVUZXh0LnRyaW0oKSB8fCAiMCI7CiAgICBjb25zdCBzaXplID0gcGFyc2VJbnQoc2l6ZVJhdywgOCk7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzaXplKSB8fCBzaXplIDwgMCkgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRhciBzaXplOiAke3NpemVSYXd9YCk7CiAgICBjb25zdCBmdWxsTmFtZSA9IHByZWZpeCA/IGAke3ByZWZpeH0vJHtuYW1lfWAgOiBuYW1lOwogICAgY29uc3QgYm9keVN0YXJ0ID0gb2Zmc2V0ICsgNTEyOwogICAgY29uc3QgYm9keUVuZCA9IGJvZHlTdGFydCArIHNpemU7CiAgICBjb25zdCBwYXlsb2FkID0gZGF0YS5zbGljZShib2R5U3RhcnQsIGJvZHlFbmQpOwogICAgZmlsZXMucHVzaCh7IG5hbWU6IGZ1bGxOYW1lLCB0eXBlOiB0eXBlZmxhZyA9PT0gNTMgPyAiZGlyIiA6ICJmaWxlIiwgZGF0YTogcGF5bG9hZCB9KTsKICAgIGNvbnN0IGJsb2NrcyA9IE1hdGguY2VpbChzaXplIC8gNTEyKTsKICAgIGNvbnN0IG5leHQgPSBib2R5U3RhcnQgKyBibG9ja3MgKiA1MTI7CiAgICBpZiAobmV4dCA8PSBvZmZzZXQpIHRocm93IG5ldyBFcnJvcigidGFyIHBhcnNlIGRpZCBub3QgYWR2YW5jZSIpOwogICAgb2Zmc2V0ID0gbmV4dDsKICB9CiAgcmV0dXJuIGZpbGVzOwp9CgpmdW5jdGlvbiBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlcjogVGV4dERlY29kZXIsIGRhdGE6IFVpbnQ4QXJyYXksIHN0YXJ0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHsKICBsZXQgZW5kID0gc3RhcnQ7CiAgY29uc3QgbWF4ID0gc3RhcnQgKyBsZW5ndGg7CiAgd2hpbGUgKGVuZCA8IG1heCAmJiBkYXRhW2VuZF0gIT09IDApIGVuZCArPSAxOwogIHJldHVybiBkZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KHN0YXJ0LCBlbmQpKS50cmltKCk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRnMoZW50cmllczogVGFyRW50cnlbXSwgb25Qcm9ncmVzcz86IChjb3VudDogbnVtYmVyKSA9PiB2b2lkKSB7CiAgY29uc3Qgcm9vdCA9IG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSBhcyBEaXJOb2RlOwogIGxldCBjb3VudCA9IDA7CiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICBjb25zdCBjbGVhbiA9IGVudHJ5Lm5hbWUucmVwbGFjZSgvXlwuXC8/LywgIiIpOwogICAgaWYgKCFjbGVhbikgY29udGludWU7CiAgICBjb25zdCBwYXJ0cyA9IGNsZWFuLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pOwogICAgaWYgKCFwYXJ0cy5sZW5ndGgpIGNvbnRpbnVlOwogICAgY291bnQgKz0gMTsKICAgIGlmIChvblByb2dyZXNzICYmIGNvdW50ICUgNTAwID09PSAwKSBvblByb2dyZXNzKGNvdW50KTsKCiAgICBsZXQgZGlyOiBEaXJOb2RlID0gcm9vdDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSArPSAxKSB7CiAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgaWYgKCFkaXIuY29udGVudHMuaGFzKHBhcnQpKSBkaXIuY29udGVudHMuc2V0KHBhcnQsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICAgIGRpciA9IGRpci5jb250ZW50cy5nZXQocGFydCkgYXMgRGlyTm9kZTsKICAgIH0KCiAgICBjb25zdCBsZWFmID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07CiAgICBpZiAoZW50cnkudHlwZSA9PT0gImRpciIpIHsKICAgICAgaWYgKCFkaXIuY29udGVudHMuaGFzKGxlYWYpKSBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICB9IGVsc2UgewogICAgICBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBGaWxlKGVudHJ5LmRhdGEsIHsgcmVhZG9ubHk6IHRydWUgfSkpOwogICAgfQogIH0KCiAgZW5zdXJlRGlyKHJvb3QsICJob21lIik7CiAgZW5zdXJlRGlyKHJvb3QsICJ0bXAiKTsKICBlbnN1cmVEaXIocm9vdCwgImhvbWUvLmNvbmZpZyIpOwogIGVuc3VyZURpcihyb290LCAiaG9tZS8ubG9jYWwvc2hhcmUiKTsKICBlbnN1cmVEaXIocm9vdCwgImhvbWUvLmxvY2FsL3N0YXRlIik7CgogIHJldHVybiByb290Owp9CgpmdW5jdGlvbiBlbnN1cmVEaXIocm9vdDogRGlyTm9kZSwgcGF0aDogc3RyaW5nKSB7CiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pOwogIGxldCBub2RlOiBEaXJOb2RlID0gcm9vdDsKICBmb3IgKGNvbnN0IHAgb2YgcGFydHMpIHsKICAgIGlmICghbm9kZS5jb250ZW50cy5oYXMocCkpIG5vZGUuY29udGVudHMuc2V0KHAsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICBub2RlID0gbm9kZS5jb250ZW50cy5nZXQocCkgYXMgRGlyTm9kZTsKICB9Cn0KCmZ1bmN0aW9uIG1ha2VFbnYocHJvY0V4aXQ/OiAoY29kZTogbnVtYmVyKSA9PiB2b2lkKSB7CiAgY29uc3Qgd2FzbUFueSA9IFdlYkFzc2VtYmx5IGFzIGFueTsKICBjb25zdCBjTG9uZ2ptcCA9IG5ldyB3YXNtQW55LlRhZyh7IHBhcmFtZXRlcnM6IFsiaTMyIl0sIHJlc3VsdHM6IFtdIH0pIGFzIGFueTsKICByZXR1cm4gewogICAgZmxvY2s6ICgpID0+IDAsCiAgICBnZXRwaWQ6ICgpID0+IDEsCiAgICB1dl9yYW5kb206ICgpID0+IC0zOCwKICAgIHV2X3d0ZjhfdG9fdXRmMTY6ICgpID0+IHt9LAogICAgdXZfdXRmMTZfbGVuZ3RoX2FzX3d0Zjg6ICgpID0+IDAsCiAgICB1dl91dGYxNl90b193dGY4OiAoKSA9PiAtMzgsCiAgICB1dl93dGY4X2xlbmd0aF9hc191dGYxNjogKCkgPT4gMCwKICAgIF9fd2FzbV9sb25nam1wOiAocHRyOiBudW1iZXIpID0+IHsKICAgICAgaWYgKHByb2NFeGl0KSBwcm9jRXhpdCgxKTsKICAgICAgdGhyb3cgbmV3IHdhc21BbnkuRXhjZXB0aW9uKGNMb25nam1wLCBbcHRyID8/IDBdKTsKICAgIH0sCiAgICBfX3dhc21fc2V0am1wOiAoKSA9PiAwLAogICAgX193YXNtX3NldGptcF90ZXN0OiAoKSA9PiAwLAogICAgdG1wZmlsZTogKCkgPT4gMCwKICAgIGNsb2NrOiAoKSA9PiAwLAogICAgc3lzdGVtOiAoKSA9PiAtMSwKICAgIHRtcG5hbTogKCkgPT4gMCwKICAgIF9fY19sb25nam1wOiBjTG9uZ2ptcCwKICB9IGFzIFdlYkFzc2VtYmx5Lk1vZHVsZUltcG9ydHM7Cn0KCmNsYXNzIFJvb3RlZFByZW9wZW5EaXJlY3RvcnkgZXh0ZW5kcyBQcmVvcGVuRGlyZWN0b3J5IHsKICAjc3RyaXAocGF0aDogc3RyaW5nKSB7IHJldHVybiBwYXRoLnJlcGxhY2UoL15cLysvLCAiIik7IH0KICBwYXRoX29wZW4oCiAgICBkaXJmbGFnczogbnVtYmVyLAogICAgcGF0aF9zdHI6IHN0cmluZywKICAgIG9mbGFnczogbnVtYmVyLAogICAgZnNfcmlnaHRzX2Jhc2U6IGJpZ2ludCwKICAgIGZzX3JpZ2h0c19pbmhlcml0aW5nOiBiaWdpbnQsCiAgICBmZF9mbGFnczogbnVtYmVyLAogICkgewogICAgcmV0dXJuIHN1cGVyLnBhdGhfb3BlbihkaXJmbGFncywgdGhpcy4jc3RyaXAocGF0aF9zdHIpLCBvZmxhZ3MsIGZzX3JpZ2h0c19iYXNlLCBmc19yaWdodHNfaW5oZXJpdGluZywgZmRfZmxhZ3MpOwogIH0KICBwYXRoX2ZpbGVzdGF0X2dldChmbGFnczogbnVtYmVyLCBwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX2ZpbGVzdGF0X2dldChmbGFncywgdGhpcy4jc3RyaXAocGF0aF9zdHIpKTsgfQogIHBhdGhfY3JlYXRlX2RpcmVjdG9yeShwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX2NyZWF0ZV9kaXJlY3RvcnkodGhpcy4jc3RyaXAocGF0aF9zdHIpKTsgfQogIHBhdGhfdW5saW5rX2ZpbGUocGF0aF9zdHI6IHN0cmluZykgeyByZXR1cm4gc3VwZXIucGF0aF91bmxpbmtfZmlsZSh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9yZW1vdmVfZGlyZWN0b3J5KHBhdGhfc3RyOiBzdHJpbmcpIHsgcmV0dXJuIHN1cGVyLnBhdGhfcmVtb3ZlX2RpcmVjdG9yeSh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9saW5rKHBhdGhfc3RyOiBzdHJpbmcsIGlub2RlOiBJbm9kZSwgYWxsb3dfZGlyOiBib29sZWFuKSB7IHJldHVybiBzdXBlci5wYXRoX2xpbmsodGhpcy4jc3RyaXAocGF0aF9zdHIpLCBpbm9kZSwgYWxsb3dfZGlyKTsgfQogIHBhdGhfcmVhZGxpbmsocGF0aF9zdHI6IHN0cmluZykgeyByZXR1cm4gc3VwZXIucGF0aF9yZWFkbGluayh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9zeW1saW5rKG9sZF9wYXRoOiBzdHJpbmcsIG5ld19wYXRoOiBzdHJpbmcpIHsKICAgIGNvbnN0IHRhcmdldCA9IChQcmVvcGVuRGlyZWN0b3J5LnByb3RvdHlwZSBhcyB1bmtub3duIGFzIHsgcGF0aF9zeW1saW5rPzogKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKSA9PiBudW1iZXIgfSkucGF0aF9zeW1saW5rOwogICAgaWYgKCF0YXJnZXQpIHJldHVybiB3YXNpLkVSUk5PX05PVFNVUDsKICAgIHJldHVybiB0YXJnZXQuY2FsbCh0aGlzLCB0aGlzLiNzdHJpcChvbGRfcGF0aCksIHRoaXMuI3N0cmlwKG5ld19wYXRoKSk7CiAgfQp9Cg==", import.meta.url), Ye = new URL("data:video/mp2t;base64,aW1wb3J0IHsKICBXQVNJLAogIHdhc2ksCiAgV0FTSVByb2NFeGl0LAogIERpcmVjdG9yeSwKICBGaWxlLAogIFByZW9wZW5EaXJlY3RvcnksCiAgRmQsCiAgSW5vZGUsCn0gZnJvbSAiQGJqb3JuMy9icm93c2VyX3dhc2lfc2hpbSI7CmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICJmZmxhdGUiOwppbXBvcnQgeyBEZWNvZGVyIH0gZnJvbSAiLi9tc2dwYWNrIjsKCnR5cGUgU3RhcnRNZXNzYWdlID0gewogIHR5cGU6ICJzdGFydCI7CiAgY29scz86IG51bWJlcjsKICByb3dzPzogbnVtYmVyOwogIHdhc21QYXRoOiBzdHJpbmc7CiAgcnVudGltZVBhdGg6IHN0cmluZzsKICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbDsKICBmaWxlcz86IEFycmF5PHsgcGF0aDogc3RyaW5nOyBkYXRhOiBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBBcnJheUxpa2U8bnVtYmVyPiB8IHsgdHlwZTogIkJ1ZmZlciI7IGRhdGE6IG51bWJlcltdIH0gfT4gfCBudWxsOwp9OwoKdHlwZSBTdG9wTWVzc2FnZSA9IHsgdHlwZTogInN0b3AiIH07CnR5cGUgU3RkaW5NZXNzYWdlID0geyB0eXBlOiAic3RkaW4iOyBjaHVuaz86IFVpbnQ4QXJyYXkgfCBBcnJheUJ1ZmZlciB8IEFycmF5TGlrZTxudW1iZXI+IHwgeyB0eXBlOiAiQnVmZmVyIjsgZGF0YTogbnVtYmVyW10gfSB9OwoKdHlwZSBJbmJvdW5kTWVzc2FnZSA9IFN0YXJ0TWVzc2FnZSB8IFN0b3BNZXNzYWdlIHwgU3RkaW5NZXNzYWdlOwoKdHlwZSBEaXJOb2RlID0gRGlyZWN0b3J5ICYgeyBjb250ZW50czogTWFwPHN0cmluZywgYW55PiB9OwoKbGV0IHJwY0RlY29kZXI6IERlY29kZXIgfCBudWxsID0gbnVsbDsKbGV0IGFjdGl2ZVdhc2k6IFdBU0kgfCBudWxsID0gbnVsbDsKbGV0IHN0ZGluRmQ6IE1lc3NhZ2VJbnB1dEZkIHwgbnVsbCA9IG51bGw7CmxldCB3YXNtRXhwb3J0czogYW55ID0gbnVsbDsKbGV0IHBlbmRpbmdBc3luYzogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsOwpsZXQgcGVuZGluZ1BvbGxPbmVvZmY6IHsgaW5fcHRyOiBudW1iZXI7IG5zdWJzY3JpcHRpb25zOiBudW1iZXI7IGNsb2NrRGVhZGxpbmVzOiBBcnJheTxiaWdpbnQgfCBudWxsPiB9IHwgbnVsbCA9IG51bGw7CmxldCBzdGRpbldhaXRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7CgpsZXQgYXN5bmNpZnlEYXRhUHRyID0gMDsKbGV0IGFzeW5jaWZ5U3RhY2tTdGFydCA9IDA7CmxldCBhc3luY2lmeVN0YWNrRW5kID0gMDsKCmNvbnN0IHN0ZGVyckRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTsKbGV0IGxhc3RTdGRlcnIgPSAiIjsKbGV0IGZhdGFsU2VudCA9IGZhbHNlOwpsZXQgY2FjaGVkV2FzbTogeyB1cmw6IHN0cmluZzsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGwgPSBudWxsOwpsZXQgY2FjaGVkUnVudGltZTogeyB1cmw6IHN0cmluZzsgZW50cmllczogVGFyRW50cnlbXSB9IHwgbnVsbCA9IG51bGw7CmNvbnN0IHBlbmRpbmdTdGRpbjogVWludDhBcnJheVtdID0gW107CgpzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwgKGV2KSA9PiB7CiAgaWYgKGZhdGFsU2VudCkgcmV0dXJuOwogIGZhdGFsU2VudCA9IHRydWU7CiAgY29uc3QgbXNnID0gZXYubWVzc2FnZSB8fCBTdHJpbmcoKGV2IGFzIGFueSkuZXJyb3IgfHwgIndvcmtlciBlcnJvciIpOwogIGNvbnN0IHN0YWNrID0gKGV2IGFzIGFueSkuZXJyb3I/LnN0YWNrOwogIHRyeSB7CiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bXNnfVxuJHtzdGFja31gIDogbXNnIH0pOwogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiZXhpdCIsIGNvZGU6IDEsIGxhc3RTdGRlcnIgfSk7CiAgfSBjYXRjaCAoXykgewogIH0KfSk7CgpzZWxmLmFkZEV2ZW50TGlzdGVuZXIoInVuaGFuZGxlZHJlamVjdGlvbiIsIChldikgPT4gewogIGlmIChmYXRhbFNlbnQpIHJldHVybjsKICBmYXRhbFNlbnQgPSB0cnVlOwogIGNvbnN0IHJlYXNvbjogYW55ID0gKGV2IGFzIGFueSkucmVhc29uOwogIGNvbnN0IG1zZyA9IChyZWFzb24gJiYgKHJlYXNvbi5tZXNzYWdlIHx8IFN0cmluZyhyZWFzb24pKSkgfHwgInVuaGFuZGxlZCByZWplY3Rpb24iOwogIGNvbnN0IHN0YWNrID0gcmVhc29uPy5zdGFjazsKICB0cnkgewogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAic3RhcnQtZXJyb3IiLCBtZXNzYWdlOiBzdGFjayA/IGAke21zZ31cbiR7c3RhY2t9YCA6IG1zZyB9KTsKICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogImV4aXQiLCBjb2RlOiAxLCBsYXN0U3RkZXJyIH0pOwogIH0gY2F0Y2ggKF8pIHsKICB9Cn0pOwoKc2VsZi5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudDxJbmJvdW5kTWVzc2FnZT4pID0+IHsKICBjb25zdCB7IHR5cGUgfSA9IGV2ZW50LmRhdGEgfHwgKHt9IGFzIGFueSk7CiAgaWYgKHR5cGUgPT09ICJzdGFydCIpIHsKICAgIHN0YXJ0TnZpbShldmVudC5kYXRhIGFzIFN0YXJ0TWVzc2FnZSkuY2F0Y2goKGVycikgPT4gewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IGVycj8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyKSB9KTsKICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiZXhpdCIsIGNvZGU6IDEgfSk7CiAgICB9KTsKICB9IGVsc2UgaWYgKHR5cGUgPT09ICJzdGRpbiIpIHsKICAgIGNvbnN0IGNodW5rID0gdG9VOCgoZXZlbnQuZGF0YSBhcyBTdGRpbk1lc3NhZ2UpPy5jaHVuayk7CiAgICBpZiAoIWNodW5rPy5ieXRlTGVuZ3RoKSByZXR1cm47CiAgICBpZiAoc3RkaW5GZCkgewogICAgICBzdGRpbkZkLnB1c2goY2h1bmspOwogICAgfSBlbHNlIHsKICAgICAgcGVuZGluZ1N0ZGluLnB1c2goY2h1bmspOwogICAgfQogIH0gZWxzZSBpZiAodHlwZSA9PT0gInN0b3AiKSB7CiAgICB0cnkgewogICAgICBzdGRpbkZkPy5jbG9zZSgpOwogICAgfSBjYXRjaCAoXykgewogICAgfQogICAgdHJ5IHsKICAgICAgYWN0aXZlV2FzaT8ud2FzaUltcG9ydD8ucHJvY19leGl0Py4oMCk7CiAgICB9IGNhdGNoIChfKSB7CiAgICB9CiAgICBzdGRpbkZkID0gbnVsbDsKICB9Cn07CgpjbGFzcyBNZXNzYWdlSW5wdXRGZCBleHRlbmRzIEZkIHsKICBwcml2YXRlIGNodW5rczogVWludDhBcnJheVtdID0gW107CiAgdG90YWwgPSAwOwogIHByaXZhdGUgd2FpdGVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTsKICBjbG9zZWQgPSBmYWxzZTsKCiAgZmRfZmRzdGF0X2dldCgpIHsKICAgIGNvbnN0IGZkc3RhdCA9IG5ldyB3YXNpLkZkc3RhdCh3YXNpLkZJTEVUWVBFX1JFR1VMQVJfRklMRSwgMCk7CiAgICBmZHN0YXQuZnNfcmlnaHRzX2Jhc2UgPSBCaWdJbnQod2FzaS5SSUdIVFNfRkRfUkVBRCB8IHdhc2kuUklHSFRTX0ZEX1dSSVRFKTsKICAgIHJldHVybiB7IHJldDogd2FzaS5FUlJOT19TVUNDRVNTLCBmZHN0YXQgfTsKICB9CgogIGZkX2Nsb3NlKCkgewogICAgdGhpcy5jbG9zZSgpOwogICAgcmV0dXJuIHdhc2kuRVJSTk9fU1VDQ0VTUzsKICB9CgogIGNsb3NlKCkgewogICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47CiAgICB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICBjb25zdCB3YWl0ZXJzID0gdGhpcy53YWl0ZXJzOwogICAgdGhpcy53YWl0ZXJzID0gW107CiAgICBmb3IgKGNvbnN0IHcgb2Ygd2FpdGVycykgdygpOwogIH0KCiAgcHVzaChjaHVuazogVWludDhBcnJheSkgewogICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47CiAgICBpZiAoIWNodW5rPy5ieXRlTGVuZ3RoKSByZXR1cm47CiAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTsKICAgIHRoaXMudG90YWwgKz0gY2h1bmsuYnl0ZUxlbmd0aDsKICAgIGNvbnN0IHdhaXRlcnMgPSB0aGlzLndhaXRlcnM7CiAgICB0aGlzLndhaXRlcnMgPSBbXTsKICAgIGZvciAoY29uc3QgdyBvZiB3YWl0ZXJzKSB3KCk7CiAgfQoKICB3YWl0Rm9yRGF0YSgpIHsKICAgIGlmICh0aGlzLmNsb3NlZCB8fCB0aGlzLnRvdGFsID4gMCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB0aGlzLndhaXRlcnMucHVzaChyZXNvbHZlKSk7CiAgfQoKICBmZF9yZWFkKHNpemU6IG51bWJlcikgewogICAgaWYgKHRoaXMuY2xvc2VkICYmIHRoaXMudG90YWwgPT09IDApIHJldHVybiB7IHJldDogd2FzaS5FUlJOT19TVUNDRVNTLCBkYXRhOiBuZXcgVWludDhBcnJheSgpIH07CiAgICBjb25zdCBtYXggPSBNYXRoLm1pbihNYXRoLm1heCgwLCBOdW1iZXIoc2l6ZSkgfHwgMCksIHRoaXMudG90YWwpOwogICAgaWYgKG1heCA9PT0gMCkgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0FHQUlOLCBkYXRhOiBuZXcgVWludDhBcnJheSgpIH07CiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShtYXgpOwogICAgbGV0IHdyaXR0ZW4gPSAwOwogICAgd2hpbGUgKHdyaXR0ZW4gPCBtYXggJiYgdGhpcy5jaHVua3MubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5jaHVua3NbMF07CiAgICAgIGNvbnN0IHRha2UgPSBNYXRoLm1pbihmaXJzdC5ieXRlTGVuZ3RoLCBtYXggLSB3cml0dGVuKTsKICAgICAgb3V0LnNldChmaXJzdC5zdWJhcnJheSgwLCB0YWtlKSwgd3JpdHRlbik7CiAgICAgIHdyaXR0ZW4gKz0gdGFrZTsKICAgICAgaWYgKHRha2UgPT09IGZpcnN0LmJ5dGVMZW5ndGgpIHRoaXMuY2h1bmtzLnNoaWZ0KCk7CiAgICAgIGVsc2UgdGhpcy5jaHVua3NbMF0gPSBmaXJzdC5zdWJhcnJheSh0YWtlKTsKICAgIH0KICAgIHRoaXMudG90YWwgLT0gd3JpdHRlbjsKICAgIHJldHVybiB7IHJldDogd2FzaS5FUlJOT19TVUNDRVNTLCBkYXRhOiBvdXQgfTsKICB9CgogIGZkX3dyaXRlKCkgeyByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fQkFERiwgbndyaXR0ZW46IDAgfTsgfQogIGZkX3NlZWsoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBvZmZzZXQ6IDBuIH07IH0KICBmZF90ZWxsKCkgeyByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fQkFERiwgb2Zmc2V0OiAwbiB9OyB9CiAgZmRfcHJlYWQoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBkYXRhOiBuZXcgVWludDhBcnJheSgpIH07IH0KICBmZF9wd3JpdGUoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBud3JpdHRlbjogMCB9OyB9Cn0KCmNsYXNzIFNpbmtGZCBleHRlbmRzIEZkIHsKICBwcml2YXRlIHJlYWRvbmx5IG9uV3JpdGU6IChkYXRhOiBVaW50OEFycmF5KSA9PiB2b2lkOwoKICBjb25zdHJ1Y3RvcihvbldyaXRlOiAoZGF0YTogVWludDhBcnJheSkgPT4gdm9pZCkgewogICAgc3VwZXIoKTsKICAgIHRoaXMub25Xcml0ZSA9IG9uV3JpdGU7CiAgfQoKICBmZF9mZHN0YXRfZ2V0KCkgewogICAgY29uc3QgZmRzdGF0ID0gbmV3IHdhc2kuRmRzdGF0KHdhc2kuRklMRVRZUEVfUkVHVUxBUl9GSUxFLCAwKTsKICAgIGZkc3RhdC5mc19yaWdodHNfYmFzZSA9IEJpZ0ludCh3YXNpLlJJR0hUU19GRF9XUklURSk7CiAgICByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fU1VDQ0VTUywgZmRzdGF0IH07CiAgfQoKICBmZF93cml0ZShkYXRhOiBVaW50OEFycmF5KSB7CiAgICB0aGlzLm9uV3JpdGUobmV3IFVpbnQ4QXJyYXkoZGF0YSkpOwogICAgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX1NVQ0NFU1MsIG53cml0dGVuOiBkYXRhLmJ5dGVMZW5ndGggfTsKICB9CgogIGZkX2Nsb3NlKCkgeyByZXR1cm4gd2FzaS5FUlJOT19TVUNDRVNTOyB9Cn0KCmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TnZpbSh7IGNvbHMsIHJvd3MsIHdhc21QYXRoLCBydW50aW1lUGF0aCwgZW52OiBleHRyYUVudiwgZmlsZXMgfTogU3RhcnRNZXNzYWdlKSB7CiAgbGV0IGV4aXRDb2RlID0gMTsKICB0cnkgewogICAgcnBjRGVjb2RlciA9IG51bGw7CiAgICBzdGRpbldhaXRQcm9taXNlID0gbnVsbDsKICAgIHBlbmRpbmdBc3luYyA9IG51bGw7CiAgICBwZW5kaW5nUG9sbE9uZW9mZiA9IG51bGw7CiAgICB3YXNtRXhwb3J0cyA9IG51bGw7CgogICAgc3RkaW5GZCA9IG5ldyBNZXNzYWdlSW5wdXRGZCgpOwogICAgd2hpbGUgKHBlbmRpbmdTdGRpbi5sZW5ndGgpIHN0ZGluRmQucHVzaChwZW5kaW5nU3RkaW4uc2hpZnQoKSEpOwoKICAgIGNvbnN0IHdhc21CeXRlcyA9IGF3YWl0IGdldENhY2hlZFdhc21CeXRlcyh3YXNtUGF0aCk7CiAgICBjb25zdCB1bnRhcnJlZCA9IGF3YWl0IGdldENhY2hlZFJ1bnRpbWVFbnRyaWVzKHJ1bnRpbWVQYXRoKTsKICAgIGNvbnN0IGZzUm9vdCA9IGJ1aWxkRnModW50YXJyZWQsICgpID0+IHt9KTsKICAgIGlmIChmaWxlcyAmJiBBcnJheS5pc0FycmF5KGZpbGVzKSAmJiBmaWxlcy5sZW5ndGgpIGFwcGx5RXh0cmFGaWxlcyhmc1Jvb3QsIGZpbGVzKTsKCiAgICBjb25zdCBzdGRvdXRGZCA9IG5ldyBTaW5rRmQoaGFuZGxlU3Rkb3V0KTsKICAgIGNvbnN0IHN0ZGVyckZkID0gbmV3IFNpbmtGZCgoZGF0YSkgPT4gewogICAgICBjb25zdCBtc2cgPSBzdGRlcnJEZWNvZGVyLmRlY29kZShkYXRhKTsKICAgICAgaWYgKG1zZykgbGFzdFN0ZGVyciA9IChsYXN0U3RkZXJyICsgbXNnKS5zbGljZSgtODE5Mik7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInN0ZGVyciIsIG1lc3NhZ2U6IG1zZyB9KTsKICAgIH0pOwoKICAgIGNvbnN0IHByZW9wZW4gPSBuZXcgUm9vdGVkUHJlb3BlbkRpcmVjdG9yeSgibnZpbSIsIGZzUm9vdC5jb250ZW50cyk7CiAgICBjb25zdCB0bXBEaXIgPSBmc1Jvb3QuY29udGVudHMuZ2V0KCJ0bXAiKSBhcyBEaXJlY3RvcnkgfCB1bmRlZmluZWQ7CiAgICBjb25zdCB0bXAgPSB0bXBEaXI/LmNvbnRlbnRzIHx8IG5ldyBNYXAoKTsKICAgIGNvbnN0IHByZW9wZW5UbXAgPSBuZXcgUm9vdGVkUHJlb3BlbkRpcmVjdG9yeSgidG1wIiwgdG1wKTsKCiAgICBjb25zdCBhcmdzID0gWyJudmltIiwgIi0taGVhZGxlc3MiLCAiLS1lbWJlZCIsICItdSIsICJOT1JDIiwgIi0tbm9wbHVnaW4iLCAiLWkiLCAiTk9ORSIsICItbiJdOwogICAgY29uc3QgZW52ID0gWwogICAgICAiVklNUlVOVElNRT0vbnZpbS9ydW50aW1lIiwKICAgICAgIkhPTUU9L252aW0vaG9tZSIsCiAgICAgICJQV0Q9L252aW0iLAogICAgICAiWERHX0NPTkZJR19IT01FPS9udmltL2hvbWUvLmNvbmZpZyIsCiAgICAgICJYREdfREFUQV9IT01FPS9udmltL2hvbWUvLmxvY2FsL3NoYXJlIiwKICAgICAgIlhER19TVEFURV9IT01FPS9udmltL2hvbWUvLmxvY2FsL3N0YXRlIiwKICAgICAgIlBBVEg9L3Vzci9iaW46L2JpbiIsCiAgICAgICJUTVBESVI9L252aW0vdG1wIiwKICAgICAgYENPTFVNTlM9JHtjb2xzIHx8IDEyMH1gLAogICAgICBgTElORVM9JHtyb3dzIHx8IDQwfWAsCiAgICBdOwogICAgaWYgKGV4dHJhRW52ICYmIHR5cGVvZiBleHRyYUVudiA9PT0gIm9iamVjdCIpIHsKICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZXh0cmFFbnYpKSB7CiAgICAgICAgaWYgKCFrKSBjb250aW51ZTsKICAgICAgICBlbnYucHVzaChgJHtrfT0ke1N0cmluZyh2ID8/ICIiKX1gKTsKICAgICAgfQogICAgfQoKICAgIGFjdGl2ZVdhc2kgPSBuZXcgV0FTSShhcmdzLCBlbnYsIFtzdGRpbkZkLCBzdGRvdXRGZCwgc3RkZXJyRmQsIHByZW9wZW4sIHByZW9wZW5UbXBdLCB7IGRlYnVnOiBmYWxzZSB9KTsKICAgIGFjdGl2ZVdhc2kuZmRzWzBdID0gc3RkaW5GZDsKICAgIGFjdGl2ZVdhc2kuZmRzWzFdID0gc3Rkb3V0RmQ7CiAgICBhY3RpdmVXYXNpLmZkc1syXSA9IHN0ZGVyckZkOwogICAgYWN0aXZlV2FzaS5mZHNbM10gPSBwcmVvcGVuOwogICAgYWN0aXZlV2FzaS5mZHNbNF0gPSBwcmVvcGVuVG1wOwogICAgKGFjdGl2ZVdhc2kgYXMgdW5rbm93biBhcyB7IHByZW9wZW5zOiBSZWNvcmQ8c3RyaW5nLCBQcmVvcGVuRGlyZWN0b3J5PiB9KS5wcmVvcGVucyA9IHsgIi9udmltIjogcHJlb3BlbiwgIi90bXAiOiBwcmVvcGVuVG1wIH07CgogICAgY29uc3QgZW52SW1wb3J0cyA9IG1ha2VFbnYoKCkgPT4gYWN0aXZlV2FzaT8ud2FzaUltcG9ydD8ucHJvY19leGl0Py4oMSkpOwogICAgY29uc3Qgd2FzaUltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLmFjdGl2ZVdhc2kud2FzaUltcG9ydCB9OwoKICAgIC8vIEtlZXAgZmRfcmVhZCBub24tYmxvY2tpbmcgKEVSUk5PX0FHQUlOKSBhbmQgb25seSBhc3luY2lmeSBwb2xsX29uZW9mZi4KICAgIHdhc2lJbXBvcnRzLmZkX3JlYWQgPSBhY3RpdmVXYXNpLndhc2lJbXBvcnQuZmRfcmVhZDsKICAgIHdhc2lJbXBvcnRzLnBvbGxfb25lb2ZmID0gKGluX3B0cjogbnVtYmVyLCBvdXRfcHRyOiBudW1iZXIsIG5zdWJzY3JpcHRpb25zOiBudW1iZXIsIG5ldmVudHNfcHRyOiBudW1iZXIpID0+ICgKICAgICAgcG9sbE9uZW9mZkFzeW5jaWZpZWQoaW5fcHRyLCBvdXRfcHRyLCBuc3Vic2NyaXB0aW9ucywgbmV2ZW50c19wdHIpCiAgICApOwoKICAgIGNvbnN0IHdhc21JbnN0YW5jZSA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21CeXRlcywgewogICAgICB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiB3YXNpSW1wb3J0cywKICAgICAgZW52OiBlbnZJbXBvcnRzLAogICAgfSk7CiAgICBjb25zdCBpbnN0YW5jZVNvdXJjZSA9IHdhc21JbnN0YW5jZSBhcyB1bmtub3duIGFzIFdlYkFzc2VtYmx5LldlYkFzc2VtYmx5SW5zdGFudGlhdGVkU291cmNlOwogICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZVNvdXJjZS5pbnN0YW5jZQogICAgICA/PyAod2FzbUluc3RhbmNlIGFzIHVua25vd24gYXMgeyBpbnN0YW5jZTogV2ViQXNzZW1ibHkuSW5zdGFuY2UgfSkuaW5zdGFuY2U7CgogICAgd2FzbUV4cG9ydHMgPSAoaW5zdGFuY2UgYXMgYW55KS5leHBvcnRzOwogICAgaW5pdEFzeW5jaWZ5KHdhc21FeHBvcnRzKTsKICAgIChhY3RpdmVXYXNpIGFzIGFueSkuaW5zdCA9IGluc3RhbmNlOwoKICAgIGV4aXRDb2RlID0gYXdhaXQgcnVuQXN5bmNpZmllZFN0YXJ0KHdhc21FeHBvcnRzKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIGlmIChlcnIgaW5zdGFuY2VvZiBXQVNJUHJvY0V4aXQpIHsKICAgICAgZXhpdENvZGUgPSBlcnIuY29kZTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAoZXJyIGFzIHsgbWVzc2FnZT86IHN0cmluZyB9KT8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyKTsKICAgICAgY29uc3Qgc3RhY2sgPSAoZXJyIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSk/LnN0YWNrOwogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bWVzc2FnZX1cbiR7c3RhY2t9YCA6IG1lc3NhZ2UgfSk7CiAgICB9CiAgfQoKICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJleGl0IiwgY29kZTogZXhpdENvZGUsIGxhc3RTdGRlcnIgfSk7Cn0KCmZ1bmN0aW9uIHBvbGxPbmVvZmZBc3luY2lmaWVkKGluX3B0cjogbnVtYmVyLCBvdXRfcHRyOiBudW1iZXIsIG5zdWJzY3JpcHRpb25zOiBudW1iZXIsIG5ldmVudHNfcHRyOiBudW1iZXIpOiBudW1iZXIgewogIGlmICghd2FzbUV4cG9ydHM/Lm1lbW9yeSkgcmV0dXJuIHdhc2kuRVJSTk9fRkFVTFQ7CiAgY29uc3QgbnMgPSBOdW1iZXIobnN1YnNjcmlwdGlvbnMpID4+PiAwOwogIGlmIChucyA9PT0gMCkgcmV0dXJuIHdhc2kuRVJSTk9fSU5WQUw7CgogIGNvbnN0IHN0YXRlID0gd2FzbUV4cG9ydHM/LmFzeW5jaWZ5X2dldF9zdGF0ZT8uKCkgPz8gMDsKICBpZiAoc3RhdGUgPT09IDAgJiYgcGVuZGluZ1BvbGxPbmVvZmYpIHBlbmRpbmdQb2xsT25lb2ZmID0gbnVsbDsKCiAgY29uc3QgYnVmZmVyID0gbmV3IERhdGFWaWV3KHdhc21FeHBvcnRzLm1lbW9yeS5idWZmZXIpOwogIGNvbnN0IHN1YlNpemUgPSA0ODsKICBjb25zdCBldmVudFNpemUgPSAzMjsKCiAgY29uc3Qgbm93TnMgPSAoKSA9PiBCaWdJbnQoTWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSAqIDFlNikpOwogIGNvbnN0IG5vd1JlYWxOcyA9ICgpID0+IEJpZ0ludChEYXRlLm5vdygpKSAqIDEwMDAwMDBuOwoKICBsZXQgbmVlZFN0ZGluID0gZmFsc2U7CiAgbGV0IG5leHREZWx0YU5zOiBiaWdpbnQgfCBudWxsID0gbnVsbDsKICBjb25zdCByZWFkeTogQXJyYXk8eyB1c2VyZGF0YTogYmlnaW50OyBldmVudHR5cGU6IG51bWJlciB9PiA9IFtdOwogIGNvbnN0IGNsb2NrRGVhZGxpbmVzOiBBcnJheTxiaWdpbnQgfCBudWxsPiA9IG5ldyBBcnJheShucykuZmlsbChudWxsKTsKCiAgY29uc3QgdXNlUGVuZGluZyA9IHN0YXRlID09PSAyCiAgICAmJiBwZW5kaW5nUG9sbE9uZW9mZgogICAgJiYgcGVuZGluZ1BvbGxPbmVvZmYuaW5fcHRyID09PSAoaW5fcHRyID4+PiAwKQogICAgJiYgcGVuZGluZ1BvbGxPbmVvZmYubnN1YnNjcmlwdGlvbnMgPT09IG5zOwoKICBmb3IgKGxldCBpID0gMDsgaSA8IG5zOyBpICs9IDEpIHsKICAgIGNvbnN0IGJhc2UgPSAoaW5fcHRyICsgaSAqIHN1YlNpemUpID4+PiAwOwogICAgY29uc3QgdXNlcmRhdGEgPSBidWZmZXIuZ2V0QmlnVWludDY0KGJhc2UsIHRydWUpOwogICAgY29uc3QgZXZlbnR0eXBlID0gYnVmZmVyLmdldFVpbnQ4KGJhc2UgKyA4KTsKCiAgICBpZiAoZXZlbnR0eXBlID09PSB3YXNpLkVWRU5UVFlQRV9GRF9SRUFEIHx8IGV2ZW50dHlwZSA9PT0gd2FzaS5FVkVOVFRZUEVfRkRfV1JJVEUpIHsKICAgICAgY29uc3QgZmQgPSBidWZmZXIuZ2V0VWludDMyKGJhc2UgKyAxNiwgdHJ1ZSk7CgogICAgICBpZiAoZXZlbnR0eXBlID09PSB3YXNpLkVWRU5UVFlQRV9GRF9XUklURSkgewogICAgICAgIHJlYWR5LnB1c2goeyB1c2VyZGF0YSwgZXZlbnR0eXBlIH0pOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBpZiAoZmQgPT09IDApIHsKICAgICAgICBjb25zdCBzdGRpblJlYWR5ID0gQm9vbGVhbihzdGRpbkZkICYmIChzdGRpbkZkLnRvdGFsID4gMCB8fCBzdGRpbkZkLmNsb3NlZCkpOwogICAgICAgIGlmIChzdGRpblJlYWR5KSByZWFkeS5wdXNoKHsgdXNlcmRhdGEsIGV2ZW50dHlwZSB9KTsKICAgICAgICBlbHNlIG5lZWRTdGRpbiA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8vIEZvciBub24tc3RkaW4gZmRzLCBhc3N1bWUgcmVhZGFiaWxpdHkuIE5lb3ZpbStsaWJ1diB1c2VzIHBvbGxfb25lb2ZmCiAgICAgIC8vIGZvciB2YXJpb3VzIGludGVybmFsIGhhbmRsZXM7IHJldHVybmluZyBOT1RTVVAgY2FuIHN0YWxsIHRoZSBsb29wLgogICAgICByZWFkeS5wdXNoKHsgdXNlcmRhdGEsIGV2ZW50dHlwZSB9KTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKGV2ZW50dHlwZSA9PT0gd2FzaS5FVkVOVFRZUEVfQ0xPQ0spIHsKICAgICAgY29uc3QgY2xvY2tpZCA9IGJ1ZmZlci5nZXRVaW50MzIoYmFzZSArIDE2LCB0cnVlKTsKICAgICAgY29uc3QgdGltZW91dCA9IGJ1ZmZlci5nZXRCaWdVaW50NjQoYmFzZSArIDI0LCB0cnVlKTsKICAgICAgY29uc3QgZmxhZ3MgPSBidWZmZXIuZ2V0VWludDE2KGJhc2UgKyAzNiwgdHJ1ZSk7CiAgICAgIGNvbnN0IGdldE5vdyA9IGNsb2NraWQgPT09IHdhc2kuQ0xPQ0tJRF9NT05PVE9OSUMKICAgICAgICA/IG5vd05zCiAgICAgICAgOiAoY2xvY2tpZCA9PT0gd2FzaS5DTE9DS0lEX1JFQUxUSU1FID8gbm93UmVhbE5zIDogbnVsbCk7CiAgICAgIGlmICghZ2V0Tm93KSByZXR1cm4gd2FzaS5FUlJOT19JTlZBTDsKCiAgICAgIGNvbnN0IG5vdyA9IGdldE5vdygpOwogICAgICBjb25zdCBpc0FicyA9IChmbGFncyAmIHdhc2kuU1VCQ0xPQ0tGTEFHU19TVUJTQ1JJUFRJT05fQ0xPQ0tfQUJTVElNRSkgIT09IDA7CiAgICAgIGNvbnN0IGVuZFRpbWUgPSB1c2VQZW5kaW5nICYmIHBlbmRpbmdQb2xsT25lb2ZmPy5jbG9ja0RlYWRsaW5lcz8uW2ldICE9IG51bGwKICAgICAgICA/IEJpZ0ludChwZW5kaW5nUG9sbE9uZW9mZiEuY2xvY2tEZWFkbGluZXNbaV0hKQogICAgICAgIDogKGlzQWJzID8gdGltZW91dCA6IChub3cgKyB0aW1lb3V0KSk7CiAgICAgIGNsb2NrRGVhZGxpbmVzW2ldID0gZW5kVGltZTsKICAgICAgaWYgKGVuZFRpbWUgPD0gbm93KSB7CiAgICAgICAgcmVhZHkucHVzaCh7IHVzZXJkYXRhLCBldmVudHR5cGUgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgZGVsdGEgPSBlbmRUaW1lIC0gbm93OwogICAgICAgIGlmIChuZXh0RGVsdGFOcyA9PT0gbnVsbCB8fCBkZWx0YSA8IG5leHREZWx0YU5zKSBuZXh0RGVsdGFOcyA9IGRlbHRhOwogICAgICB9CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIHJldHVybiB3YXNpLkVSUk5PX05PVFNVUDsKICB9CgogIGlmIChyZWFkeS5sZW5ndGggPiAwKSB7CiAgICBpZiAoc3RhdGUgPT09IDIpIHN0b3BSZXdpbmRJZk5lZWRlZCgpOwogICAgcGVuZGluZ1BvbGxPbmVvZmYgPSBudWxsOwogICAgY29uc3Qgb3V0ID0gbmV3IERhdGFWaWV3KHdhc21FeHBvcnRzLm1lbW9yeS5idWZmZXIpOwogICAgY29uc3QgY291bnQgPSBNYXRoLm1pbihyZWFkeS5sZW5ndGgsIG5zKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMSkgewogICAgICBjb25zdCBldiA9IHJlYWR5W2ldOwogICAgICBjb25zdCBldmVudCA9IG5ldyAod2FzaSBhcyBhbnkpLkV2ZW50KGV2LnVzZXJkYXRhLCB3YXNpLkVSUk5PX1NVQ0NFU1MsIGV2LmV2ZW50dHlwZSk7CiAgICAgIGV2ZW50LndyaXRlX2J5dGVzKG91dCBhcyBhbnksIChvdXRfcHRyICsgaSAqIGV2ZW50U2l6ZSkgPj4+IDApOwogICAgfQogICAgaWYgKHR5cGVvZiBuZXZlbnRzX3B0ciA9PT0gIm51bWJlciIpIG91dC5zZXRVaW50MzIobmV2ZW50c19wdHIsIGNvdW50LCB0cnVlKTsKICAgIHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7CiAgfQoKICBjb25zdCB3YWl0czogQXJyYXk8UHJvbWlzZTx2b2lkPj4gPSBbXTsKICBjb25zdCBjYW5XYWtlT25TdGRpbiA9IEJvb2xlYW4oc3RkaW5GZCAmJiAhc3RkaW5GZC5jbG9zZWQgJiYgc3RkaW5GZC50b3RhbCA9PT0gMCk7CiAgaWYgKChuZWVkU3RkaW4gfHwgY2FuV2FrZU9uU3RkaW4pICYmIHN0ZGluRmQgJiYgIXN0ZGluRmQuY2xvc2VkKSB3YWl0cy5wdXNoKGdldFN0ZGluV2FpdFByb21pc2UoKSk7CiAgaWYgKG5leHREZWx0YU5zICE9PSBudWxsKSB7CiAgICBjb25zdCBtYXhXYWl0TXMgPSA1MDsKICAgIGNvbnN0IHJhdyA9IE51bWJlcihuZXh0RGVsdGFOcyAvIDEwMDAwMDBuKTsKICAgIGNvbnN0IG1zID0gTnVtYmVyLmlzRmluaXRlKHJhdykgJiYgcmF3ID4gMCA/IHJhdyA6IDA7CiAgICB3YWl0cy5wdXNoKG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIE1hdGgubWluKG1zLCBtYXhXYWl0TXMpKSkpOwogIH0KCiAgaWYgKHdhaXRzLmxlbmd0aCA9PT0gMCkgewogICAgaWYgKHR5cGVvZiBuZXZlbnRzX3B0ciA9PT0gIm51bWJlciIpIGJ1ZmZlci5zZXRVaW50MzIobmV2ZW50c19wdHIsIDAsIHRydWUpOwogICAgcmV0dXJuIHdhc2kuRVJSTk9fU1VDQ0VTUzsKICB9CgogIGlmIChzdGF0ZSA9PT0gMikgc3RvcFJld2luZElmTmVlZGVkKCk7CiAgaWYgKHN0YXRlID09PSAwIHx8IHN0YXRlID09PSAyKSB7CiAgICBwZW5kaW5nUG9sbE9uZW9mZiA9IHsgaW5fcHRyOiAoaW5fcHRyID4+PiAwKSwgbnN1YnNjcmlwdGlvbnM6IG5zLCBjbG9ja0RlYWRsaW5lcyB9OwogICAgc3RhcnRVbndpbmQod2FpdHMubGVuZ3RoID09PSAxID8gd2FpdHNbMF0gOiBQcm9taXNlLnJhY2Uod2FpdHMpKTsKICAgIGlmICh0eXBlb2YgbmV2ZW50c19wdHIgPT09ICJudW1iZXIiKSBuZXcgRGF0YVZpZXcod2FzbUV4cG9ydHMubWVtb3J5LmJ1ZmZlcikuc2V0VWludDMyKG5ldmVudHNfcHRyLCAwLCB0cnVlKTsKICAgIHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7CiAgfQoKICBpZiAodHlwZW9mIG5ldmVudHNfcHRyID09PSAibnVtYmVyIikgYnVmZmVyLnNldFVpbnQzMihuZXZlbnRzX3B0ciwgMCwgdHJ1ZSk7CiAgcmV0dXJuIHdhc2kuRVJSTk9fU1VDQ0VTUzsKfQoKZnVuY3Rpb24gZ2V0U3RkaW5XYWl0UHJvbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHsKICBpZiAoIXN0ZGluRmQgfHwgc3RkaW5GZC5jbG9zZWQgfHwgc3RkaW5GZC50b3RhbCA+IDApIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICBpZiAoIXN0ZGluV2FpdFByb21pc2UpIHsKICAgIHN0ZGluV2FpdFByb21pc2UgPSBzdGRpbkZkLndhaXRGb3JEYXRhKCkuZmluYWxseSgoKSA9PiB7IHN0ZGluV2FpdFByb21pc2UgPSBudWxsOyB9KTsKICB9CiAgcmV0dXJuIHN0ZGluV2FpdFByb21pc2U7Cn0KCmZ1bmN0aW9uIGluaXRBc3luY2lmeShleHBvcnRzOiBhbnkpIHsKICBpZiAoIWV4cG9ydHM/Lm1lbW9yeSkgdGhyb3cgbmV3IEVycm9yKCJhc3luY2lmeTogbWlzc2luZyBleHBvcnRlZCBtZW1vcnkiKTsKICBpZiAodHlwZW9mIGV4cG9ydHMuYXN5bmNpZnlfc3RhcnRfdW53aW5kICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImFzeW5jaWZ5OiBtaXNzaW5nIGV4cG9ydHMiKTsKCiAgaWYgKAogICAgdHlwZW9mIGV4cG9ydHMubnZpbV9hc3luY2lmeV9nZXRfZGF0YV9wdHIgPT09ICJmdW5jdGlvbiIKICAgICYmIHR5cGVvZiBleHBvcnRzLm52aW1fYXN5bmNpZnlfZ2V0X3N0YWNrX3N0YXJ0ID09PSAiZnVuY3Rpb24iCiAgICAmJiB0eXBlb2YgZXhwb3J0cy5udmltX2FzeW5jaWZ5X2dldF9zdGFja19lbmQgPT09ICJmdW5jdGlvbiIKICApIHsKICAgIGFzeW5jaWZ5RGF0YVB0ciA9IGV4cG9ydHMubnZpbV9hc3luY2lmeV9nZXRfZGF0YV9wdHIoKSA+Pj4gMDsKICAgIGFzeW5jaWZ5U3RhY2tTdGFydCA9IGV4cG9ydHMubnZpbV9hc3luY2lmeV9nZXRfc3RhY2tfc3RhcnQoKSA+Pj4gMDsKICAgIGFzeW5jaWZ5U3RhY2tFbmQgPSBleHBvcnRzLm52aW1fYXN5bmNpZnlfZ2V0X3N0YWNrX2VuZCgpID4+PiAwOwogICAgcmVzZXRBc3luY2lmeURhdGEoKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IHN0YWNrU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CiAgY29uc3QgcGFnZVNpemUgPSA2NTUzNjsKICBjb25zdCBleHRyYSA9IHN0YWNrU2l6ZSArIDY0OwogIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKGV4dHJhIC8gcGFnZVNpemUpOwogIGV4cG9ydHMubWVtb3J5Lmdyb3cocGFnZXMpOwoKICBjb25zdCBlbmQgPSBleHBvcnRzLm1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCA+Pj4gMDsKICBhc3luY2lmeVN0YWNrRW5kID0gZW5kOwogIGNvbnN0IHJhd1N0YWNrU3RhcnQgPSAoZW5kIC0gc3RhY2tTaXplKSA+Pj4gMDsKICBhc3luY2lmeURhdGFQdHIgPSAoKHJhd1N0YWNrU3RhcnQgLSA4KSAmIH4weDcpID4+PiAwOwogIGFzeW5jaWZ5U3RhY2tTdGFydCA9IChhc3luY2lmeURhdGFQdHIgKyA4KSA+Pj4gMDsKICByZXNldEFzeW5jaWZ5RGF0YSgpOwp9CgpmdW5jdGlvbiByZXNldEFzeW5jaWZ5RGF0YSgpIHsKICBpZiAoIXdhc21FeHBvcnRzPy5tZW1vcnkpIHJldHVybjsKICBpZiAoIWFzeW5jaWZ5RGF0YVB0ciB8fCAhYXN5bmNpZnlTdGFja1N0YXJ0IHx8ICFhc3luY2lmeVN0YWNrRW5kKSByZXR1cm47CiAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyh3YXNtRXhwb3J0cy5tZW1vcnkuYnVmZmVyKTsKICB2aWV3LnNldEludDMyKGFzeW5jaWZ5RGF0YVB0ciwgYXN5bmNpZnlTdGFja1N0YXJ0LCB0cnVlKTsKICB2aWV3LnNldEludDMyKGFzeW5jaWZ5RGF0YVB0ciArIDQsIGFzeW5jaWZ5U3RhY2tFbmQsIHRydWUpOwp9CgpmdW5jdGlvbiBzdGFydFVud2luZChwcm9taXNlOiBQcm9taXNlPHZvaWQ+KSB7CiAgaWYgKCF3YXNtRXhwb3J0cyB8fCAhYXN5bmNpZnlEYXRhUHRyKSB0aHJvdyBuZXcgRXJyb3IoImFzeW5jaWZ5OiBub3QgaW5pdGlhbGl6ZWQiKTsKICBpZiAocGVuZGluZ0FzeW5jKSB0aHJvdyBuZXcgRXJyb3IoImFzeW5jaWZ5OiBvdmVybGFwcGluZyBhc3luYyBvcGVyYXRpb24iKTsKICByZXNldEFzeW5jaWZ5RGF0YSgpOwogIHBlbmRpbmdBc3luYyA9IHByb21pc2U7CiAgd2FzbUV4cG9ydHMuYXN5bmNpZnlfc3RhcnRfdW53aW5kKGFzeW5jaWZ5RGF0YVB0cik7Cn0KCmZ1bmN0aW9uIHN0b3BSZXdpbmRJZk5lZWRlZCgpIHsKICBpZiAoIXdhc21FeHBvcnRzPy5hc3luY2lmeV9nZXRfc3RhdGUgfHwgIXdhc21FeHBvcnRzPy5hc3luY2lmeV9zdG9wX3Jld2luZCkgcmV0dXJuOwogIGlmICh3YXNtRXhwb3J0cy5hc3luY2lmeV9nZXRfc3RhdGUoKSA9PT0gMikgewogICAgd2FzbUV4cG9ydHMuYXN5bmNpZnlfc3RvcF9yZXdpbmQoKTsKICAgIHJlc2V0QXN5bmNpZnlEYXRhKCk7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBydW5Bc3luY2lmaWVkU3RhcnQoZXhwb3J0czogYW55KTogUHJvbWlzZTxudW1iZXI+IHsKICB3aGlsZSAodHJ1ZSkgewogICAgdHJ5IHsKICAgICAgZXhwb3J0cy5fc3RhcnQoKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBpZiAoZXJyIGluc3RhbmNlb2YgV0FTSVByb2NFeGl0KSByZXR1cm4gZXJyLmNvZGU7CiAgICAgIHRocm93IGVycjsKICAgIH0KCiAgICBjb25zdCBzdGF0ZSA9IGV4cG9ydHMuYXN5bmNpZnlfZ2V0X3N0YXRlKCk7CiAgICBpZiAoc3RhdGUgPT09IDApIHJldHVybiAwOwogICAgaWYgKHN0YXRlID09PSAyKSB7CiAgICAgIGV4cG9ydHMuYXN5bmNpZnlfc3RvcF9yZXdpbmQoKTsKICAgICAgcmVzZXRBc3luY2lmeURhdGEoKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoc3RhdGUgIT09IDEpIHRocm93IG5ldyBFcnJvcihgYXN5bmNpZnk6IHVuZXhwZWN0ZWQgc3RhdGUgJHtzdGF0ZX1gKTsKCiAgICBleHBvcnRzLmFzeW5jaWZ5X3N0b3BfdW53aW5kKCk7CiAgICBjb25zdCB3YWl0ID0gcGVuZGluZ0FzeW5jOwogICAgcGVuZGluZ0FzeW5jID0gbnVsbDsKICAgIGlmICghd2FpdCkgdGhyb3cgbmV3IEVycm9yKCJhc3luY2lmeTogbWlzc2luZyBwZW5kaW5nIHByb21pc2UiKTsKICAgIGF3YWl0IHdhaXQ7CiAgICBleHBvcnRzLmFzeW5jaWZ5X3N0YXJ0X3Jld2luZChhc3luY2lmeURhdGFQdHIpOwogIH0KfQoKYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkV2FzbUJ5dGVzKHVybDogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7CiAgaWYgKGNhY2hlZFdhc20gJiYgY2FjaGVkV2FzbS51cmwgPT09IHVybCAmJiBjYWNoZWRXYXNtLmJ5dGVzPy5ieXRlTGVuZ3RoKSByZXR1cm4gY2FjaGVkV2FzbS5ieXRlczsKICBjb25zdCBieXRlcyA9IGF3YWl0IGZldGNoQnl0ZXModXJsKTsKICBjYWNoZWRXYXNtID0geyB1cmwsIGJ5dGVzIH07CiAgcmV0dXJuIGJ5dGVzOwp9Cgphc3luYyBmdW5jdGlvbiBnZXRDYWNoZWRSdW50aW1lRW50cmllcyh1cmw6IHN0cmluZyk6IFByb21pc2U8VGFyRW50cnlbXT4gewogIGlmIChjYWNoZWRSdW50aW1lICYmIGNhY2hlZFJ1bnRpbWUudXJsID09PSB1cmwgJiYgY2FjaGVkUnVudGltZS5lbnRyaWVzPy5sZW5ndGgpIHJldHVybiBjYWNoZWRSdW50aW1lLmVudHJpZXM7CiAgY29uc3QgYXJjaGl2ZSA9IGF3YWl0IGZldGNoQnl0ZXModXJsKTsKICBsZXQgcnVudGltZUJ5dGVzOiBVaW50OEFycmF5OwogIGlmIChsb29rc0xpa2VHemlwKGFyY2hpdmUpKSB7CiAgICB0cnkgewogICAgICBydW50aW1lQnl0ZXMgPSBndW56aXBTeW5jKGFyY2hpdmUpOwogICAgfSBjYXRjaCAoZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYGd1bnppcCBydW50aW1lIGZhaWxlZDogJHsoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZX1gKTsKICAgIH0KICB9IGVsc2UgewogICAgcnVudGltZUJ5dGVzID0gYXJjaGl2ZTsKICB9CiAgbGV0IGVudHJpZXM6IFRhckVudHJ5W107CiAgdHJ5IHsKICAgIGVudHJpZXMgPSB1bnRhcihydW50aW1lQnl0ZXMpOwogIH0gY2F0Y2ggKGUpIHsKICAgIHRocm93IG5ldyBFcnJvcihgdW50YXIgcnVudGltZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGV9YCk7CiAgfQogIGNhY2hlZFJ1bnRpbWUgPSB7IHVybCwgZW50cmllcyB9OwogIHJldHVybiBlbnRyaWVzOwp9CgpmdW5jdGlvbiBhcHBseUV4dHJhRmlsZXMoZnNSb290OiBEaXJOb2RlLCBmaWxlczogQXJyYXk8eyBwYXRoOiBzdHJpbmc7IGRhdGE6IGFueSB9PikgewogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgcmF3UGF0aCA9IFN0cmluZyhmaWxlPy5wYXRoID8/ICIiKTsKICAgIGNvbnN0IGNsZWFuID0gcmF3UGF0aC5yZXBsYWNlKC9eXC8rLywgIiIpLnJlcGxhY2UoL15cLlwvKy8sICIiKTsKICAgIGlmICghY2xlYW4gfHwgY2xlYW4uZW5kc1dpdGgoIi8iKSkgY29udGludWU7CiAgICBjb25zdCBkYXRhID0gdG9VOChmaWxlPy5kYXRhKTsKICAgIGlmICghZGF0YSkgY29udGludWU7CiAgICBjb25zdCBwYXJ0cyA9IGNsZWFuLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pOwogICAgaWYgKCFwYXJ0cy5sZW5ndGgpIGNvbnRpbnVlOwogICAgbGV0IGRpcjogRGlyTm9kZSA9IGZzUm9vdDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSArPSAxKSB7CiAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgaWYgKCFkaXIuY29udGVudHMuaGFzKHBhcnQpKSBkaXIuY29udGVudHMuc2V0KHBhcnQsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICAgIGRpciA9IGRpci5jb250ZW50cy5nZXQocGFydCkgYXMgRGlyTm9kZTsKICAgIH0KICAgIGNvbnN0IGxlYWYgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTsKICAgIGRpci5jb250ZW50cy5zZXQobGVhZiwgbmV3IEZpbGUoZGF0YSwgeyByZWFkb25seTogZmFsc2UgfSkpOwogIH0KfQoKZnVuY3Rpb24gdG9VOChkYXRhOiBhbnkpOiBVaW50OEFycmF5IHwgbnVsbCB7CiAgaWYgKCFkYXRhKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoKTsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBkYXRhOwogIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTsKICBpZiAoZGF0YSAmJiBkYXRhLnR5cGUgPT09ICJCdWZmZXIiICYmIEFycmF5LmlzQXJyYXkoZGF0YS5kYXRhKSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEuZGF0YSk7CiAgdHJ5IHsKICAgIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoU3RyaW5nKGRhdGEpKTsKICB9IGNhdGNoIChfKSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmZ1bmN0aW9uIGhhbmRsZVN0ZG91dChjaHVuazogVWludDhBcnJheSkgewogIGlmICghcnBjRGVjb2RlcikgewogICAgcnBjRGVjb2RlciA9IG5ldyBEZWNvZGVyKGhhbmRsZU1lc3NhZ2UpOwogIH0KICB0cnkgewogICAgcnBjRGVjb2Rlci5wdXNoKGNodW5rKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHZvaWQgZXJyOwogICAgcnBjRGVjb2RlciA9IG5ldyBEZWNvZGVyKGhhbmRsZU1lc3NhZ2UpOwogIH0KfQoKZnVuY3Rpb24gaGFuZGxlTWVzc2FnZShtc2c6IHVua25vd24pIHsKICBpZiAoIUFycmF5LmlzQXJyYXkobXNnKSB8fCBtc2cubGVuZ3RoIDwgMSkgcmV0dXJuOwogIGNvbnN0IGtpbmQgPSBtc2dbMF07CiAgaWYgKGtpbmQgPT09IDApIHsKICAgIGNvbnN0IFssIG1zZ2lkLCBtZXRob2QsIHBhcmFtc10gPSBtc2cgYXMgYW55OwogICAgaWYgKG1ldGhvZCA9PT0gIndhc20tY2xpcGJvYXJkLXBhc3RlIikgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJjbGlwYm9hcmQtcGFzdGUiLCBtc2dpZCB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInJwYy1yZXF1ZXN0IiwgbXNnaWQsIG1ldGhvZCwgcGFyYW1zIH0pOwogICAgfQogIH0gZWxzZSBpZiAoa2luZCA9PT0gMSkgewogICAgY29uc3QgWywgbXNnaWQsIGVycm9yLCByZXN1bHRdID0gbXNnIGFzIGFueTsKICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInJwYy1yZXNwb25zZSIsIG1zZ2lkLCBlcnJvciwgcmVzdWx0IH0pOwogIH0gZWxzZSBpZiAoa2luZCA9PT0gMikgewogICAgY29uc3QgWywgbWV0aG9kLCBwYXJhbXNdID0gbXNnIGFzIGFueTsKICAgIGlmIChtZXRob2QgPT09ICJ3YXNtLWNsaXBib2FyZC1jb3B5IikgewogICAgICBjb25zdCBsaW5lcyA9IEFycmF5LmlzQXJyYXkoKHBhcmFtcyBhcyBhbnkpPy5bMF0pID8gKHBhcmFtcyBhcyBhbnkpWzBdIDogW107CiAgICAgIGNvbnN0IHJlZ3R5cGUgPSB0eXBlb2YgKHBhcmFtcyBhcyBhbnkpPy5bMV0gPT09ICJzdHJpbmciID8gKHBhcmFtcyBhcyBhbnkpWzFdIDogInYiOwogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJjbGlwYm9hcmQtY29weSIsIGxpbmVzLCByZWd0eXBlIH0pOwogICAgfSBlbHNlIGlmICgKICAgICAgbWV0aG9kID09PSAibnZpbV9idWZfbGluZXNfZXZlbnQiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm52aW1fYnVmX2RldGFjaF9ldmVudCIKICAgICAgfHwgbWV0aG9kID09PSAicmVkcmF3IgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fY3Vyc29yIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fbW9kZSIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2N1cnNvck1vdmUiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm1vbmFjb19zY3JvbGwiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm1vbmFjb19yZXZlYWwiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm1vbmFjb19tb3ZlQ3Vyc29yIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fc2Nyb2xsb2ZmIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29faG9zdF9jb21tYW5kIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fYnVmX2VudGVyIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fYnVmX2RlbGV0ZSIKICAgICkgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJycGMtbm90aWZ5IiwgbWV0aG9kLCBwYXJhbXMgfSk7CiAgICB9CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaEJ5dGVzKHVybDogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7CiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTsKICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGBmZXRjaCAke3VybH0gZmFpbGVkICgke3Jlcy5zdGF0dXN9KWApOwogIGNvbnN0IGN0ID0gKHJlcy5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIikgfHwgIiIpLnRvTG93ZXJDYXNlKCk7CiAgaWYgKGN0LmluY2x1ZGVzKCJ0ZXh0L2h0bWwiKSkgdGhyb3cgbmV3IEVycm9yKGBmZXRjaCAke3VybH0gcmV0dXJuZWQgSFRNTCAobGlrZWx5IHdyb25nIHBhdGggb3IgZGV2IHNlcnZlciBmYWxsYmFjaylgKTsKICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgcmVzLmFycmF5QnVmZmVyKCkpOwogIGlmICghZGF0YS5ieXRlTGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoYGZldGNoICR7dXJsfSByZXR1cm5lZCBlbXB0eSBib2R5YCk7CiAgcmV0dXJuIGRhdGE7Cn0KCnR5cGUgVGFyRW50cnkgPSB7IG5hbWU6IHN0cmluZzsgdHlwZTogImRpciIgfCAiZmlsZSI7IGRhdGE6IFVpbnQ4QXJyYXkgfTsKCmZ1bmN0aW9uIGxvb2tzTGlrZUd6aXAoZGF0YTogVWludDhBcnJheSkgewogIHJldHVybiBkYXRhICYmIGRhdGEubGVuZ3RoID49IDIgJiYgZGF0YVswXSA9PT0gMHgxZiAmJiBkYXRhWzFdID09PSAweDhiOwp9CgpmdW5jdGlvbiB1bnRhcihieXRlczogVWludDhBcnJheSk6IFRhckVudHJ5W10gewogIGNvbnN0IGZpbGVzOiBUYXJFbnRyeVtdID0gW107CiAgY29uc3QgZGF0YSA9IGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGJ5dGVzIDogbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpOwogIGxldCBvZmZzZXQgPSAwOwogIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTsKICBsZXQgc2FmZXR5ID0gMDsKCiAgd2hpbGUgKG9mZnNldCArIDUxMiA8PSBkYXRhLmxlbmd0aCkgewogICAgaWYgKHNhZmV0eSsrID4gMTAwXzAwMCkgdGhyb3cgbmV3IEVycm9yKCJ1bnRhciBzYWZldHkgYnJlYWsiKTsKICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlciwgZGF0YSwgb2Zmc2V0LCAxMDApOwogICAgY29uc3Qgc2l6ZVRleHQgPSBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlciwgZGF0YSwgb2Zmc2V0ICsgMTI0LCAxMik7CiAgICBjb25zdCB0eXBlZmxhZyA9IGRhdGFbb2Zmc2V0ICsgMTU2XTsKICAgIGNvbnN0IHByZWZpeCA9IGRlY29kZVRhclN0cmluZyhkZWNvZGVyLCBkYXRhLCBvZmZzZXQgKyAzNDUsIDE1NSk7CiAgICBpZiAoIW5hbWUgJiYgIXByZWZpeCkgYnJlYWs7CiAgICBjb25zdCBzaXplUmF3ID0gc2l6ZVRleHQudHJpbSgpIHx8ICIwIjsKICAgIGNvbnN0IHNpemUgPSBwYXJzZUludChzaXplUmF3LCA4KTsKICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHNpemUpIHx8IHNpemUgPCAwKSB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdGFyIHNpemU6ICR7c2l6ZVJhd31gKTsKICAgIGNvbnN0IGZ1bGxOYW1lID0gcHJlZml4ID8gYCR7cHJlZml4fS8ke25hbWV9YCA6IG5hbWU7CiAgICBjb25zdCBib2R5U3RhcnQgPSBvZmZzZXQgKyA1MTI7CiAgICBjb25zdCBib2R5RW5kID0gYm9keVN0YXJ0ICsgc2l6ZTsKICAgIGNvbnN0IHBheWxvYWQgPSBkYXRhLnNsaWNlKGJvZHlTdGFydCwgYm9keUVuZCk7CiAgICBmaWxlcy5wdXNoKHsgbmFtZTogZnVsbE5hbWUsIHR5cGU6IHR5cGVmbGFnID09PSA1MyA/ICJkaXIiIDogImZpbGUiLCBkYXRhOiBwYXlsb2FkIH0pOwogICAgY29uc3QgYmxvY2tzID0gTWF0aC5jZWlsKHNpemUgLyA1MTIpOwogICAgY29uc3QgbmV4dCA9IGJvZHlTdGFydCArIGJsb2NrcyAqIDUxMjsKICAgIGlmIChuZXh0IDw9IG9mZnNldCkgdGhyb3cgbmV3IEVycm9yKCJ0YXIgcGFyc2UgZGlkIG5vdCBhZHZhbmNlIik7CiAgICBvZmZzZXQgPSBuZXh0OwogIH0KICByZXR1cm4gZmlsZXM7Cn0KCmZ1bmN0aW9uIGRlY29kZVRhclN0cmluZyhkZWNvZGVyOiBUZXh0RGVjb2RlciwgZGF0YTogVWludDhBcnJheSwgc3RhcnQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcgewogIGxldCBlbmQgPSBzdGFydDsKICBjb25zdCBtYXggPSBzdGFydCArIGxlbmd0aDsKICB3aGlsZSAoZW5kIDwgbWF4ICYmIGRhdGFbZW5kXSAhPT0gMCkgZW5kICs9IDE7CiAgcmV0dXJuIGRlY29kZXIuZGVjb2RlKGRhdGEuc3ViYXJyYXkoc3RhcnQsIGVuZCkpLnRyaW0oKTsKfQoKZnVuY3Rpb24gYnVpbGRGcyhlbnRyaWVzOiBUYXJFbnRyeVtdLCBvblByb2dyZXNzPzogKGNvdW50OiBudW1iZXIpID0+IHZvaWQpIHsKICBjb25zdCByb290ID0gbmV3IERpcmVjdG9yeShuZXcgTWFwKCkpIGFzIERpck5vZGU7CiAgbGV0IGNvdW50ID0gMDsKICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHsKICAgIGNvbnN0IGNsZWFuID0gZW50cnkubmFtZS5yZXBsYWNlKC9eXC5cLz8vLCAiIik7CiAgICBpZiAoIWNsZWFuKSBjb250aW51ZTsKICAgIGNvbnN0IHBhcnRzID0gY2xlYW4uc3BsaXQoIi8iKS5maWx0ZXIoQm9vbGVhbik7CiAgICBpZiAoIXBhcnRzLmxlbmd0aCkgY29udGludWU7CiAgICBjb3VudCArPSAxOwogICAgaWYgKG9uUHJvZ3Jlc3MgJiYgY291bnQgJSA1MDAgPT09IDApIG9uUHJvZ3Jlc3MoY291bnQpOwoKICAgIGxldCBkaXI6IERpck5vZGUgPSByb290OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpICs9IDEpIHsKICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldOwogICAgICBpZiAoIWRpci5jb250ZW50cy5oYXMocGFydCkpIGRpci5jb250ZW50cy5zZXQocGFydCwgbmV3IERpcmVjdG9yeShuZXcgTWFwKCkpKTsKICAgICAgZGlyID0gZGlyLmNvbnRlbnRzLmdldChwYXJ0KSBhcyBEaXJOb2RlOwogICAgfQoKICAgIGNvbnN0IGxlYWYgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTsKICAgIGlmIChlbnRyeS50eXBlID09PSAiZGlyIikgewogICAgICBpZiAoIWRpci5jb250ZW50cy5oYXMobGVhZikpIGRpci5jb250ZW50cy5zZXQobGVhZiwgbmV3IERpcmVjdG9yeShuZXcgTWFwKCkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGRpci5jb250ZW50cy5zZXQobGVhZiwgbmV3IEZpbGUoZW50cnkuZGF0YSwgeyByZWFkb25seTogdHJ1ZSB9KSk7CiAgICB9CiAgfQoKICBlbnN1cmVEaXIocm9vdCwgImhvbWUiKTsKICBlbnN1cmVEaXIocm9vdCwgInRtcCIpOwogIGVuc3VyZURpcihyb290LCAiaG9tZS8uY29uZmlnIik7CiAgZW5zdXJlRGlyKHJvb3QsICJob21lLy5sb2NhbC9zaGFyZSIpOwogIGVuc3VyZURpcihyb290LCAiaG9tZS8ubG9jYWwvc3RhdGUiKTsKCiAgcmV0dXJuIHJvb3Q7Cn0KCmZ1bmN0aW9uIGVuc3VyZURpcihyb290OiBEaXJOb2RlLCBwYXRoOiBzdHJpbmcpIHsKICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoIi8iKS5maWx0ZXIoQm9vbGVhbik7CiAgbGV0IG5vZGU6IERpck5vZGUgPSByb290OwogIGZvciAoY29uc3QgcCBvZiBwYXJ0cykgewogICAgaWYgKCFub2RlLmNvbnRlbnRzLmhhcyhwKSkgbm9kZS5jb250ZW50cy5zZXQocCwgbmV3IERpcmVjdG9yeShuZXcgTWFwKCkpKTsKICAgIG5vZGUgPSBub2RlLmNvbnRlbnRzLmdldChwKSBhcyBEaXJOb2RlOwogIH0KfQoKZnVuY3Rpb24gbWFrZUVudihwcm9jRXhpdD86IChjb2RlOiBudW1iZXIpID0+IHZvaWQpIHsKICBjb25zdCB3YXNtQW55ID0gV2ViQXNzZW1ibHkgYXMgYW55OwogIGNvbnN0IGNMb25nam1wID0gbmV3IHdhc21BbnkuVGFnKHsgcGFyYW1ldGVyczogWyJpMzIiXSwgcmVzdWx0czogW10gfSkgYXMgYW55OwogIHJldHVybiB7CiAgICBmbG9jazogKCkgPT4gMCwKICAgIGdldHBpZDogKCkgPT4gMSwKICAgIHV2X3JhbmRvbTogKCkgPT4gLTM4LAogICAgdXZfd3RmOF90b191dGYxNjogKCkgPT4ge30sCiAgICB1dl91dGYxNl9sZW5ndGhfYXNfd3RmODogKCkgPT4gMCwKICAgIHV2X3V0ZjE2X3RvX3d0Zjg6ICgpID0+IC0zOCwKICAgIHV2X3d0ZjhfbGVuZ3RoX2FzX3V0ZjE2OiAoKSA9PiAwLAogICAgX193YXNtX2xvbmdqbXA6IChwdHI6IG51bWJlcikgPT4gewogICAgICBpZiAocHJvY0V4aXQpIHByb2NFeGl0KDEpOwogICAgICB0aHJvdyBuZXcgd2FzbUFueS5FeGNlcHRpb24oY0xvbmdqbXAsIFtwdHIgPz8gMF0pOwogICAgfSwKICAgIF9fd2FzbV9zZXRqbXA6ICgpID0+IDAsCiAgICBfX3dhc21fc2V0am1wX3Rlc3Q6ICgpID0+IDAsCiAgICB0bXBmaWxlOiAoKSA9PiAwLAogICAgY2xvY2s6ICgpID0+IDAsCiAgICBzeXN0ZW06ICgpID0+IC0xLAogICAgdG1wbmFtOiAoKSA9PiAwLAogICAgX19jX2xvbmdqbXA6IGNMb25nam1wLAogIH0gYXMgV2ViQXNzZW1ibHkuTW9kdWxlSW1wb3J0czsKfQoKY2xhc3MgUm9vdGVkUHJlb3BlbkRpcmVjdG9yeSBleHRlbmRzIFByZW9wZW5EaXJlY3RvcnkgewogICNzdHJpcChwYXRoOiBzdHJpbmcpIHsgcmV0dXJuIHBhdGgucmVwbGFjZSgvXlwvKy8sICIiKTsgfQogIHBhdGhfb3BlbigKICAgIGRpcmZsYWdzOiBudW1iZXIsCiAgICBwYXRoX3N0cjogc3RyaW5nLAogICAgb2ZsYWdzOiBudW1iZXIsCiAgICBmc19yaWdodHNfYmFzZTogYmlnaW50LAogICAgZnNfcmlnaHRzX2luaGVyaXRpbmc6IGJpZ2ludCwKICAgIGZkX2ZsYWdzOiBudW1iZXIsCiAgKSB7CiAgICByZXR1cm4gc3VwZXIucGF0aF9vcGVuKGRpcmZsYWdzLCB0aGlzLiNzdHJpcChwYXRoX3N0ciksIG9mbGFncywgZnNfcmlnaHRzX2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nLCBmZF9mbGFncyk7CiAgfQogIHBhdGhfZmlsZXN0YXRfZ2V0KGZsYWdzOiBudW1iZXIsIHBhdGhfc3RyOiBzdHJpbmcpIHsgcmV0dXJuIHN1cGVyLnBhdGhfZmlsZXN0YXRfZ2V0KGZsYWdzLCB0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9jcmVhdGVfZGlyZWN0b3J5KHBhdGhfc3RyOiBzdHJpbmcpIHsgcmV0dXJuIHN1cGVyLnBhdGhfY3JlYXRlX2RpcmVjdG9yeSh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF91bmxpbmtfZmlsZShwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX3VubGlua19maWxlKHRoaXMuI3N0cmlwKHBhdGhfc3RyKSk7IH0KICBwYXRoX3JlbW92ZV9kaXJlY3RvcnkocGF0aF9zdHI6IHN0cmluZykgeyByZXR1cm4gc3VwZXIucGF0aF9yZW1vdmVfZGlyZWN0b3J5KHRoaXMuI3N0cmlwKHBhdGhfc3RyKSk7IH0KICBwYXRoX2xpbmsocGF0aF9zdHI6IHN0cmluZywgaW5vZGU6IElub2RlLCBhbGxvd19kaXI6IGJvb2xlYW4pIHsgcmV0dXJuIHN1cGVyLnBhdGhfbGluayh0aGlzLiNzdHJpcChwYXRoX3N0ciksIGlub2RlLCBhbGxvd19kaXIpOyB9CiAgcGF0aF9yZWFkbGluayhwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX3JlYWRsaW5rKHRoaXMuI3N0cmlwKHBhdGhfc3RyKSk7IH0KICBwYXRoX3N5bWxpbmsob2xkX3BhdGg6IHN0cmluZywgbmV3X3BhdGg6IHN0cmluZykgewogICAgY29uc3QgdGFyZ2V0ID0gKFByZW9wZW5EaXJlY3RvcnkucHJvdG90eXBlIGFzIHVua25vd24gYXMgeyBwYXRoX3N5bWxpbms/OiAob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpID0+IG51bWJlciB9KS5wYXRoX3N5bWxpbms7CiAgICBpZiAoIXRhcmdldCkgcmV0dXJuIHdhc2kuRVJSTk9fTk9UU1VQOwogICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIHRoaXMuI3N0cmlwKG9sZF9wYXRoKSwgdGhpcy4jc3RyaXAobmV3X3BhdGgpKTsKICB9Cn0KCg==", import.meta.url);
|
|
3691
3912
|
export {
|
|
3692
|
-
|
|
3693
|
-
|
|
3694
|
-
|
|
3695
|
-
|
|
3696
|
-
|
|
3697
|
-
|
|
3913
|
+
fe as MonacoNeovimClient,
|
|
3914
|
+
he as NeovimWasmSession,
|
|
3915
|
+
Se as createMonacoNeovim,
|
|
3916
|
+
He as defaultWorkerUrl,
|
|
3917
|
+
Ye as defaultWorkerUrlAsyncify,
|
|
3918
|
+
de as isSharedArrayBufferAvailable
|
|
3698
3919
|
};
|