@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.
@@ -1,137 +1,137 @@
1
1
  import * as y from "monaco-editor";
2
- class U {
2
+ class ie {
3
3
  buffer;
4
4
  ctrl;
5
5
  data;
6
6
  capacity;
7
- constructor(t = L) {
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), r = this.capacity - n - 1;
14
- if (e.byteLength > r) return !1;
15
- const l = this.capacity - s;
16
- return e.byteLength <= l ? (this.data.set(e, s), Atomics.store(this.ctrl, 1, (s + e.byteLength) % this.capacity)) : (this.data.set(e.subarray(0, l), s), this.data.set(e.subarray(l), 0), Atomics.store(this.ctrl, 1, e.byteLength - l)), Atomics.notify(this.ctrl, 1), !0;
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 L = 262144;
20
- function Q(o = L) {
21
- return new U(o);
19
+ const x = 262144;
20
+ function ne(l = x) {
21
+ return new ie(l);
22
22
  }
23
- function D(o) {
23
+ function U(l) {
24
24
  const t = [];
25
- return P(o, t), new Uint8Array(t);
25
+ return T(l, t), new Uint8Array(t);
26
26
  }
27
- function P(o, t) {
28
- if (o == null) {
27
+ function T(l, t) {
28
+ if (l == null) {
29
29
  t.push(192);
30
30
  return;
31
31
  }
32
- if (typeof o == "boolean") {
33
- t.push(o ? 195 : 194);
32
+ if (typeof l == "boolean") {
33
+ t.push(l ? 195 : 194);
34
34
  return;
35
35
  }
36
- if (typeof o == "number") {
37
- q(o, t);
36
+ if (typeof l == "number") {
37
+ se(l, t);
38
38
  return;
39
39
  }
40
- if (typeof o == "string") {
41
- j(o, t);
40
+ if (typeof l == "string") {
41
+ oe(l, t);
42
42
  return;
43
43
  }
44
- if (typeof o == "bigint") {
45
- z(o, t);
44
+ if (typeof l == "bigint") {
45
+ j(l, t);
46
46
  return;
47
47
  }
48
- if (Array.isArray(o)) {
49
- G(o, t);
48
+ if (Array.isArray(l)) {
49
+ ce(l, t);
50
50
  return;
51
51
  }
52
- if (o instanceof Uint8Array) {
53
- J(o, t);
52
+ if (l instanceof Uint8Array) {
53
+ le(l, t);
54
54
  return;
55
55
  }
56
- if (Z(o)) {
57
- Y(o, t);
56
+ if (ge(l)) {
57
+ ae(l, t);
58
58
  return;
59
59
  }
60
- if (typeof o == "object") {
61
- X(o, t);
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 q(o, t) {
67
- if (!Number.isFinite(o)) throw new Error("Cannot encode non-finite number");
68
- if (Number.isInteger(o)) {
69
- if (o >= 0 && o <= 127) {
70
- t.push(o);
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 (o < 0 && o >= -32) {
74
- t.push(224 | o + 32);
73
+ if (l < 0 && l >= -32) {
74
+ t.push(224 | l + 32);
75
75
  return;
76
76
  }
77
- if (o >= -128 && o <= 127) {
78
- t.push(208, o + 256 & 255);
77
+ if (l >= -128 && l <= 127) {
78
+ t.push(208, l + 256 & 255);
79
79
  return;
80
80
  }
81
- if (o >= -32768 && o <= 32767) {
82
- t.push(209, o >> 8 & 255, o & 255);
81
+ if (l >= -32768 && l <= 32767) {
82
+ t.push(209, l >> 8 & 255, l & 255);
83
83
  return;
84
84
  }
85
- if (o >= -2147483648 && o <= 2147483647) {
86
- t.push(210, o >> 24 & 255, o >> 16 & 255, o >> 8 & 255, o & 255);
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
- z(BigInt(o), t);
89
+ j(BigInt(l), t);
90
90
  return;
91
91
  }
92
92
  const e = new ArrayBuffer(8);
93
- new DataView(e).setFloat64(0, o), t.push(203, ...new Uint8Array(e));
93
+ new DataView(e).setFloat64(0, l), t.push(203, ...new Uint8Array(e));
94
94
  }
95
- function z(o, t) {
95
+ function j(l, t) {
96
96
  const e = new ArrayBuffer(8);
97
- new DataView(e).setBigInt64(0, BigInt(o)), t.push(211, ...new Uint8Array(e));
97
+ new DataView(e).setBigInt64(0, BigInt(l)), t.push(211, ...new Uint8Array(e));
98
98
  }
99
- function j(o, t) {
100
- const i = new TextEncoder().encode(o), s = i.length;
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 J(o, t) {
104
- const e = o.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(...o);
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 G(o, t) {
108
- const e = o.length;
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 o)
111
- P(i, t);
110
+ for (const i of l)
111
+ T(i, t);
112
112
  }
113
- function X(o, t) {
114
- const e = Object.keys(o), i = e.length;
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
- P(s, t), P(o[s], t);
117
+ T(s, t), T(l[s], t);
118
118
  }
119
- function Y(o, t) {
120
- const e = o.data.length;
121
- e === 1 ? t.push(212, o.type) : e === 2 ? t.push(213, o.type) : e === 4 ? t.push(214, o.type) : e === 8 ? t.push(215, o.type) : e === 16 ? t.push(216, o.type) : t.push(199, e, o.type);
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(o.data[i]);
123
+ t.push(l.data[i]);
124
124
  }
125
- function Z(o) {
126
- return !!(o && typeof o == "object" && typeof o.type == "number" && o.data instanceof Uint8Array);
125
+ function ge(l) {
126
+ return !!(l && typeof l == "object" && typeof l.type == "number" && l.data instanceof Uint8Array);
127
127
  }
128
- function ee() {
128
+ function de() {
129
129
  return typeof SharedArrayBuffer < "u" && typeof crossOriginIsolated < "u" && crossOriginIsolated;
130
130
  }
131
- function te(o) {
132
- return o.byteOffset === 0 && o.byteLength === o.buffer.byteLength ? o : o.slice();
131
+ function Ie(l) {
132
+ return l.byteOffset === 0 && l.byteLength === l.buffer.byteLength ? l : l.slice();
133
133
  }
134
- class ie {
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 ?? L,
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: r, files: l } = t;
172
- if (this.inputMode = t.inputMode ?? this.init.inputMode, this.inputMode === "shared" && !ee())
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 c = this.worker;
175
- if (this.stop({ terminate: !this.init.reuseWorker, silent: !0 }), this.sharedInput = this.inputMode === "shared" ? Q(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 && c ? this.worker = c : 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 = (f) => this.handleWorkerMessage(f.data);
177
- const u = (f) => {
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 = f, this.workerExited = !0, this.workerExitCode = 1, this.pending.size) {
180
- const p = new Error(f);
181
- this.pending.forEach((m) => m.reject(p)), this.pending.clear();
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?.(f);
184
+ this.init.handlers.onStartError?.(h);
185
185
  } catch {
186
186
  }
187
187
  }
188
188
  };
189
- this.worker.onerror = (f) => {
190
- const p = f?.message ? `worker error: ${f.message}` : "worker error", m = f?.error?.stack;
191
- u(m ? `${p}
192
- ${m}` : p);
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
- u("worker messageerror");
194
+ g("worker messageerror");
195
195
  };
196
- const d = {
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: r ?? void 0,
204
- files: l ?? void 0
203
+ env: o ?? void 0,
204
+ files: c ?? void 0
205
205
  };
206
206
  try {
207
- this.worker.postMessage(d, []);
207
+ this.worker.postMessage(I, []);
208
208
  } catch {
209
- this.worker.postMessage(d);
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 = D([2, t, e]);
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 l = this.workerExitCode, c = this.workerFatalError ? `: ${this.workerFatalError}` : "";
245
- s(new Error(l != null ? `nvim exited (${l})${c}` : `nvim exited${c}`));
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 r = D([0, n, t, e]);
251
- this.postInput(r), setTimeout(() => {
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, r = this.workerFatalError ? `: ${this.workerFatalError}` : "";
269
- throw new Error(n != null ? `nvim exited (${n})${r}` : `nvim exited${r}`);
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 = D([1, t, e, i]);
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, r = this.pending.get(i);
285
- if (!r) return;
286
- this.pending.delete(i), s ? r.reject(new Error(String(s))) : r.resolve(n);
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 r = n ? `: ${n.trim()}` : "", l = new Error(`nvim exited (${s})${r}`);
341
- this.pending.forEach((c) => c.reject(l)), this.pending.clear();
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 = te(t);
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 r = this.inputQueueHead; r < this.inputQueue.length; r += 1) {
392
- const l = this.inputQueue[r];
393
- if (l?.byteLength) {
394
- if (i > 0 && e + l.byteLength > 262144) break;
395
- e += l.byteLength, i += 1;
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 r = 0; r < i; r += 1) {
402
- const l = this.inputQueue[this.inputQueueHead + r];
403
- s.set(l, n), n += l.byteLength;
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 ne = `if !exists('g:monaco_neovim_wasm_chan')
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
- `, se = `if !exists('g:monaco_neovim_wasm_chan')
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
- `, re = `if !exists('g:monaco_neovim_wasm_chan')
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
- `, oe = [
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 A(o) {
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(o ?? ""), 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);
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 le = `
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
- `, ae = `
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 ce {
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
- sendCmdlineImeText(t) {
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(F(e, !0)));
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 l = new URLSearchParams(location.search);
1038
- return l.has("monaco-neovim-wasm-debug") || l.has("mnw_debug");
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
- })(), r = i || s ? !0 : !!e.debug;
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 ?? L,
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 ?? oe,
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 number norelativenumber",
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: r,
1131
+ debug: o,
1109
1132
  debugLog: e.debugLog,
1110
1133
  shouldHandleKey: e.shouldHandleKey ?? (() => !0),
1111
- translateKey: e.translateKey ?? ue
1112
- }, this.ctrlKeysNormal = this.opts.ctrlKeysForNormalMode ? new Set(this.opts.ctrlKeysForNormalMode.map((l) => String(l).toLowerCase())) : null, this.ctrlKeysInsert = this.opts.ctrlKeysForInsertMode ? new Set(this.opts.ctrlKeysForInsertMode.map((l) => String(l).toLowerCase())) : null, this.altKeysNormal = this.opts.altKeysForNormalMode ? new Set(this.opts.altKeysForNormalMode.map((l) => String(l).toLowerCase())) : null, this.altKeysInsert = this.opts.altKeysForInsertMode ? new Set(this.opts.altKeysForInsertMode.map((l) => String(l).toLowerCase())) : null, this.metaKeysNormal = this.opts.metaKeysForNormalMode ? new Set(this.opts.metaKeysForNormalMode.map((l) => String(l).toLowerCase())) : null, this.metaKeysInsert = this.opts.metaKeysForInsertMode ? new Set(this.opts.metaKeysForInsertMode.map((l) => String(l).toLowerCase())) : null, this.opts.debug && (this.opts.status?.("[monaco-neovim-wasm] debug enabled"), this.debugLog("debug enabled"));
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, r) => {
1125
- this.handleRequest(s, n, r);
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 r = n ? `: ${n.trim()}` : "";
1149
- this.opts.status(`nvim exited (${s})${r}`, s !== 0);
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 ie({
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: pe(me(
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: ne },
1184
- { path: "home/.config/nvim/monaco-neovim-wasm/scrolling.vim", data: se },
1185
- { path: "home/.config/nvim/monaco-neovim-wasm/host-commands.vim", data: re }
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 = F(String(t ?? ""), e);
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 r = await this.rpcCall("nvim_exec_lua", [i, s]);
1226
- return this.execLuaAvailable = !0, r;
1227
- } catch (r) {
1228
- const l = r?.message || String(r);
1229
- if (l.includes("Invalid method") && l.includes("nvim_exec_lua"))
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 r;
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.scheduleSearchHighlightRefresh());
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 ?? "", r = i?.path ?? "";
1370
+ const i = t.uri, s = i?.scheme ?? "", n = i?.authority ?? "", o = i?.path ?? "";
1348
1371
  if (s === "nvim" && n === "buf") {
1349
- const l = /^\/(\d+)$/.exec(r), c = l ? Number(l[1]) : NaN;
1350
- Number.isFinite(c) && c > 0 && (this.bufHandle = c);
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), r = Math.max(1, Number(s?.lineHeight ?? 0) || 0), l = Math.max(this.opts.minCols, Math.floor(e / n)), c = Math.max(this.opts.minRows, Math.floor(i / r));
1367
- if (Number.isFinite(l) && Number.isFinite(c) && l > 0 && c > 0) return { cols: l, rows: c };
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), r = String(t).split(/\r?\n/);
1410
- let l = n.lineNumber, c = n.column;
1411
- r.length <= 1 ? c += Array.from(r[0] ?? "").length : (l += r.length - 1, c = 1 + Array.from(r[r.length - 1] ?? "").length);
1412
- const u = e.validatePosition(new y.Position(l, c)), d = this.editor.getPosition() ?? this.lastCursorPos ?? n;
1413
- this.optimisticCursorPrevPos = d, this.optimisticCursorPos = u, this.optimisticCursorUntil = (typeof performance < "u" && performance.now ? performance.now() : Date.now()) + 120, this.lastCursorPos = u, !this.compositionActive && (this.suppressCursorSync = !0, this.editor.setPosition(u), this.suppressCursorSync = !1);
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 r of this.opts.startupCommands)
1541
- r && this.sendNotify("nvim_command", [r]);
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 = N(t) ?? 1;
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 r = this.ensureActiveState();
1556
- if (r) {
1557
- const l = await this.rpcCall("nvim_buf_get_name", [e]);
1558
- r.name = typeof l == "string" ? l : "", r.name && this.buffersByName.set(r.name, e);
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 c = await this.rpcCall("nvim_buf_get_option", [e, "filetype"]);
1561
- r.filetype = typeof c == "string" ? c : "";
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
- `), i = this.opts.clipboard;
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
- A(e);
1581
- }) : A(e);
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
- A(e);
1612
+ J(e);
1588
1613
  });
1589
1614
  return;
1590
1615
  }
1591
- A(e);
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 r = this.ignoreInsertExitCursor, l = this.nowMs();
1642
- if (r && l < r.untilMs && !this.delegateInsertToMonaco && Number(i) === r.line && Number(s) === r.col0 && r.col0 > 0) {
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
- r && l >= r.untilMs && (this.ignoreInsertExitCursor = null);
1671
+ o && c >= o.untilMs && (this.ignoreInsertExitCursor = null);
1647
1672
  } catch {
1648
1673
  }
1649
- const n = K(this.editor, Number(i), Number(s));
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 r = this.editor.getModel(), l = r ? r.validatePosition(new y.Position(n.line, n.col)) : new y.Position(n.line, n.col);
1652
- this.lastCursorPos = l;
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), S(this.lastMode) && this.scheduleVisualSelectionRefresh();
1680
+ this.updateCursor(n.line, n.col), H(this.lastMode) && this.scheduleVisualSelectionRefresh();
1656
1681
  return;
1657
1682
  }
1658
1683
  if (t === "monaco_mode") {
1659
- const i = typeof e?.[0] == "string" ? String(e[0]) : "";
1660
- this.hostAutocmdInstalled || (this.hostAutocmdInstalled = !0), this.debugLog(`nvim->monaco mode: ${JSON.stringify(this.lastMode)} -> ${JSON.stringify(i)}`), this.applyNvimMode(i);
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, r, l] = e, c = N(i);
1670
- if (!c) return;
1671
- const u = this.bufHandle != null && c === this.bufHandle ? this.ensureActiveState() : this.buffers.get(c) ?? null;
1672
- if (!u || this.bufHandle != null && c === this.bufHandle && this.delegateInsertToMonaco && !this.exitingInsertMode && this.nowMs() < this.ignoreActiveBufLinesEventsUntil)
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 && c === this.bufHandle && this.compositionActive) {
1706
+ if (this.bufHandle != null && a === this.bufHandle && this.compositionActive) {
1675
1707
  this.pendingResyncAfterComposition = !0;
1676
1708
  return;
1677
1709
  }
1678
- const d = u.model, f = Number(n), p = Number(r), m = Array.isArray(l) ? l.map((h) => String(h ?? "")) : null;
1679
- if (d && Number.isInteger(f) && Number.isInteger(p) && f >= 0 && p >= f && m)
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 h = this.bufHandle != null && c === this.bufHandle && this.editor.getModel() === d;
1682
- if (h && this.delegateInsertToMonaco) {
1683
- const g = this.computeLinePatch(d, f, p, m);
1684
- let b = !1;
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
- b = d.getValueInRange(g.range) === g.text;
1718
+ A = I.getValueInRange(G.range) === G.text;
1687
1719
  } catch {
1688
1720
  }
1689
- if (!b) {
1690
- if (u.pendingFullSync || u.pendingBufEdits.length) {
1721
+ if (!A) {
1722
+ if (g.pendingFullSync || g.pendingBufEdits.length) {
1691
1723
  this.scheduleResync();
1692
1724
  return;
1693
1725
  }
1694
- this.applyLinePatchToModel(d, f, p, m);
1726
+ this.applyLinePatchToModel(I, h, u, m);
1695
1727
  try {
1696
- u.shadowLines = d.getLinesContent();
1728
+ g.shadowLines = I.getLinesContent();
1697
1729
  } catch {
1698
1730
  }
1699
1731
  }
1700
- } else h ? this.applyLinePatch(d, f, p, m) : this.applyLinePatchToModel(d, f, p, m);
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 h = await this.rpcCall("nvim_buf_get_lines", [c, 0, -1, !1]), g = Array.isArray(h) ? h : [""];
1706
- this.bufHandle != null && c === this.bufHandle && this.editor.getModel() === d ? this.applyBuffer(g) : this.setModelText(d, g);
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 && c === this.bufHandle && S(this.lastMode) && this.scheduleVisualSelectionRefresh();
1741
+ this.bufHandle != null && a === this.bufHandle && H(this.lastMode) && this.scheduleVisualSelectionRefresh();
1710
1742
  } else if (t === "nvim_buf_detach_event") {
1711
- const i = N(e?.[0]);
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.handleRedraw(e);
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(), r = Math.min(e, n), l = Math.min(i, n), c = new y.Position(n, t.getLineMaxColumn(n)), d = l >= n && s.length === 0 && r > 0 ? new y.Position(r, t.getLineMaxColumn(r)) : r < n ? new y.Position(r + 1, 1) : c, f = l < n ? new y.Position(l + 1, 1) : c;
1726
- let p = s.join(`
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 && (p = `
1729
- ${p}`), i < n && s.length > 0 && (p += `
1730
- `), { range: new y.Range(d.lineNumber, d.column, f.lineNumber, f.column), text: p };
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), r = this.computeLinePatch(t, e, i, s);
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(r.range) === r.text) return;
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: r.range, text: r.text }]), this.applyingFromNvim = !1, n && this.editor.setPosition(n), this.suppressCursorSync = !1, this.delegateInsertToMonaco) {
1739
- const l = this.getActiveState();
1740
- if (l && l.model === t)
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
- l.shadowLines = t.getLinesContent();
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, B(e))), s = Math.max(0, Math.min(e.length, I(e, i)));
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 r = document.createElement("span");
1851
- r.textContent = s.word ?? "";
1852
- const l = document.createElement("span");
1853
- l.style.opacity = "0.7", l.textContent = s.menu ?? s.kind ?? "", n.appendChild(r), n.appendChild(l), this.popupEl.appendChild(n);
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 l = e === "down" ? "cursorDown" : "cursorUp";
1882
- for (let c = 0; c < s; c += 1)
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", l, null);
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 r = this.editor.getPosition();
1893
- r && (this.lastCursorPos = r, this.applyScrolloff(r)), this.suppressCursorSync = !1, this.scheduleSearchHighlightRefresh();
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 r = 0;
2055
+ let o = 0;
1907
2056
  try {
1908
- const a = this.editor.getLayoutInfo();
1909
- r = Math.max(0, Number(a?.contentHeight ?? a?.height ?? 0) || 0);
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 (r <= 0) return !1;
1913
- const l = () => {
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 c = null;
2068
+ let a = null;
1920
2069
  try {
1921
- c = this.editor.getScrolledVisiblePosition(i);
2070
+ a = this.editor.getScrolledVisiblePosition(i);
1922
2071
  } catch {
1923
2072
  }
1924
- if (!c) {
1925
- l();
2073
+ if (!a) {
2074
+ c();
1926
2075
  try {
1927
- c = this.editor.getScrolledVisiblePosition(i);
2076
+ a = this.editor.getScrolledVisiblePosition(i);
1928
2077
  } catch {
1929
2078
  }
1930
2079
  }
1931
- if (!c || !Number.isFinite(c.top) || !Number.isFinite(c.height)) return !1;
1932
- const u = this.editor.getScrollTop(), d = c.top, f = c.top + c.height, p = Math.max(0, r - n);
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 (d < n ? m = d - n : f > p && (m = f - p), !m) return !1;
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, u + m));
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, r = typeof t.cursorBy == "string" ? t.cursorBy : "wrappedLine", l = Math.max(3, this.uiRows || this.opts.rows), c = this.editor.getOption(y.editor.EditorOption.fontInfo), u = Math.max(1, Number(c?.lineHeight ?? 0) || 0), d = Math.max(1, l - 2), f = Math.max(1, Math.floor(d / 2));
1943
- let p = s;
1944
- if (e === "page") p = d * s;
1945
- else if (e === "halfPage") p = f * s;
1946
- else if (e === "line") p = s;
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 h = this.editor.getScrollTop(), g = Math.max(0, h + m * p * u);
1953
- this.editor.setScrollTop(g);
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 a = !1;
2105
+ let b = !1;
1957
2106
  if (n)
1958
2107
  try {
1959
2108
  this.applyMonacoCursorMove({
1960
2109
  to: m > 0 ? "down" : "up",
1961
- by: r,
1962
- value: p
1963
- }), a = !0;
2110
+ by: o,
2111
+ value: u
2112
+ }), b = !0;
1964
2113
  } catch {
1965
2114
  }
1966
- return this.suppressCursorSync = !1, a;
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, r = Math.max(1, this.uiRows || this.opts.rows), l = this.editor.getOption(y.editor.EditorOption.fontInfo), c = Math.max(1, Number(l?.lineHeight ?? 0) || 0);
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 u = this.editor.getTopForLineNumber(n);
1976
- this.editor.setScrollTop(u);
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 u = this.editor.getTopForLineNumber(n), d = Math.max(0, u - (r - 1) * c);
1981
- this.editor.setScrollTop(d);
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 u = this.editor.getModel();
1985
- if (u) {
1986
- const d = u.getLineContent(n) ?? "", f = /\S/.exec(d), p = f ? f.index + 1 : 1, m = u.validatePosition(new y.Position(n, p));
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, r = i.getLineCount();
2149
+ let n = 1, o = i.getLineCount();
2001
2150
  try {
2002
- const p = this.editor.getVisibleRanges();
2003
- p && p.length && (n = Math.min(...p.map((m) => m.startLineNumber)), r = Math.max(...p.map((m) => m.endLineNumber)));
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())), r = Math.max(1, Math.min(r, i.getLineCount())), r < n && (r = n);
2007
- let l = n;
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
- l = n + (s - 1);
2158
+ c = n + (s - 1);
2010
2159
  else if (e === "middle")
2011
- l = Math.floor((n + r) / 2);
2160
+ c = Math.floor((n + o) / 2);
2012
2161
  else if (e === "bottom")
2013
- l = r - (s - 1);
2162
+ c = o - (s - 1);
2014
2163
  else
2015
2164
  return;
2016
- l = Math.max(n, Math.min(r, l));
2017
- const c = i.getLineContent(l) ?? "", u = /\S/.exec(c), d = u ? u.index + 1 : 1, f = i.validatePosition(new y.Position(l, d));
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(f);
2169
+ this.editor.setPosition(h);
2021
2170
  } catch {
2022
2171
  }
2023
- this.lastCursorPos = f, this.suppressCursorSync = !1;
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 = (a) => {
2197
+ const e = t.ownerDocument || document, i = e.defaultView || window, s = (r) => {
2122
2198
  try {
2123
- a.stopImmediatePropagation?.();
2199
+ r.stopImmediatePropagation?.();
2124
2200
  } catch {
2125
2201
  }
2126
2202
  try {
2127
- a.stopPropagation();
2203
+ r.stopPropagation();
2128
2204
  } catch {
2129
2205
  }
2130
- }, n = (a) => {
2206
+ }, n = (r) => {
2131
2207
  try {
2132
2208
  if (typeof this.editor.hasTextFocus == "function" ? !!this.editor.hasTextFocus() : !1) return !0;
2133
- const g = a.target;
2134
- if (g && t.contains(g)) return !0;
2135
- const b = e.activeElement;
2136
- return !!(b && t.contains(b));
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
- }, r = (a) => {
2216
+ }, o = (r) => {
2141
2217
  try {
2142
- const h = a;
2143
- return !h || typeof h.tagName != "string" ? null : h;
2218
+ const d = r;
2219
+ return !d || typeof d.tagName != "string" ? null : d;
2144
2220
  } catch {
2145
2221
  return null;
2146
2222
  }
2147
- }, l = (a) => {
2148
- if (!n(a) || this.compositionActive || a.isComposing || a.getModifierState?.("AltGraph")) return;
2149
- const h = this.delegateInsertToMonaco && !this.exitingInsertMode;
2150
- if (h) {
2151
- if (a.key === "Escape") {
2152
- if (!this.opts.shouldHandleKey(a)) return;
2153
- s(a);
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
- a.preventDefault();
2231
+ r.preventDefault();
2156
2232
  } catch {
2157
2233
  }
2158
- if (this.compositionActive || a.isComposing) {
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 _ = a.key;
2166
- (_ === "ArrowLeft" || _ === "ArrowRight" || _ === "ArrowUp" || _ === "ArrowDown" || _ === "Home" || _ === "End" || _ === "PageUp" || _ === "PageDown" || _ === "Tab" || _ === "Enter") && (this.delegatedInsertReplayPossible = !1);
2167
- }
2168
- if (!h && (a.key === "Backspace" || a.key === "Delete" || a.key === "Escape")) {
2169
- if (!this.opts.shouldHandleKey(a)) return;
2170
- const _ = this.opts.translateKey(a);
2171
- if (!_) return;
2172
- s(a);
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
- a.preventDefault();
2250
+ r.preventDefault();
2175
2251
  } catch {
2176
2252
  }
2177
- if (this.exitingInsertMode && _ === "<Esc>") return;
2178
- this.exitingInsertMode ? this.pendingKeysAfterExit += _ : this.sendInput(_);
2253
+ if (this.exitingInsertMode && Z === "<Esc>") return;
2254
+ this.exitingInsertMode ? this.pendingKeysAfterExit += Z : this.sendInput(Z);
2179
2255
  return;
2180
2256
  }
2181
- if (M(this.lastMode) && !this.delegateInsertToMonaco && !this.exitingInsertMode && !a.ctrlKey && !a.metaKey && typeof a.key == "string" && a.key.length === 1) {
2182
- const _ = /^[\x20-\x7E]$/.test(a.key);
2183
- if (!!!(a.altKey && _)) {
2184
- if (!this.opts.shouldHandleKey(a)) return;
2185
- s(a);
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 (!a.ctrlKey && !a.altKey && !a.metaKey) return;
2190
- const g = this.modifiedKeyName(a);
2191
- if (!g || !this.opts.shouldHandleKey(a)) return;
2192
- if (this.hasExplicitModAllowlist(h)) {
2193
- if (!this.shouldForwardModifiedKeys(a, h)) return;
2194
- } else if (h || !a.ctrlKey || a.altKey || a.metaKey || g !== "f" && g !== "b" && g !== "d" && g !== "u" && g !== "e" && g !== "y" && g !== "v") return;
2195
- const b = this.opts.translateKey(a);
2196
- if (b) {
2197
- s(a);
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
- a.preventDefault();
2275
+ r.preventDefault();
2200
2276
  } catch {
2201
2277
  }
2202
- this.exitingInsertMode ? (this.debugLog(`keydown(capture) buffer: key=${JSON.stringify(a.key)} code=${JSON.stringify(a.code)} mods=${a.ctrlKey ? "C" : ""}${a.altKey ? "A" : ""}${a.metaKey ? "D" : ""}${a.shiftKey ? "S" : ""} -> ${b}`), this.pendingKeysAfterExit += b) : h && (b === "<C-[>" || b === "<C-c>") ? (this.debugLog(`keydown(capture) exit insert: key=${JSON.stringify(a.key)} code=${JSON.stringify(a.code)} mods=${a.ctrlKey ? "C" : ""}${a.altKey ? "A" : ""}${a.metaKey ? "D" : ""}${a.shiftKey ? "S" : ""} -> ${b}`), this.exitDelegatedInsertMode(b)) : (h && this.flushPendingMonacoSync(), this.debugLog(`keydown(capture) send: key=${JSON.stringify(a.key)} code=${JSON.stringify(a.code)} mods=${a.ctrlKey ? "C" : ""}${a.altKey ? "A" : ""}${a.metaKey ? "D" : ""}${a.shiftKey ? "S" : ""} -> ${b}`), this.sendInput(b));
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
- }, c = (a) => {
2205
- if (n(a)) {
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
- }, u = (a) => {
2213
- if (!n(a)) return;
2214
- if (this.compositionActive = !1, this.setPreedit(null), this.debugLog(`compositionend delegateInsert=${this.delegateInsertToMonaco} mode=${JSON.stringify(this.lastMode)} data=${JSON.stringify(a.data ?? "")}`), this.delegateInsertToMonaco) {
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 h = r(a.target);
2223
- if (M(this.lastMode)) {
2224
- const g = typeof a.data == "string" ? a.data : "", b = !g && h && h.tagName === "TEXTAREA" && h.value ? String(h.value) : !g && h?.textContent ? String(h.textContent) : "", _ = g || b;
2225
- _ && this.sendCmdlineImeText(_);
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
- h && h.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
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
- }, d = (a) => {
2233
- if (!n(a) || (this.compositionActive || (this.compositionActive = !0), this.delegateInsertToMonaco)) return;
2234
- const h = r(a.target), g = typeof a.data == "string" ? a.data : h && h.tagName === "TEXTAREA" && h.value ? String(h.value) : h?.textContent ? String(h.textContent) : "";
2235
- this.setPreedit(g || "");
2236
- }, f = (a) => {
2237
- if (n(a) && !(this.delegateInsertToMonaco && !this.exitingInsertMode)) {
2238
- r(a.target), s(a);
2239
- try {
2240
- a.preventDefault?.();
2241
- } catch {
2242
- }
2243
- if (M(this.lastMode) && !this.compositionActive) {
2244
- const h = a, g = typeof h.data == "string" ? h.data : "", b = typeof h.inputType == "string" ? String(h.inputType) : "";
2245
- !!!h.isComposing && !b.includes("Composition") && g && this.sendCmdlineImeText(g);
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
- }, p = (a) => {
2249
- if (!n(a) || this.delegateInsertToMonaco && !this.exitingInsertMode) return;
2250
- const h = r(a.target);
2251
- s(a);
2252
- const g = a;
2253
- if (this.ignoreNextInputEvent) {
2254
- this.ignoreNextInputEvent = !1;
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
- h?.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
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 (M(this.lastMode)) {
2263
- const b = typeof g.data == "string" ? g.data : "", _ = !b && h?.tagName === "TEXTAREA" && h.value ? String(h.value) : !b && h?.textContent ? String(h.textContent) : "", v = b || _;
2264
- v && this.sendCmdlineImeText(v);
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
- h?.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
2388
+ d?.tagName === "TEXTAREA" ? d.value = "" : d && (d.textContent = "");
2268
2389
  } catch {
2269
2390
  }
2270
2391
  }
2271
- }, m = (a) => {
2272
- if (!n(a) || this.delegateInsertToMonaco && !this.exitingInsertMode) return;
2273
- const h = r(a.target);
2274
- s(a);
2275
- const g = a.clipboardData?.getData("text/plain") ?? "";
2276
- g && (a.preventDefault(), this.ignoreNextInputEvent = !0, this.pasteText(g));
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
- h?.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
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
- x(i, "keydown", l, !0),
2285
- x(i, "beforeinput", f, !0),
2286
- x(i, "input", p, !0),
2287
- x(i, "paste", m, !0),
2288
- x(i, "compositionstart", c, !0),
2289
- x(i, "compositionupdate", d, !0),
2290
- x(i, "compositionend", u, !0)
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 d = i.getBoundingClientRect(), f = t.getBoundingClientRect();
2387
- s = Number.isFinite(f.left - d.left) ? f.left - d.left : 0, n = Number.isFinite(f.top - d.top) ? f.top - d.top : 0;
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 r = Array.isArray(this.visualVirtualRawRanges) ? this.visualVirtualRawRanges : [];
2391
- if (r.length === 0) {
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 l = this.editor.getOption(y.editor.EditorOption.fontInfo), c = Math.max(1, Number(l?.typicalHalfwidthCharacterWidth ?? l?.maxDigitWidth ?? 0) || 0), u = document.createDocumentFragment();
2399
- for (const d of r) {
2400
- const f = Number(d?.start?.line), p = Number(d?.start_vcol), m = Number(d?.end_vcol), a = Number(d?.disp);
2401
- if (!Number.isFinite(f) || !Number.isFinite(p) || !Number.isFinite(m) || !Number.isFinite(a)) continue;
2402
- const h = f + 1;
2403
- if (h < 1 || h > e.getLineCount()) continue;
2404
- const g = Math.min(p, m), b = Math.max(p, m), _ = this.editor.getScrolledVisiblePosition(new y.Position(h, 1));
2405
- if (!_) continue;
2406
- const v = b - g + 1;
2407
- if (v <= 0) continue;
2408
- const T = _.left + Math.max(0, g - 1) * c, E = v * c;
2409
- if (!Number.isFinite(E) || E <= 0) continue;
2410
- const C = document.createElement("div");
2411
- C.className = "monaco-neovim-visual-virtual", C.style.left = `${Math.max(0, T - s)}px`, C.style.top = `${Math.max(0, _.top - n)}px`, C.style.width = `${E}px`, C.style.height = `${Math.max(0, _.height)}px`, u.appendChild(C);
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(u);
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((r) => r.startLineNumber)), i = Math.max(...n.map((r) => r.endLineNumber)));
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(ae, [e, i]);
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 : [], r = i.current && typeof i.current == "object" ? i.current : null, l = r && Number.isFinite(Number(r.l)) ? `${Number(r.l)}:${Number(r.s)}:${Number(r.e)}` : null, c = [], u = 2e3, d = /* @__PURE__ */ new Map(), f = (p) => {
2490
- if (d.has(p)) return d.get(p);
2491
- const m = e.getLineContent(p) ?? "";
2492
- return d.set(p, m), m;
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 p = 0; p < n.length && c.length < u; p += 1) {
2495
- const m = n[p], a = Number(m?.l), h = Number(m?.s), g = Number(m?.e);
2496
- if (!Number.isFinite(a) || !Number.isFinite(h) || !Number.isFinite(g)) continue;
2497
- const b = a + 1;
2498
- if (b < 1 || b > e.getLineCount()) continue;
2499
- const _ = f(b), v = I(_, Math.max(0, h)) + 1, T = I(_, Math.max(0, g)) + 1;
2500
- if (T <= v) continue;
2501
- const E = `${a}:${h}:${g}`, C = l && E === l ? "monaco-neovim-search-current" : "monaco-neovim-search-match";
2502
- c.push({
2503
- range: new y.Range(b, v, b, T),
2504
- options: { inlineClassName: C }
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, c);
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 : ye(e), r = n === "V", l = n === "", c = [];
2517
- if (r) {
2518
- let u = 1 / 0, d = -1 / 0;
2519
- for (const f of t) {
2520
- const p = f.getStartPosition(), m = f.getEndPosition();
2521
- u = Math.min(u, p.lineNumber, m.lineNumber), d = Math.max(d, p.lineNumber, m.lineNumber);
2522
- }
2523
- Number.isFinite(u) && Number.isFinite(d) && d >= u && c.push({
2524
- range: new y.Range(u, 1, d, 1),
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 (!l)
2528
- for (const u of t) {
2529
- const d = u.getStartPosition(), f = u.getEndPosition();
2530
- c.push({
2531
- range: y.Range.fromPositions(d, f),
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
- l ? (this.visualVirtualRawRanges = Array.isArray(i) ? i : [], this.visualVirtualActive = !0, this.renderVisualVirtualOverlay()) : this.clearVisualVirtualOverlay();
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, c), this.visualSelectionActive = c.length > 0 || l;
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 u = this.editor.getPosition();
2543
- if (u)
2728
+ const g = this.editor.getPosition();
2729
+ if (g)
2544
2730
  try {
2545
- this.suppressCursorSync = !0, this.editor.setSelection(new y.Selection(u.lineNumber, u.column, u.lineNumber, u.column));
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 e = typeof t == "string" ? t : "";
2554
- if (!e || e === this.lastMode) return;
2555
- const i = this.lastMode;
2556
- this.lastMode = e, M(e) && (this.ignoreNextInputEvent = !1), this.setMonacoHighlightsSuppressed(S(e));
2557
- const s = H(e) && !this.recordingRegister;
2558
- if (s !== this.delegateInsertToMonaco) {
2559
- this.delegateInsertToMonaco = s, this.setEditorReadOnly(!s);
2560
- const n = this.ensureActiveState();
2561
- if (s) {
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 r = this.recentNormalKeys, l = r.slice(-1), c = r.slice(-2), u = /* @__PURE__ */ new Set(["i", "a", "I", "A", "o", "O", "s", "S", "C", "R"]);
2565
- if (c === "cc")
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 (u.has(l))
2568
- this.lastDelegatedInsertPrefix = l;
2753
+ else if (m.has(h))
2754
+ this.lastDelegatedInsertPrefix = h;
2569
2755
  else {
2570
- const d = r.lastIndexOf("c");
2571
- if (d >= 0) {
2572
- let f = d;
2573
- for (; f > 0 && /\d/.test(r[f - 1] ?? ""); ) f -= 1;
2574
- this.lastDelegatedInsertPrefix = r.slice(f);
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
- n && (n.shadowLines = this.editor.getModel()?.getLinesContent() ?? null, n.pendingBufEdits = [], n.pendingFullSync = !1, n.pendingCursorSync = !1);
2765
+ g && (g.shadowLines = this.editor.getModel()?.getLinesContent() ?? null, g.pendingBufEdits = [], g.pendingFullSync = !1, g.pendingCursorSync = !1);
2580
2766
  } else
2581
- n && ((n.pendingBufEdits.length || n.pendingCursorSync || n.pendingFullSync) && this.flushPendingMonacoSync(), n.shadowLines = null, n.pendingBufEdits = [], n.pendingFullSync = !1, n.pendingCursorSync = !1), this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1;
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 && !H(e)) {
2769
+ if (this.exitingInsertMode && !Y(this.lastMode)) {
2584
2770
  this.exitInsertTimer && (clearTimeout(this.exitInsertTimer), this.exitInsertTimer = null), this.exitingInsertMode = !1;
2585
- const n = this.pendingKeysAfterExit;
2586
- this.pendingKeysAfterExit = "", n && this.sendInput(n);
2771
+ const g = this.pendingKeysAfterExit;
2772
+ this.pendingKeysAfterExit = "", g && this.sendInput(g);
2587
2773
  }
2588
- if (this.applyCursorStyle(e), this.opts.onModeChange && this.opts.onModeChange(e), this.updateVisualSelection(e), S(i) && !S(e))
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 n = this.editor.getPosition() ?? this.lastCursorPos;
2591
- n && !this.compositionActive && (this.suppressCursorSync = !0, this.editor.setSelection(new y.Selection(n.lineNumber, n.column, n.lineNumber, n.column)), this.suppressCursorSync = !1);
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.scheduleSearchHighlightRefresh();
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 = w(s, Math.max(0, i.column - 1));
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.ignoreNextInputEvent = !0, t.preventDefault(), this.pendingKeysAfterExit += s;
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 (M(this.lastMode) && !this.compositionActive && !e.isComposing && !e.getModifierState?.("AltGraph") && !e.ctrlKey && !e.metaKey && typeof e.key == "string" && e.key.length === 1) {
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.ignoreNextInputEvent = !0, t.preventDefault(), this.lastMode.startsWith("n")) {
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
- !H(this.lastMode) && i.length === 1 && !i.startsWith("<") && (this.recentNormalKeys = (this.recentNormalKeys + i).slice(-16)), this.sendInput(i);
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), r = s ? s.getLineContent(e) ?? "" : "", l = s ? w(r, n) : n;
2773
- this.sendNotify("nvim_win_set_cursor", [0, [e, l]]);
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
- S(this.lastMode) && this.sendInput("<Esc>");
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, r = Math.max(0, t.positionColumn - 1), l = e.getLineContent(i) ?? "", c = e.getLineContent(n) ?? "", u = w(l, s), d = w(c, r);
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, u, n, d]);
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, r = n.startLineNumber - 1, l = n.endLineNumber - 1;
2887
- if (r < 0 || l < 0) return;
2888
- if (i.shadowLines[r] == null || i.shadowLines[l] == null) {
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 c = i.shadowLines[r] ?? "", u = i.shadowLines[l] ?? "", d = Math.max(0, n.startColumn - 1), f = Math.max(0, n.endColumn - 1), p = w(c, d), m = w(u, f), a = String(s.text ?? ""), h = a.length ? a.split(/\r?\n/) : [];
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 g = Math.max(0, Number(s.rangeLength ?? 0) || 0);
2895
- r === l && !a.includes(`
2896
- `) ? (g > 0 && (this.dotRepeatBackspaces += g, this.dotRepeatKeys += "<BS>".repeat(g)), a && (this.dotRepeatKeys += F(a, !0)), this.dotRepeatKeys.length > 2e4 && (this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1)) : (this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1);
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: r, startColByte: p, endRow: l, endColByte: m, lines: h }), be(i.shadowLines, r, d, l, f, a), i.pendingCursorSync = !0, this.scheduleFlushPendingMonacoSync();
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) ?? "", r = w(n, Math.max(0, i.column - 1));
2935
- this.sendNotify("nvim_win_set_cursor", [0, [s, r]]);
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", r = this.opts.hostCommands ? "true" : "false", c = `
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 m = api.nvim_get_mode().mode or ""
2985
- vim.rpcnotify(chan, "monaco_mode", m)
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 ${r} then
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(c, [e]), this.hostAutocmdInstalled = !0;
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 r = await s.readFile(n);
3093
- if (r == null) return;
3094
- const l = r instanceof Uint8Array ? new TextDecoder().decode(r) : String(r);
3095
- await this.openText({ path: n, text: l }), this.opts.status(`opened: ${n}`);
3096
- } catch (r) {
3097
- this.opts.status(`edit failed: ${r?.message ?? r}`, !0);
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(), r = n ? n.getValue() : "";
3103
- let l = typeof i.path == "string" ? String(i.path) : "";
3104
- if (!l)
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 c = await this.rpcCall("nvim_buf_get_name", [0]);
3107
- typeof c == "string" && (l = c);
3311
+ const a = await this.rpcCall("nvim_buf_get_name", [0]);
3312
+ typeof a == "string" && (c = a);
3108
3313
  } catch {
3109
3314
  }
3110
- if (l || (l = this.opts.seedName), !s.writeFile) {
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(l, r);
3320
+ await s.writeFile(c, o);
3116
3321
  try {
3117
- await this.rpcCall("nvim_buf_set_name", [0, l]);
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 c = this.getActiveState();
3125
- c && (c.name && c.name !== l && this.buffersByName.delete(c.name), c.name = l, this.buffersByName.set(l, c.id)), this.opts.status(`written: ${l}`), e === "wq" && this.opts.status("wq requested (provide onHostCommand to close the editor)");
3126
- } catch (c) {
3127
- this.opts.status(`write failed: ${c?.message ?? c}`, !0);
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 l = [""];
3353
+ let c = [""];
3149
3354
  try {
3150
- const p = await this.rpcCall("nvim_buf_get_lines", [e, 0, -1, !1]);
3151
- Array.isArray(p) && (l = p.map((m) => String(m ?? "")));
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 c = y.Uri.from({ scheme: "nvim", authority: "buf", path: `/${e}` }), u = l.join(`
3155
- `), d = s && y.languages.getLanguages().some((p) => p.id === s), f = y.editor.createModel(u, d ? s : void 0, c);
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: f,
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.scheduleSearchHighlightRefresh();
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 r = await this.rpcCall("nvim_create_buf", [!0, !1]);
3204
- n = N(r) ?? Number(r);
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 = (s) => {
3238
- const n = (s || "").split(/\r?\n/);
3239
- this.sendRpcResponse(t, null, [n, "v"]);
3240
- }, i = this.opts.clipboard;
3241
- if (i === null) {
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 (i?.readText) {
3246
- i.readText().then((s) => e(s || "")).catch(() => {
3247
- const s = window.prompt("Paste text");
3248
- e(s || "");
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 s = window.prompt("Paste text");
3254
- e(s || "");
3465
+ const n = i();
3466
+ e(n ?? this.lastClipboardText ?? "");
3255
3467
  return;
3256
3468
  }
3257
- navigator.clipboard.readText().then((s) => e(s || "")).catch(() => {
3258
- const s = window.prompt("Paste text");
3259
- e(s || "");
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), r = i ? i.validatePosition(new y.Position(s, n)) : new y.Position(s, n);
3264
- if (this.debugLog(`updateCursor: line=${r.lineNumber} col=${r.column} (from line=${s} col=${n}) visual=${this.visualSelectionActive} mode=${JSON.stringify(this.lastMode)}`), this.lastCursorPos = r, this.compositionActive) return;
3265
- const l = this.editor.getPosition();
3266
- l && l.lineNumber === r.lineNumber && l.column === r.column || (this.suppressCursorSync = !0, this.editor.setPosition(this.lastCursorPos), this.visualSelectionActive && this.editor.setSelection(new y.Selection(r.lineNumber, r.column, r.lineNumber, r.column)), this.applyScrolloff(this.lastCursorPos) || this.editor.revealPositionInCenterIfOutsideViewport(this.lastCursorPos), this.suppressCursorSync = !1), this.scheduleSearchHighlightRefresh();
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 = K(this.editor, i, s), r = new y.Position(n.line, n.col), l = typeof performance < "u" && performance.now ? performance.now() : Date.now();
3291
- if (this.optimisticCursorPos && this.optimisticCursorUntil > l) {
3292
- const c = this.optimisticCursorPrevPos;
3293
- c && r.lineNumber === c.lineNumber && r.column === c.column || r.lineNumber < this.optimisticCursorPos.lineNumber || r.lineNumber === this.optimisticCursorPos.lineNumber && r.column < this.optimisticCursorPos.column || (this.optimisticCursorPos = null, this.optimisticCursorPrevPos = null, this.optimisticCursorUntil = 0, this.updateCursor(r.lineNumber, r.column));
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(r.lineNumber, r.column);
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", r = i ? this.initialCursorWidth || 1 : this.typicalFullWidth;
3314
- s === this.lastCursorStyle && n === this.lastCursorBlink && r === this.lastCursorWidth || (this.editor.updateOptions({ cursorStyle: s, cursorBlinking: n, cursorWidth: r }), this.lastCursorStyle = s, this.lastCursorBlink = n, this.lastCursorWidth = r);
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 = S(t), i = ++this.visualSelectionToken;
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: r } = await this.fetchVisualRanges();
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, r);
3546
+ this.applyVisualDecorations(s, t, n, o);
3326
3547
  } catch {
3327
3548
  }
3328
3549
  }
3329
3550
  async fetchVisualRanges() {
3330
- const t = await this.execLua(le, []);
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(fe(this.editor)).filter((n) => !!n), raw: e, tail: i };
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 = V(e, 0.45), s = V(e, 0.3);
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 = W(t);
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 = W(t);
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 = N(t);
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 ve(o, t = {}) {
3410
- return new ce(o, t);
3630
+ function Se(l, t = {}) {
3631
+ return new fe(l, t);
3411
3632
  }
3412
- function R(o, t, e) {
3413
- return Math.min(Math.max(o, t), e);
3633
+ function k(l, t, e) {
3634
+ return Math.min(Math.max(l, t), e);
3414
3635
  }
3415
- function B(o) {
3636
+ function E(l) {
3416
3637
  try {
3417
- return new TextEncoder().encode(String(o ?? "")).length;
3638
+ return new TextEncoder().encode(String(l ?? "")).length;
3418
3639
  } catch {
3419
- return String(o ?? "").length;
3640
+ return String(l ?? "").length;
3420
3641
  }
3421
3642
  }
3422
- function K(o, t, e) {
3423
- const i = Math.max(1, Number(t) || 1), s = Math.max(1, (Number(e) || 0) + 1), n = o.getModel();
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 r = n.getLineCount(), l = R(i, 1, r), c = n.getLineContent(l) ?? "", u = n.getLineMaxColumn(l), d = Math.max(0, Number(e) || 0), f = I(c, d), p = R(f + 1, 1, u);
3427
- return { line: l, col: p };
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 F(o, t = !0) {
3430
- const e = String(o ?? "");
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 ue(o) {
3438
- const t = o.key;
3658
+ function Ze(l) {
3659
+ const t = l.key;
3439
3660
  if (!t || t === "Dead" || t === "Unidentified") return null;
3440
- const e = !!o.getModifierState?.("AltGraph"), i = o.ctrlKey && !e, s = o.altKey && !e, n = o.metaKey && !e, r = o.shiftKey, l = (f) => f === "<" ? "lt" : f, c = (f) => f === "<" ? "<lt>" : f, u = (f, p = !1) => {
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-"), p && r && m.push("S-"), s && m.push("A-"), n && m.push("D-");
3443
- const a = l(f);
3444
- return m.length ? `<${m.join("")}${a}>` : `<${a}>`;
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 o.code == "string" && o.code.startsWith("Numpad") || typeof KeyboardEvent?.DOM_KEY_LOCATION_NUMPAD == "number" && o.location === KeyboardEvent.DOM_KEY_LOCATION_NUMPAD) {
3447
- switch (o.code) {
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 u("kEnter", !0);
3670
+ return g("kEnter", !0);
3450
3671
  case "NumpadAdd":
3451
- return u("kPlus", !0);
3672
+ return g("kPlus", !0);
3452
3673
  case "NumpadSubtract":
3453
- return u("kMinus", !0);
3674
+ return g("kMinus", !0);
3454
3675
  case "NumpadMultiply":
3455
- return u("kMultiply", !0);
3676
+ return g("kMultiply", !0);
3456
3677
  case "NumpadDivide":
3457
- return u("kDivide", !0);
3678
+ return g("kDivide", !0);
3458
3679
  case "NumpadDecimal":
3459
- return u("kPoint", !0);
3680
+ return g("kPoint", !0);
3460
3681
  }
3461
- if (/^\d$/.test(t)) return u(`k${t}`, !0);
3682
+ if (/^\d$/.test(t)) return g(`k${t}`, !0);
3462
3683
  }
3463
3684
  switch (t) {
3464
3685
  case "Backspace":
3465
- return u("BS", !0);
3686
+ return g("BS", !0);
3466
3687
  case "Enter":
3467
- return u("CR", !0);
3688
+ return g("CR", !0);
3468
3689
  case "Escape":
3469
- return u("Esc", !0);
3690
+ return g("Esc", !0);
3470
3691
  case "Tab":
3471
- return r && !i && !s && !n ? "<S-Tab>" : u("Tab", !0);
3692
+ return o && !i && !s && !n ? "<S-Tab>" : g("Tab", !0);
3472
3693
  case "ArrowUp":
3473
- return u("Up", !0);
3694
+ return g("Up", !0);
3474
3695
  case "ArrowDown":
3475
- return u("Down", !0);
3696
+ return g("Down", !0);
3476
3697
  case "ArrowLeft":
3477
- return u("Left", !0);
3698
+ return g("Left", !0);
3478
3699
  case "ArrowRight":
3479
- return u("Right", !0);
3700
+ return g("Right", !0);
3480
3701
  case "Delete":
3481
- return u("Del", !0);
3702
+ return g("Del", !0);
3482
3703
  case "Home":
3483
- return u("Home", !0);
3704
+ return g("Home", !0);
3484
3705
  case "End":
3485
- return u("End", !0);
3706
+ return g("End", !0);
3486
3707
  case "PageUp":
3487
- return u("PageUp", !0);
3708
+ return g("PageUp", !0);
3488
3709
  case "PageDown":
3489
- return u("PageDown", !0);
3710
+ return g("PageDown", !0);
3490
3711
  case "Insert":
3491
- return u("Insert", !0);
3712
+ return g("Insert", !0);
3492
3713
  }
3493
- if (/^F\d{1,2}$/.test(t)) return u(t, !0);
3714
+ if (/^F\d{1,2}$/.test(t)) return g(t, !0);
3494
3715
  if (t.length === 1) {
3495
- if (!i && !s && !n) return c(t);
3716
+ if (!i && !s && !n) return a(t);
3496
3717
  if (t === " " && i && !s && !n) return "<Nul>";
3497
- const f = /^[A-Za-z]$/.test(t) ? t.toLowerCase() : t, p = l(f);
3498
- return `<${(i ? "C-" : "") + (s ? "A-" : "") + (n ? "D-" : "")}${p}>`;
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 he(o) {
3503
- if (!o || o.length === 0) return null;
3504
- const t = o[0];
3505
- if (o.length === 1)
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(o.buffer, o.byteOffset, o.byteLength);
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 de(o) {
3530
- return o instanceof Uint8Array ? o : o instanceof ArrayBuffer ? new Uint8Array(o) : Array.isArray(o) ? new Uint8Array(o) : Number.isInteger(o) ? new Uint8Array([o & 255]) : o && o.type === "Buffer" && Array.isArray(o.data) ? new Uint8Array(o.data) : null;
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 N(o) {
3533
- if (o && typeof o == "object" && typeof o.type == "number") {
3534
- const e = de(o.data);
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 = he(e);
3757
+ const i = Ge(e);
3537
3758
  if (i != null && i > 0) return i;
3538
3759
  }
3539
3760
  }
3540
- const t = Number(o);
3761
+ const t = Number(l);
3541
3762
  return Number.isInteger(t) && t > 0 ? t : null;
3542
3763
  }
3543
- function I(o, t) {
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 >= o.length)
3768
+ if (i >= l.length)
3548
3769
  return i + (s - e);
3549
- const n = o.codePointAt(i), r = $(n ?? 0);
3550
- if (e + r > s) return i;
3551
- e += r, i += r === 4 ? 2 : 1;
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 w(o, t) {
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 < o.length; ) {
3559
- const n = o.codePointAt(s), r = $(n ?? 0);
3560
- i += r, s += r === 4 ? 2 : 1;
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 $(o) {
3565
- return o == null ? 0 : o <= 127 ? 1 : o <= 2047 ? 2 : o >= 55296 && o <= 57343 ? 4 : o < 65535 ? 3 : 4;
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 fe(o) {
3788
+ function Ae(l) {
3568
3789
  return (t) => {
3569
3790
  if (!t || !t.start || !t.end) return null;
3570
- const e = O(o, t.start, !1), i = O(o, t.end, !!t.inclusive);
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(o, t, e) {
3795
+ function O(l, t, e) {
3575
3796
  if (!t || typeof t.line != "number" || typeof t.col != "number") return null;
3576
- const i = o.getModel(), s = R(t.line + 1, 1, i?.getLineCount() || 1 / 0);
3797
+ const i = l.getModel(), s = k(t.line + 1, 1, i?.getLineCount() || 1 / 0);
3577
3798
  if (!i) {
3578
- const d = Math.max(1, t.col + 1);
3579
- return { lineNumber: s, column: d + (e ? 1 : 0) };
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) ?? "", r = Math.max(0, Number(t.col) || 0);
3582
- let l = r;
3802
+ const n = i.getLineContent(s) ?? "", o = Math.max(0, Number(t.col) || 0);
3803
+ let c = o;
3583
3804
  if (e) {
3584
- const d = I(n, r);
3585
- if (d < n.length) {
3586
- const f = n.codePointAt(d);
3587
- l = r + $(f ?? 0);
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 c = I(n, l) + 1, u = i.getLineMaxColumn(s);
3591
- return { lineNumber: s, column: R(c, 1, u) };
3811
+ const a = K(n, c) + 1, g = i.getLineMaxColumn(s);
3812
+ return { lineNumber: s, column: k(a, 1, g) };
3592
3813
  }
3593
- function S(o) {
3594
- const t = typeof o == "string" ? o : "";
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 pe(o) {
3598
- if (!o || !Array.isArray(o) || o.length === 0) return;
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 o) {
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 me(o, t) {
3610
- const e = Array.isArray(t) ? t.filter(Boolean) : [], i = Array.isArray(o) ? o.filter(Boolean) : [], s = [...e, ...i];
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 V(o, t) {
3614
- const e = o.replace("#", "");
3615
- if (e.length !== 6) return o;
3616
- const i = Math.round(R(t, 0, 1) * 255);
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 W(o) {
3620
- if (!o || typeof o != "object") return null;
3621
- const t = o, e = t.background ?? t.bg;
3622
- return typeof e == "number" && e >= 0 ? ge(e) : typeof t.background == "string" && t.background.startsWith("#") ? t.background : typeof t.bg == "string" && t.bg.startsWith("#") ? t.bg : null;
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 ge(o) {
3625
- return `#${Number(o >>> 0).toString(16).padStart(6, "0").slice(-6)}`;
3845
+ function Ve(l) {
3846
+ return `#${Number(l >>> 0).toString(16).padStart(6, "0").slice(-6)}`;
3626
3847
  }
3627
- function x(o, t, e, i) {
3628
- return o.addEventListener(t, e, i), { dispose: () => o.removeEventListener(t, e, i) };
3848
+ function X(l, t, e, i) {
3849
+ return l.addEventListener(t, e, i), { dispose: () => l.removeEventListener(t, e, i) };
3629
3850
  }
3630
- function H(o) {
3631
- return (typeof o == "string" ? o : "").startsWith("i");
3851
+ function Y(l) {
3852
+ return (typeof l == "string" ? l : "").startsWith("i");
3632
3853
  }
3633
- function ye(o) {
3634
- const t = typeof o == "string" ? o : "";
3854
+ function we(l) {
3855
+ const t = typeof l == "string" ? l : "";
3635
3856
  return t.length ? t[t.length - 1] : "";
3636
3857
  }
3637
- function M(o) {
3638
- const t = typeof o == "string" ? o : "";
3858
+ function S(l) {
3859
+ const t = typeof l == "string" ? l : "";
3639
3860
  return t === "c" || t.startsWith("c");
3640
3861
  }
3641
- function be(o, t, e, i, s, n) {
3642
- const r = o[t] ?? "", l = o[i] ?? "", c = r.slice(0, Math.max(0, e)), u = l.slice(Math.max(0, s)), f = String(n ?? "").split(/\r?\n/);
3643
- let p;
3644
- if (f.length <= 1)
3645
- p = [`${c}${f[0] ?? ""}${u}`];
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 = `${c}${f[0] ?? ""}`, a = `${f[f.length - 1] ?? ""}${u}`, h = f.slice(1, -1);
3648
- p = [m, ...h, a];
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
- o.splice(t, Math.max(0, i - t + 1), ...p);
3871
+ l.splice(t, Math.max(0, i - t + 1), ...u);
3651
3872
  }
3652
- function k(o) {
3653
- if (!o) return "";
3654
- if (typeof o == "string") return o;
3655
- if (!Array.isArray(o)) return "";
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 o) {
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 += k(e);
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 _e(o) {
3671
- if (!Array.isArray(o)) return [];
3891
+ function We(l) {
3892
+ if (!Array.isArray(l)) return [];
3672
3893
  const t = [];
3673
- for (const e of o) {
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
- ce as MonacoNeovimClient,
3693
- ie as NeovimWasmSession,
3694
- ve as createMonacoNeovim,
3695
- Ce as defaultWorkerUrl,
3696
- we as defaultWorkerUrlAsyncify,
3697
- ee as isSharedArrayBufferAvailable
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
  };