cesium-mars-op-cog 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import * as k from "cesium";
2
- import { Event as P, GeographicTilingScheme as z, Rectangle as T } from "cesium";
3
- import C from "proj4";
4
- import { onUnmounted as E, ref as x, shallowRef as S } from "vue";
5
- var R = class {
1
+ import * as N from "cesium";
2
+ import { Event as p, GeographicTilingScheme as K, Rectangle as V } from "cesium";
3
+ import D from "proj4";
4
+ import { onUnmounted as X, ref as u, shallowRef as S } from "vue";
5
+ var w = class {
6
6
  poolSize;
7
7
  maxLoadPerWorker;
8
8
  workers = [];
@@ -14,141 +14,137 @@ var R = class {
14
14
  workerInitializing = /* @__PURE__ */ new Set();
15
15
  initPayload = null;
16
16
  _initPromise = null;
17
- constructor(e, t = navigator.hardwareConcurrency || 4, r = 4) {
18
- this.poolSize = t, this.maxLoadPerWorker = r;
19
- for (let i = 0; i < t; i++) {
20
- const s = e();
21
- s.onmessage = (o) => this._handleMessage(o, i), s.onerror = (o) => console.error("Worker error:", o), this.workers.push(s), this.workerLoad.set(i, 0);
17
+ constructor(g, I = navigator.hardwareConcurrency || 4, C = 4) {
18
+ this.poolSize = I, this.maxLoadPerWorker = C;
19
+ for (let A = 0; A < I; A++) {
20
+ const i = g();
21
+ i.onmessage = (e) => this._handleMessage(e, A), i.onerror = (e) => console.error("Worker error:", e), this.workers.push(i), this.workerLoad.set(A, 0);
22
22
  }
23
23
  }
24
- async initOne(e) {
25
- this.initPayload = e, this.workerInitialized.clear(), this.workerInitializing.clear();
26
- const t = await new Promise((r, i) => {
27
- const s = ++this.taskIdCounter;
28
- this.taskMap.set(s, {
29
- resolve: r,
30
- reject: i
24
+ async initOne(g) {
25
+ this.initPayload = g, this.workerInitialized.clear(), this.workerInitializing.clear();
26
+ const I = await new Promise((C, A) => {
27
+ const i = ++this.taskIdCounter;
28
+ this.taskMap.set(i, {
29
+ resolve: C,
30
+ reject: A
31
31
  }), this.workerLoad.set(0, (this.workerLoad.get(0) || 0) + 1), this.workerInitializing.add(0), this.workers[0].postMessage({
32
32
  type: "INIT",
33
- payload: e,
34
- taskId: s
33
+ payload: g,
34
+ taskId: i
35
35
  });
36
36
  });
37
- return this._initPromise = this._initRemainingWorkers(), t;
37
+ return this._initPromise = this._initRemainingWorkers(), I;
38
38
  }
39
39
  async _initRemainingWorkers() {
40
- const e = [];
41
- for (let t = 1; t < this.poolSize; t++) !this.workerInitialized.has(t) && !this.workerInitializing.has(t) && e.push(new Promise((r) => {
42
- this.workerInitializing.add(t);
43
- const i = ++this.taskIdCounter;
44
- this.taskMap.set(i, {
45
- resolve: () => r(),
46
- reject: () => r()
47
- }), this.workerLoad.set(t, (this.workerLoad.get(t) || 0) + 1), this.workers[t].postMessage({
40
+ const g = [];
41
+ for (let I = 1; I < this.poolSize; I++) !this.workerInitialized.has(I) && !this.workerInitializing.has(I) && g.push(new Promise((C) => {
42
+ this.workerInitializing.add(I);
43
+ const A = ++this.taskIdCounter;
44
+ this.taskMap.set(A, {
45
+ resolve: () => C(),
46
+ reject: () => C()
47
+ }), this.workerLoad.set(I, (this.workerLoad.get(I) || 0) + 1), this.workers[I].postMessage({
48
48
  type: "LAZY_INIT",
49
49
  payload: this.initPayload,
50
- taskId: i
50
+ taskId: A
51
51
  });
52
52
  }));
53
- await Promise.allSettled(e);
53
+ await Promise.allSettled(g);
54
54
  }
55
55
  _getLeastLoadedWorker() {
56
- let e = -1, t = 1 / 0;
57
- for (const r of this.workerInitialized) {
58
- const i = this.workerLoad.get(r) ?? 0;
59
- i < t && (t = i, e = r);
56
+ let g = -1, I = 1 / 0;
57
+ for (const C of this.workerInitialized) {
58
+ const A = this.workerLoad.get(C) ?? 0;
59
+ A < I && (I = A, g = C);
60
60
  }
61
- if (e === -1)
62
- for (const [r, i] of this.workerLoad.entries()) i < t && (t = i, e = r);
63
- return e >= 0 ? e : 0;
61
+ if (g === -1)
62
+ for (const [C, A] of this.workerLoad.entries()) A < I && (I = A, g = C);
63
+ return g >= 0 ? g : 0;
64
64
  }
65
- _handleMessage(e, t) {
66
- const { type: r, taskId: i, payload: s } = e.data, o = this.taskMap.get(i);
67
- if (!o) return;
68
- const n = this.workerLoad.get(t) || 1;
69
- this.workerLoad.set(t, Math.max(0, n - 1)), r === "INIT_DONE" ? (this.workerInitialized.add(t), this.workerInitializing.delete(t), o.resolve(s)) : r === "TILE_DONE" ? o.resolve(s) : r === "ERROR" && (this.workerInitializing.has(t) && (this.workerInitialized.add(t), this.workerInitializing.delete(t)), o.reject(new Error(s?.error || "Worker error"))), this.taskMap.delete(i), this._processQueue();
65
+ _handleMessage(g, I) {
66
+ const { type: C, taskId: A, payload: i } = g.data, e = this.taskMap.get(A);
67
+ if (!e) return;
68
+ const o = this.workerLoad.get(I) || 1;
69
+ this.workerLoad.set(I, Math.max(0, o - 1)), C === "INIT_DONE" ? (this.workerInitialized.add(I), this.workerInitializing.delete(I), e.resolve(i)) : C === "TILE_DONE" ? e.resolve(i) : C === "ERROR" && (this.workerInitializing.has(I) && (this.workerInitialized.add(I), this.workerInitializing.delete(I)), e.reject(new Error(i?.error || "Worker error"))), this.taskMap.delete(A), this._processQueue();
70
70
  }
71
71
  _processQueue() {
72
72
  if (this.queue.length === 0) return;
73
- let e = 0;
74
- const t = Math.min(this.queue.length, this.poolSize);
75
- for (let r = 0; r < t; r++) {
76
- let i = -1, s = 1 / 0;
77
- for (const a of this.workerInitialized) {
78
- const d = this.workerLoad.get(a) ?? 0;
79
- d < this.maxLoadPerWorker && d < s && (s = d, i = a);
73
+ let g = 0;
74
+ const I = Math.min(this.queue.length, this.poolSize);
75
+ for (let C = 0; C < I; C++) {
76
+ let A = -1, i = 1 / 0;
77
+ for (const l of this.workerInitialized) {
78
+ const c = this.workerLoad.get(l) ?? 0;
79
+ c < this.maxLoadPerWorker && c < i && (i = c, A = l);
80
80
  }
81
- if (i === -1) {
82
- for (let a = 0; a < this.poolSize; a++) if (!this.workerInitialized.has(a) && !this.workerInitializing.has(a)) {
83
- this.workerInitializing.add(a);
84
- const d = ++this.taskIdCounter;
85
- this.taskMap.set(d, {
81
+ if (A === -1) {
82
+ for (let l = 0; l < this.poolSize; l++) if (!this.workerInitialized.has(l) && !this.workerInitializing.has(l)) {
83
+ this.workerInitializing.add(l);
84
+ const c = ++this.taskIdCounter;
85
+ this.taskMap.set(c, {
86
86
  resolve: () => {
87
87
  },
88
88
  reject: () => {
89
89
  }
90
- }), this.workerLoad.set(a, (this.workerLoad.get(a) || 0) + 1), this.workers[a].postMessage({
90
+ }), this.workerLoad.set(l, (this.workerLoad.get(l) || 0) + 1), this.workers[l].postMessage({
91
91
  type: "LAZY_INIT",
92
92
  payload: this.initPayload,
93
- taskId: d
93
+ taskId: c
94
94
  });
95
95
  break;
96
96
  }
97
97
  break;
98
98
  }
99
- const o = this.queue.shift();
100
- e++;
101
- const n = ++this.taskIdCounter;
102
- this.taskMap.set(n, {
103
- resolve: o.resolve,
104
- reject: o.reject
105
- }), this.workerLoad.set(i, (this.workerLoad.get(i) || 0) + 1), this.workers[i].postMessage({
106
- type: o.type,
107
- payload: o.payload,
108
- taskId: n
99
+ const e = this.queue.shift();
100
+ g++;
101
+ const o = ++this.taskIdCounter;
102
+ this.taskMap.set(o, {
103
+ resolve: e.resolve,
104
+ reject: e.reject
105
+ }), this.workerLoad.set(A, (this.workerLoad.get(A) || 0) + 1), this.workers[A].postMessage({
106
+ type: e.type,
107
+ payload: e.payload,
108
+ taskId: o
109
109
  });
110
110
  }
111
111
  }
112
- execute(e, t) {
113
- return new Promise((r, i) => {
112
+ execute(g, I) {
113
+ return new Promise((C, A) => {
114
114
  this.queue.push({
115
- type: e,
116
- payload: t,
117
- resolve: r,
118
- reject: i
115
+ type: g,
116
+ payload: I,
117
+ resolve: C,
118
+ reject: A
119
119
  }), this._processQueue();
120
120
  });
121
121
  }
122
122
  terminate() {
123
- for (const e of this.queue) e.reject?.(/* @__PURE__ */ new Error("WorkerPool 已终止"));
124
- for (const [, e] of this.taskMap) e.reject?.(/* @__PURE__ */ new Error("WorkerPool 已终止"));
125
- for (const e of this.workers) e.terminate();
123
+ for (const g of this.queue) g.reject?.(/* @__PURE__ */ new Error("WorkerPool 已终止"));
124
+ for (const [, g] of this.taskMap) g.reject?.(/* @__PURE__ */ new Error("WorkerPool 已终止"));
125
+ for (const g of this.workers) g.terminate();
126
126
  this.workers = [], this.queue = [], this.taskMap.clear(), this.workerInitialized.clear(), this.workerInitializing.clear();
127
127
  }
128
- };
129
- function G(e) {
130
- return new Worker("/assets/cogTile.worker-BmAOLWmU.js", { name: e?.name });
131
- }
132
- var W = class {
128
+ }, v = class {
133
129
  max;
134
130
  map;
135
131
  onEvict;
136
- constructor(e = 256, t) {
137
- this.max = e, this.map = /* @__PURE__ */ new Map(), this.onEvict = t ?? null;
132
+ constructor(g = 256, I) {
133
+ this.max = g, this.map = /* @__PURE__ */ new Map(), this.onEvict = I ?? null;
138
134
  }
139
- get(e) {
140
- if (!this.map.has(e)) return;
141
- const t = this.map.get(e);
142
- return this.map.delete(e), this.map.set(e, t), t;
135
+ get(g) {
136
+ if (!this.map.has(g)) return;
137
+ const I = this.map.get(g);
138
+ return this.map.delete(g), this.map.set(g, I), I;
143
139
  }
144
- set(e, t) {
145
- if (this.map.has(e) && this.map.delete(e), this.map.set(e, t), this.map.size > this.max) {
146
- const r = this.map.keys().next().value, i = this.map.get(r);
147
- this.map.delete(r), this.onEvict?.(r, i);
140
+ set(g, I) {
141
+ if (this.map.has(g) && this.map.delete(g), this.map.set(g, I), this.map.size > this.max) {
142
+ const C = this.map.keys().next().value, A = this.map.get(C);
143
+ this.map.delete(C), this.onEvict?.(C, A);
148
144
  }
149
145
  }
150
- delete(e) {
151
- return this.map.delete(e);
146
+ delete(g) {
147
+ return this.map.delete(g);
152
148
  }
153
149
  clear() {
154
150
  this.map.clear();
@@ -157,24 +153,28 @@ var W = class {
157
153
  return this.map.size;
158
154
  }
159
155
  };
160
- function O() {
161
- C.defs("EPSG:3857", "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"), C.defs("EPSG:4326", "+proj=longlat +datum=WGS84 +no_defs"), C.defs("EPSG:4548", "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
162
- for (let e = 75; e <= 135; e += 3) {
163
- const t = 4524 + Math.floor((e - 75) / 3);
164
- C.defs(`EPSG:${t}`, `+proj=tmerc +lat_0=0 +lon_0=${e} +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs`);
156
+ function J() {
157
+ D.defs("EPSG:3857", "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"), D.defs("EPSG:4326", "+proj=longlat +datum=WGS84 +no_defs"), D.defs("EPSG:4548", "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
158
+ for (let g = 75; g <= 135; g += 3) {
159
+ const I = 4524 + Math.floor((g - 75) / 3);
160
+ D.defs(`EPSG:${I}`, `+proj=tmerc +lat_0=0 +lon_0=${g} +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs`);
165
161
  }
166
162
  }
167
- O();
168
- var q = {
163
+ function F() {
164
+ const g = new URL("data:video/mp2t;base64,aW1wb3J0ICogYXMgR2VvVElGRiBmcm9tICdnZW90aWZmJw0KaW1wb3J0IHR5cGUgeyBHZW9USUZGIGFzIEdlb1RJRkZUeXBlLCBHZW9USUZGSW1hZ2UgfSBmcm9tICdnZW90aWZmJw0KaW1wb3J0IHByb2o0IGZyb20gJ3Byb2o0Jw0KDQovLyBaU1REIOWOi+e8qeino+eggeWZqOmdmeaAgeWvvOWFpQ0KLy8gZ2VvdGlmZi5qcyDlhoXpg6jkvb/nlKjliqjmgIEgaW1wb3J0KCkg5p2l5Yqg6L29IHpzdGQg6Kej56CB5Zmo77yM5L2GIFZpdGUg55qE57uP5YW4IFdvcmtlciAoID93b3JrZXIgKQ0KLy8g5LiN5pSv5oyB5Yqo5oCB5a+85YWl44CC5q2k5aSE6Z2Z5oCB5a+85YWl5bm25o+Q5YmN5rOo5YaM77yM56Gu5L+dIDM4NTcg5b2x5YOP77yI5L2/55SoIFpTVEQg5Y6L57yp77yJ6IO95q2j5bi46Kej56CB44CCDQppbXBvcnQgeyBaU1RERGVjb2RlciB9IGZyb20gJ3pzdGRkZWMvc3RyZWFtJw0KDQovLyAtLS0tIFdvcmtlciDmtojmga/nsbvlnovlrprkuYkgLS0tLQ0KDQovKiog5Li757q/56iLIOKGkiBXb3JrZXIg5raI5oGvICovDQp0eXBlIFdvcmtlckluTWVzc2FnZSA9DQogIHwgeyB0eXBlOiAnSU5JVCc7IHBheWxvYWQ6IHsgdXJsOiBzdHJpbmcgfTsgdGFza0lkOiBudW1iZXIgfQ0KICB8IHsgdHlwZTogJ0xBWllfSU5JVCc7IHBheWxvYWQ6IHsgdXJsOiBzdHJpbmcgfTsgdGFza0lkOiBudW1iZXIgfQ0KICB8IHsNCiAgICAgIHR5cGU6ICdQUk9DRVNTX1RJTEUnDQogICAgICBwYXlsb2FkOiB7DQogICAgICAgIHg6IG51bWJlcg0KICAgICAgICB5OiBudW1iZXINCiAgICAgICAgbGV2ZWw6IG51bWJlcg0KICAgICAgICB0aWxlUmVjdDogeyB3ZXN0OiBudW1iZXI7IHNvdXRoOiBudW1iZXI7IGVhc3Q6IG51bWJlcjsgbm9ydGg6IG51bWJlciB9DQogICAgICAgIGFscGhhPzogbnVtYmVyDQogICAgICB9DQogICAgICB0YXNrSWQ6IG51bWJlcg0KICAgIH0NCg0KLyoqIFdvcmtlciDihpIg5Li757q/56iLIOWTjeW6lOa2iOaBryAqLw0KdHlwZSBXb3JrZXJPdXRNZXNzYWdlID0NCiAgfCB7DQogICAgICB0eXBlOiAnSU5JVF9ET05FJw0KICAgICAgdGFza0lkOiBudW1iZXINCiAgICAgIHBheWxvYWQ6IHsNCiAgICAgICAgc3VjY2VzczogYm9vbGVhbg0KICAgICAgICBiYm94OiBudW1iZXJbXQ0KICAgICAgICBjcnNUeXBlOiBDcnNUeXBlDQogICAgICAgIG1heExldmVsOiBudW1iZXINCiAgICAgICAgbWluTGV2ZWw6IG51bWJlcg0KICAgICAgfQ0KICAgIH0NCiAgfCB7IHR5cGU6ICdUSUxFX0RPTkUnOyB0YXNrSWQ6IG51bWJlcjsgcGF5bG9hZDogeyBiaXRtYXA/OiBJbWFnZUJpdG1hcDsgZW1wdHk6IGJvb2xlYW4gfSB9DQogIHwgeyB0eXBlOiAnRVJST1InOyB0YXNrSWQ6IG51bWJlcjsgcGF5bG9hZDogeyBlcnJvcjogc3RyaW5nIH0gfQ0KDQovKiogQ1JTIOexu+WeiyAqLw0KdHlwZSBDcnNUeXBlID0gJzQzMjYnIHwgJzM4NTcnIHwgJzQ1NDgnDQoNCi8qKiDnsbvlnovljJbmlbDnu4TogZTlkIjnsbvlnosgKi8NCnR5cGUgVHlwZWRBcnJheSA9DQogIHwgSW50OEFycmF5DQogIHwgVWludDhBcnJheQ0KICB8IEludDE2QXJyYXkNCiAgfCBVaW50MTZBcnJheQ0KICB8IEludDMyQXJyYXkNCiAgfCBVaW50MzJBcnJheQ0KICB8IFVpbnQ4Q2xhbXBlZEFycmF5DQogIHwgRmxvYXQzMkFycmF5DQogIHwgRmxvYXQ2NEFycmF5DQoNCi8qKiDlr7npvZDnqpflj6PorqHnrpfnu5PmnpwgKi8NCmludGVyZmFjZSBBbGlnbmVkV2luZG93IHsNCiAgYmxvY2tzOiBudW1iZXINCiAgaW1nVzogbnVtYmVyDQogIGltZ0g6IG51bWJlcg0KICByZWFkWDogbnVtYmVyDQogIHJlYWRZOiBudW1iZXINCiAgcmVhZFc6IG51bWJlcg0KICByZWFkSDogbnVtYmVyDQogIGFsaWduZWRYOiBudW1iZXINCiAgYWxpZ25lZFk6IG51bWJlcg0KICBhbGlnbmVkVzogbnVtYmVyDQogIGFsaWduZWRIOiBudW1iZXINCn0NCg0KLy8g5omp5bGVIFdvcmtlciDlhajlsYDkvZznlKjln5/nsbvlnovvvIjkuI3kvp3otZYgd2Vid29ya2VyIGxpYu+8iQ0KZGVjbGFyZSBjb25zdCBzZWxmOiB7DQogIHBvc3RNZXNzYWdlKG1lc3NhZ2U6IFdvcmtlck91dE1lc3NhZ2UsIHRyYW5zZmVyPzogVHJhbnNmZXJhYmxlW10pOiB2b2lkDQogIG9ubWVzc2FnZTogKChldjogTWVzc2FnZUV2ZW50PFdvcmtlckluTWVzc2FnZT4pID0+IHZvaWQpIHwgbnVsbA0KfQ0KDQovLyAtLS0tIENSUyDms6jlhowgLS0tLQ0KDQovLyDms6jlhozluLjnlKggQ1JTIOWumuS5iQ0KcHJvajQuZGVmcygNCiAgJ0VQU0c6Mzg1NycsDQogICcrcHJvaj1tZXJjICthPTYzNzgxMzcgK2I9NjM3ODEzNyArbGF0X3RzPTAgK2xvbl8wPTAgK3hfMD0wICt5XzA9MCAraz0xICt1bml0cz1tICtuYWRncmlkcz1AbnVsbCArd2t0ZXh0ICtub19kZWZzJywNCikNCnByb2o0LmRlZnMoJ0VQU0c6NDMyNicsICcrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCArbm9fZGVmcycpDQovLyBFUFNHOjQ1NDggPSBDR0NTMjAwMCAvIDMtZGVncmVlIEdhdXNzLUtydWdlciB6b25lIDQwIChDTSAxMjDCsEUpDQovLyDms6jmhI/vvJrpg6jliIYgQ09HIOaWh+S7tiBFUFNHIOWFg+aVsOaNrue8uuWkse+8jOWunumZheWdkOagh+WxnuS6juS4jeWQjCAzwrAg5bim44CCDQovLyDmoIflh4YgM8KwIOW4pu+8muS4nOe7jyAxMTjCsDMwJ34xMjHCsDMwJyDkuLogem9uZSAzOSAoQ00gMTE3wrBFKeOAgg0KLy8gR2V0R2VvS2V5cyDml6Dms5Xor7vlj5YgRVBTRyDlj7fml7bvvIxkZXRlY3RDcnNUeXBlIOm7mOiupOWIpOS4uiA0NTQ4IOS9huS4reWkrue7j+e6v+WPr+iDveS4jeWMuemFjeOAgg0KLy8g5pys5paH5Lu25Z2Q5qCHIGVhc3Rpbmcg4omIIDcwNmtt77yI5ZCrIDUwMGttIOWBh+S4nOenu++8ie+8jOeUqCBDTSAxMTfCsEUg6K6h566XIOKGkiDpmYblnLANCnByb2o0LmRlZnMoDQogICdFUFNHOjQ1NDgnLA0KICAnK3Byb2o9dG1lcmMgK2xhdF8wPTAgK2xvbl8wPTExNyAraz0xICt4XzA9NTAwMDAwICt5XzA9MCArZWxscHM9R1JTODAgK3VuaXRzPW0gK25vX2RlZnMnLA0KKQ0KDQovLyAtLS0tIOW4uOmHj+S4jueKtuaAgSAtLS0tDQoNCmNvbnN0IFRJTEVfU0laRSA9IDI1Ng0KDQpjb25zdCB0aWxlQ2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhUSUxFX1NJWkUsIFRJTEVfU0laRSkNCmNvbnN0IHRpbGVDdHggPSB0aWxlQ2FudmFzLmdldENvbnRleHQoJzJkJywgew0KICB3aWxsUmVhZEZyZXF1ZW50bHk6IGZhbHNlLA0KICBhbHBoYTogdHJ1ZSwNCn0pIQ0KDQovLyDkuK3pl7QgQ2FudmFz77ya55So5LqO5Y6f55Sf5YiG6L6o546H5riy5p+T5ZCO6YCa6L+HIEdQVSDnvKnmlL7vvIjlsLrlr7jlnKjliJ3lp4vljJbml7bliqjmgIHorr7lrprvvIkNCmxldCBzdGFnaW5nQ2FudmFzOiBPZmZzY3JlZW5DYW52YXMNCmxldCBzdGFnaW5nQ3R4OiBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbA0KDQpmdW5jdGlvbiBlbnN1cmVTdGFnaW5nQ2FudmFzKHNpemU6IG51bWJlcik6IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB7DQogIGlmICghc3RhZ2luZ0NhbnZhcyB8fCBzdGFnaW5nQ2FudmFzLndpZHRoIDwgc2l6ZSB8fCBzdGFnaW5nQ2FudmFzLmhlaWdodCA8IHNpemUpIHsNCiAgICBjb25zdCBuZXdTaXplID0gTWF0aC5jZWlsKHNpemUgLyA1MTIpICogNTEyDQogICAgc3RhZ2luZ0NhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3U2l6ZSwgbmV3U2l6ZSkNCiAgICBzdGFnaW5nQ3R4ID0gc3RhZ2luZ0NhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsNCiAgICAgIGFscGhhOiB0cnVlLA0KICAgICAgZGVzeW5jaHJvbml6ZWQ6IHRydWUsDQogICAgfSkhDQogIH0NCiAgcmV0dXJuIHN0YWdpbmdDdHghDQp9DQoNCi8vIOmihOWIhumFjeWPr+WkjeeUqOeahOWDj+e0oOe8k+WGsuWMuu+8jOmBv+WFjeavj+S4queTpueJh+mDvemHjeaWsOWIhumFjeWGheWtmA0KY29uc3QgTUFYX1NUQUdJTkdfU0laRSA9IDQwOTYNCmNvbnN0IHJldXNhYmxlUGl4ZWxCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoTUFYX1NUQUdJTkdfU0laRSAqIE1BWF9TVEFHSU5HX1NJWkUgKiA0KQ0KY29uc3QgcmV1c2FibGVQeDMyID0gbmV3IFVpbnQzMkFycmF5KHJldXNhYmxlUGl4ZWxCdWZmZXIpDQpjb25zdCByZXVzYWJsZVB4OCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShyZXVzYWJsZVBpeGVsQnVmZmVyKQ0KDQovKiog5Yqo5oCB6I635Y+W55qEIENPRyDlhoXpg6ggdGlsZSDlnZflpKflsI/vvIzliJ3lp4vljJbml7bku47mlofku7bor7vlj5YgKi8NCmxldCBibG9ja1NpemUgPSA1MTINCg0KLy8g5oeS5Yid5aeL5YyW6ZSB77yM6Ziy5q2i5aSa5LiqIFBST0NFU1NfVElMRSDlubblj5HosIPnlKggX2Z1bGxJbml0DQpsZXQgX2luaXRMb2NrOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGwNCg0KbGV0IHRpZmY6IEdlb1RJRkZUeXBlIHwgbnVsbCA9IG51bGwNCmxldCBpbWFnZXM6IEdlb1RJRkZJbWFnZVtdID0gW10NCmxldCBpbWFnZVJlc29sdXRpb25zOiBudW1iZXJbXSA9IFtdDQpsZXQgc2FtcGxlc1BlclBpeGVsID0gMQ0KbGV0IGhhc0FscGhhID0gZmFsc2UNCmxldCBjb2dCYm94OiBudW1iZXJbXSB8IG51bGwgPSBudWxsDQpsZXQgY3JzVHlwZTogQ3JzVHlwZSA9ICc0MzI2JyAvLyDlvZPliY0gQ09HIOeahCBDUlMg57G75Z6LDQpsZXQgYmJveElzUHJvamVjdGVkID0gZmFsc2UgLy8gY29nQmJveCDmmK/lkKbku6XmipXlvbHlnZDmoIfvvIjnsbPvvInkuLrljZXkvY3vvIxmYWxzZSDliJnkuLrluqblnZDmoIcNCg0KLy8g5oeS5Yid5aeL5YyW77ya6Z2e5Li7IFdvcmtlciDlhYjlrZggVVJM77yM6aaW5qyh5aSE55CG55Om54mH5pe25YaN5Yqg6L29DQpsZXQgbGF6eVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGwNCg0KLy8gLS0tLSDovoXliqnlh73mlbAgLS0tLQ0KDQovKiog5b2T5YmNIENPRyDmmK/lkKbkuLrmipXlvbHlnZDmoIfns7vvvIgzODU3LzQ1NDgg562J57Gz5Y2V5L2NIENSU++8iSAqLw0KZnVuY3Rpb24gaXNQcm9qZWN0ZWRDcnMoKTogYm9vbGVhbiB7DQogIHJldHVybiBjcnNUeXBlID09PSAnMzg1NycgfHwgY3JzVHlwZSA9PT0gJzQ1NDgnDQp9DQoNCi8vIOe8k+WtmCBwcm9qNCDlnZDmoIfovazmjaLlmajvvIzpgb/lhY3mr4/nk6bniYfpg73ph43mlrDliJvlu7oNCmNvbnN0IHRvTWVyY2F0b3IgPSBwcm9qNCgnRVBTRzo0MzI2JywgJ0VQU0c6Mzg1NycpIC8vIOW6piDihpIgMzg1NyDnsbMNCmNvbnN0IGZyb21NZXJjYXRvciA9IHByb2o0KCdFUFNHOjM4NTcnLCAnRVBTRzo0MzI2JykgLy8gMzg1NyDnsbMg4oaSIOW6pg0KbGV0IF90bzQ1NDg6IHByb2o0LkNvbnZlcnRlciB8IG51bGwgPSBudWxsDQpsZXQgX2Zyb200NTQ4OiBwcm9qNC5Db252ZXJ0ZXIgfCBudWxsID0gbnVsbA0KDQpmdW5jdGlvbiBnZXRUbzQ1NDgoKTogcHJvajQuQ29udmVydGVyIHsNCiAgaWYgKCFfdG80NTQ4KSBfdG80NTQ4ID0gcHJvajQoJ0VQU0c6NDMyNicsICdFUFNHOjQ1NDgnKQ0KICByZXR1cm4gX3RvNDU0OA0KfQ0KZnVuY3Rpb24gZ2V0RnJvbTQ1NDgoKTogcHJvajQuQ29udmVydGVyIHsNCiAgaWYgKCFfZnJvbTQ1NDgpIF9mcm9tNDU0OCA9IHByb2o0KCdFUFNHOjQ1NDgnLCAnRVBTRzo0MzI2JykNCiAgcmV0dXJuIF9mcm9tNDU0OA0KfQ0KDQovKiog5bCGIENPRyDmipXlvbHlnZDmoIcgKDM4NTcvNDU0OCkg6L2s5o2i5Li6IFdHUzg0IOW6puWdkOaghyAqLw0KZnVuY3Rpb24gcHJvamVjdGVkVG9EZWdyZWVzKHg6IG51bWJlciwgeTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7DQogIGlmIChjcnNUeXBlID09PSAnMzg1NycpIHJldHVybiBmcm9tTWVyY2F0b3IuZm9yd2FyZChbeCwgeV0pIGFzIFtudW1iZXIsIG51bWJlcl0NCiAgaWYgKGNyc1R5cGUgPT09ICc0NTQ4JykgcmV0dXJuIGdldEZyb200NTQ4KCkuZm9yd2FyZChbeCwgeV0pIGFzIFtudW1iZXIsIG51bWJlcl0NCiAgcmV0dXJuIFt4LCB5XQ0KfQ0KDQovKiog5bCGIFdHUzg0IOW6puWdkOagh+i9rOaNouS4uiBDT0cg5oqV5b2x5Z2Q5qCHICovDQpmdW5jdGlvbiBkZWdyZWVzVG9Qcm9qZWN0ZWQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHsNCiAgaWYgKGNyc1R5cGUgPT09ICczODU3JykgcmV0dXJuIHRvTWVyY2F0b3IuZm9yd2FyZChbeCwgeV0pIGFzIFtudW1iZXIsIG51bWJlcl0NCiAgaWYgKGNyc1R5cGUgPT09ICc0NTQ4JykgcmV0dXJuIGdldFRvNDU0OCgpLmZvcndhcmQoW3gsIHldKSBhcyBbbnVtYmVyLCBudW1iZXJdDQogIHJldHVybiBbeCwgeV0NCn0NCg0KLyoqDQogKiDmo4DmtYsgQ1JTIOexu+Weiw0KICogQHBhcmFtIGJib3ggLSBDT0cg55qE5Y6f5aeLIGJib3gNCiAqIEBwYXJhbSBlcHNnIC0g5LuOIENPRyDlhYPmlbDmja7or7vlj5bnmoQgRVBTRyDnvJblj7cNCiAqLw0KZnVuY3Rpb24gZGV0ZWN0Q3JzVHlwZShiYm94OiBudW1iZXJbXSwgZXBzZzogbnVtYmVyIHwgbnVsbCk6IENyc1R5cGUgew0KICAvLyBXZWIgTWVyY2F0b3Ig55qE5bi46KeBIEVQU0cg5Luj56CBDQogIC8vIDM4NTcgKFdHUyA4NCAvIFBzZXVkby1NZXJjYXRvcikNCiAgLy8gMTAyMTAwIChFc3JpIFdlYiBNZXJjYXRvcikNCiAgLy8gOTAwOTEzIChHb29nbGUgV2ViIE1lcmNhdG9yKQ0KICAvLyA0MTAwMSAocG9wdWxhciBXZWIgTWVyY2F0b3IgYWxpYXMpDQogIGlmIChlcHNnID09PSAzODU3IHx8IGVwc2cgPT09IDEwMjEwMCB8fCBlcHNnID09PSA5MDA5MTMgfHwgZXBzZyA9PT0gNDEwMDEpIHJldHVybiAnMzg1NycNCiAgaWYgKGVwc2cgPT09IDQ1NDgpIHJldHVybiAnNDU0OCcNCiAgaWYgKGVwc2cgPT09IDQzMjYpIHJldHVybiAnNDMyNicNCiAgLy8g5pegIEVQU0cg5oiW5pyq6K+G5Yir55qEIEVQU0cg5pe26Z2gIGJib3gg5YC86IyD5Zu05Yik5patDQogIGlmICghZXBzZyB8fCBlcHNnID09PSAwIHx8IGVwc2cgPiA0MDAwKSB7DQogICAgY29uc3QgW3csIHMsIGUsIG5dID0gYmJveCBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXQ0KICAgIGNvbnN0IGFueUxhcmdlID0gTWF0aC5hYnModykgPiAzNjAgfHwgTWF0aC5hYnMoZSkgPiAzNjAgfHwgTWF0aC5hYnMocykgPiA5MCB8fCBNYXRoLmFicyhuKSA+IDkwDQogICAgaWYgKGFueUxhcmdlKSB7DQogICAgICAvLyDljLrliIYgMzg1N++8iOWFqOeQg+iMg+WbtCDCsTIwMDM3NTA477yJ5LiO5pys5Zyw5oqV5b2xIENSU++8iOWmgiA0NTQ4IOeahOWAvOi+g+Wwj++8iQ0KICAgICAgLy8gMzg1NyDnmoTnsbPlnZDmoIfpgJrluLjlnKjljYPkuIfnuqfvvIjlpoIgMTMwMDAwMDAr77yJ77yM6ICMIDQ1NDgg562J5pys5Zyw5oqV5b2x5Zyo55m+5LiH57qn77yI5aaCIDcwNDcyMO+8iQ0KICAgICAgY29uc3QgbWF4QWJzID0gTWF0aC5tYXgoTWF0aC5hYnModyksIE1hdGguYWJzKGUpLCBNYXRoLmFicyhzKSwgTWF0aC5hYnMobikpDQogICAgICBpZiAobWF4QWJzID49IDEwMDAwMDAwKSByZXR1cm4gJzM4NTcnDQogICAgICAvLyDlsI/kuo4gMTAwMCDkuIfkuJQgPiAzNjAg4oaSIOW+iOWPr+iDveaYr+acrOWcsOaKleW9sSBDUlPvvIjlpoIgNDU0OC80NTQ5LzQ1NTAg562J77yJDQogICAgICAvLyDov5Tlm54gJzQ1NDgnIOS9nOS4uuacgOS9s+m7mOiupOWAvO+8iOWvueS4reWbveWMuuWfn+mAgueUqO+8iQ0KICAgICAgcmV0dXJuICc0NTQ4Jw0KICAgIH0NCiAgfQ0KICByZXR1cm4gJzQzMjYnDQp9DQoNCi8vID09PT09PSBIVFRQIOivt+axguiKgua1geWZqO+8iOW3suemgeeUqCDigJQg5rWP6KeI5Zmo6buY6K6kIDYg5bm25Y+RL+Wfn+WQjeabtOWPr+mdoO+8iSA9PT09PT0NCg0KLy8g5q+P55Om54mH5pyA5aSn5Z2X5pWw6ZmQ5Yi277ya6K6+5Li66L6D5aSn5YC877yM6YG/5YWN5aSn5paH5Lu2IDM4NTcg5Zug6LaF6ZmQ6L+U5Zue56m65a+86Ie0IENlc2l1bSDlgZzmraLor7fmsYINCi8vIOS5i+WJjemZkOWItui/h+Wwj++8iDI1LzQ577yJ5pivIDM4NTcg5Yqg6L295LiN5Ye655qE5Li76KaB5Y6f5Zug5LmL5LiADQovLyDlkI7mj5DljYfliLAgMjU2IOS7jeS4jeWkn++8iDM4NTcg5aSn5b2x5YOP5ZyoIGxldmVsIDEzLTE0IOS7jei2hemZkO+8ie+8jOWGjeaPkOWNh+WIsCA0MDk2DQpjb25zdCBNQVhfQkxPQ0tTX1BFUl9USUxFID0gNDA5Ng0KDQovLyDnroDljZXnmoQgV29ya2VyIOWGhemDqOWdl+e8k+WtmA0KY29uc3QgYmxvY2tDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlZEFycmF5W10+KCkNCmNvbnN0IE1BWF9DQUNIRV9TSVpFID0gNTAwDQoNCi8vIC0tLS0g5a6M5pW05Yid5aeL5YyW77yI5oeS5Yqg6L295pe25Lmf5aSN55So5q2k5Ye95pWw77yJIC0tLS0NCg0KLyoqDQogKiDlrozmlbTnmoQgQ09HIOWIneWni+WMlua1geeoi++8muazqOWGjOino+eggeWZqOOAgeaJk+W8gOaWh+S7tuOAgeino+aekOWFg+aVsOaNrg0KICog6K6+572u5YWo5bGA5Y+Y6YeP77yadGlmZiwgaW1hZ2VzLCBpbWFnZVJlc29sdXRpb25zLCBjb2dCYm94LCBjcnNUeXBlIOetiQ0KICovDQphc3luYyBmdW5jdGlvbiBfZnVsbEluaXQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHsNCiAgYmJveERlZ3JlZXM6IG51bWJlcltdDQogIGNyc1R5cGU6IENyc1R5cGUNCiAgbWF4TGV2ZWw6IG51bWJlcg0KICBtaW5MZXZlbDogbnVtYmVyDQogIG1haW5JbWc6IEdlb1RJRkZJbWFnZQ0KfT4gew0KICAvLyDpooTms6jlhowgWlNURCDop6PnoIHlmagNCiAgY29uc3QgenN0ZEluc3RhbmNlID0gbmV3IFpTVEREZWNvZGVyKCkNCiAgYXdhaXQgenN0ZEluc3RhbmNlLmluaXQoKQ0KICBHZW9USUZGLmFkZERlY29kZXIoDQogICAgNTAwMDAsDQogICAgKCk6IFByb21pc2U8dHlwZW9mIEdlb1RJRkYuQmFzZURlY29kZXI+ID0+DQogICAgICBQcm9taXNlLnJlc29sdmUoDQogICAgICAgIGNsYXNzIGV4dGVuZHMgR2VvVElGRi5CYXNlRGVjb2RlciB7DQogICAgICAgICAgZGVjb2RlQmxvY2soYnVmZmVyOiBBcnJheUJ1ZmZlcik6IEFycmF5QnVmZmVyIHsNCiAgICAgICAgICAgIHJldHVybiB6c3RkSW5zdGFuY2UuZGVjb2RlKG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcg0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICksDQogICkNCg0KICB0aWZmID0gYXdhaXQgR2VvVElGRi5mcm9tVXJsKHVybCwgew0KICAgIHVzZVdvcmtlcnM6IGZhbHNlLA0KICAgIG1heFJhbmdlczogNTAwLA0KICB9IGFzIFBhcmFtZXRlcnM8dHlwZW9mIEdlb1RJRkYuZnJvbVVybD5bMV0pDQogIGNvbnN0IGltYWdlQ291bnQgPSBhd2FpdCB0aWZmLmdldEltYWdlQ291bnQoKQ0KICBpbWFnZXMgPSBbXQ0KICBmb3IgKGxldCBpID0gMDsgaSA8IGltYWdlQ291bnQ7IGkrKykgew0KICAgIGltYWdlcy5wdXNoKGF3YWl0IHRpZmYuZ2V0SW1hZ2UoaSkpDQogIH0NCiAgY29uc3QgbWFpbkltZyA9IGltYWdlc1swXSEgYXMgR2VvVElGRkltYWdlDQoNCiAgLy8g5Yqo5oCB6K+75Y+WIENPRyDlhoXpg6ggdGlsZSDlnZflpKflsI8NCiAgLy8gZ2VvdGlmZi5qcyDnmoQgZ2V0VGlsZVdpZHRoL2dldFRpbGVIZWlnaHQg6L+U5ZueIFRJRkYg5YaF6YOoIHRpbGUg5bC65a+4DQogIC8vIOWmguaenOmdniB0aWxlZO+8iHN0cmlwcGVk77yJ77yM5YiZ5Zue6YCA5YiwIDUxMg0KICB0cnkgew0KICAgIGNvbnN0IHR3ID0gbWFpbkltZy5nZXRUaWxlV2lkdGgoKQ0KICAgIGNvbnN0IHRoID0gbWFpbkltZy5nZXRUaWxlSGVpZ2h0KCkNCiAgICBpZiAodHcgPiAwICYmIHRoID4gMCkgew0KICAgICAgYmxvY2tTaXplID0gTWF0aC5tYXgodHcsIHRoKQ0KICAgIH0NCiAgfSBjYXRjaCB7DQogICAgYmxvY2tTaXplID0gNTEyDQogIH0NCiAgLy8g56Gu5L+dIHN0YWdpbmcgY2FudmFzIOWwuuWvuOWMuemFjQ0KICBlbnN1cmVTdGFnaW5nQ2FudmFzKGJsb2NrU2l6ZSkNCg0KICAvLyDojrflj5YgYmJveA0KICBjb2dCYm94ID0gbWFpbkltZy5nZXRCb3VuZGluZ0JveCgpIGFzIG51bWJlcltdIHwgbnVsbA0KICBpZiAoDQogICAgIWNvZ0Jib3ggfHwNCiAgICAhQXJyYXkuaXNBcnJheShjb2dCYm94KSB8fA0KICAgIGNvZ0Jib3gubGVuZ3RoICE9PSA0IHx8DQogICAgIWlzRmluaXRlKGNvZ0Jib3hbMF0hKSB8fA0KICAgICFpc0Zpbml0ZShjb2dCYm94WzFdISkgfHwNCiAgICAhaXNGaW5pdGUoY29nQmJveFsyXSEpIHx8DQogICAgIWlzRmluaXRlKGNvZ0Jib3hbM10hKQ0KICApIHsNCiAgICBsZXQgb3JpZ2luWDogbnVtYmVyIHwgdW5kZWZpbmVkDQogICAgbGV0IG9yaWdpblk6IG51bWJlciB8IHVuZGVmaW5lZA0KICAgIGxldCByZXNYOiBudW1iZXIgfCB1bmRlZmluZWQNCiAgICBsZXQgcmVzWTogbnVtYmVyIHwgdW5kZWZpbmVkDQogICAgbGV0IGZhbGxiYWNrT2sgPSBmYWxzZQ0KICAgIHRyeSB7DQogICAgICBjb25zdCBbb3gsIG95XSA9IG1haW5JbWcuZ2V0T3JpZ2luKCkgYXMgW251bWJlciwgbnVtYmVyXQ0KICAgICAgY29uc3QgW3J4LCByeV0gPSBtYWluSW1nLmdldFJlc29sdXRpb24oKSBhcyBbbnVtYmVyLCBudW1iZXJdDQogICAgICBvcmlnaW5YID0gb3gNCiAgICAgIG9yaWdpblkgPSBveQ0KICAgICAgcmVzWCA9IHJ4DQogICAgICByZXNZID0gcnkNCiAgICAgIGlmIChpc0Zpbml0ZShvcmlnaW5YKSAmJiBpc0Zpbml0ZShvcmlnaW5ZKSAmJiBpc0Zpbml0ZShyZXNYKSAmJiBpc0Zpbml0ZShyZXNZKSkNCiAgICAgICAgZmFsbGJhY2tPayA9IHRydWUNCiAgICB9IGNhdGNoIHsNCiAgICAgIC8qIGlnbm9yZSAqLw0KICAgIH0NCiAgICBpZiAoIWZhbGxiYWNrT2spIHsNCiAgICAgIHRyeSB7DQogICAgICAgIGNvbnN0IGZkID0gKG1haW5JbWcgYXMgdW5rbm93biBhcyB7IGZpbGVEaXJlY3Rvcnk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KS5maWxlRGlyZWN0b3J5DQogICAgICAgIGlmIChmZCAmJiB0eXBlb2YgKGZkIGFzIHsgbG9hZFZhbHVlPzogdW5rbm93biB9KS5sb2FkVmFsdWUgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICBjb25zdCB0aWVQb2ludHMgPSBhd2FpdCAoDQogICAgICAgICAgICBmZCBhcyB1bmtub3duIGFzIHsgbG9hZFZhbHVlOiAodGFnOiBzdHJpbmcpID0+IFByb21pc2U8bnVtYmVyW10+IH0NCiAgICAgICAgICApLmxvYWRWYWx1ZSgnTW9kZWxUaWVwb2ludCcpDQogICAgICAgICAgY29uc3QgcGl4ZWxTY2FsZSA9IGF3YWl0ICgNCiAgICAgICAgICAgIGZkIGFzIHVua25vd24gYXMgeyBsb2FkVmFsdWU6ICh0YWc6IHN0cmluZykgPT4gUHJvbWlzZTxudW1iZXJbXT4gfQ0KICAgICAgICAgICkubG9hZFZhbHVlKCdNb2RlbFBpeGVsU2NhbGUnKQ0KICAgICAgICAgIGlmICh0aWVQb2ludHMgJiYgdGllUG9pbnRzLmxlbmd0aCA+PSA2ICYmIHBpeGVsU2NhbGUgJiYgcGl4ZWxTY2FsZS5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgb3JpZ2luWCA9IHRpZVBvaW50c1szXSENCiAgICAgICAgICAgIG9yaWdpblkgPSB0aWVQb2ludHNbNF0hDQogICAgICAgICAgICByZXNYID0gcGl4ZWxTY2FsZVswXSENCiAgICAgICAgICAgIHJlc1kgPSAtcGl4ZWxTY2FsZVsxXSENCiAgICAgICAgICAgIGZhbGxiYWNrT2sgPSB0cnVlDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGNhdGNoIHsNCiAgICAgICAgLyogaWdub3JlICovDQogICAgICB9DQogICAgfQ0KICAgIGlmIChmYWxsYmFja09rKSB7DQogICAgICBjb25zdCB3ID0gbWFpbkltZy5nZXRXaWR0aCgpDQogICAgICBjb25zdCBoID0gbWFpbkltZy5nZXRIZWlnaHQoKQ0KICAgICAgY29nQmJveCA9IFtvcmlnaW5YISwgb3JpZ2luWSEgKyByZXNZISAqIGgsIG9yaWdpblghICsgcmVzWCEgKiB3LCBvcmlnaW5ZIV0NCiAgICB9IGVsc2Ugew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCfml6Dms5Xojrflj5YgQ09HIGJib3gnKQ0KICAgIH0NCiAgfQ0KDQogIHNhbXBsZXNQZXJQaXhlbCA9IG1haW5JbWcuZ2V0U2FtcGxlc1BlclBpeGVsKCkNCg0KICAvLyDmo4DmtYsgQWxwaGENCiAgaGFzQWxwaGEgPSBmYWxzZQ0KICBpZiAoc2FtcGxlc1BlclBpeGVsID49IDQpIHsNCiAgICB0cnkgew0KICAgICAgY29uc3QgZmlsZURpciA9DQogICAgICAgIChtYWluSW1nIGFzIHVua25vd24gYXMgeyBmaWxlRGlyZWN0b3J5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkuZmlsZURpcmVjdG9yeSB8fA0KICAgICAgICAoYXdhaXQgKA0KICAgICAgICAgIG1haW5JbWcgYXMgdW5rbm93biBhcyB7IGdldEZpbGVEaXJlY3Rvcnk/OiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9DQogICAgICAgICkuZ2V0RmlsZURpcmVjdG9yeT8uKCkpIHx8DQogICAgICAgIHt9DQogICAgICBjb25zdCBleHRyYVNhbXBsZXMgPSBmaWxlRGlyLkV4dHJhU2FtcGxlcyBhcyBudW1iZXJbXSB8IHVuZGVmaW5lZA0KICAgICAgaWYgKGV4dHJhU2FtcGxlcyAmJiBleHRyYVNhbXBsZXMubGVuZ3RoID4gMCkNCiAgICAgICAgaGFzQWxwaGEgPSBleHRyYVNhbXBsZXNbMF0gPT09IDEgfHwgZXh0cmFTYW1wbGVzWzBdID09PSAyDQogICAgfSBjYXRjaCB7DQogICAgICAvKiBpZ25vcmUgKi8NCiAgICB9DQogIH0NCg0KICAvLyDmo4DmtYsgQ1JTDQogIGxldCBlcHNnOiBudW1iZXIgfCBudWxsID0gbnVsbA0KICB0cnkgew0KICAgIGNvbnN0IGdlb0tleXMgPSBtYWluSW1nLmdldEdlb0tleXMoKSBhcyB7DQogICAgICBQcm9qZWN0ZWRDU1R5cGVHZW9LZXk/OiBudW1iZXINCiAgICAgIEdlb2dyYXBoaWNUeXBlR2VvS2V5PzogbnVtYmVyDQogICAgfSB8IG51bGwNCiAgICBpZiAoZ2VvS2V5cykgZXBzZyA9IGdlb0tleXMuUHJvamVjdGVkQ1NUeXBlR2VvS2V5IHx8IGdlb0tleXMuR2VvZ3JhcGhpY1R5cGVHZW9LZXkgfHwgbnVsbA0KICB9IGNhdGNoIHsNCiAgICAvKiBpZ25vcmUgKi8NCiAgfQ0KICBjcnNUeXBlID0gZGV0ZWN0Q3JzVHlwZShjb2dCYm94ISwgZXBzZykNCg0KICBjb25zb2xlLmxvZygNCiAgICBgW0NPRzpJTklUXSBjcnNUeXBlPSR7Y3JzVHlwZX0sIGNvZ0Jib3g9WyR7KGNvZ0Jib3ghIGFzIG51bWJlcltdKS5tYXAoKHYpID0+IHYudG9GaXhlZCgxKSkuam9pbignLCcpfV0sIGVwc2c9JHtlcHNnfWAsDQogICkNCg0KICAvLyDovazmjaLkuLogV0dTODQg5bqmIGJib3gNCiAgbGV0IGJib3hEZWdyZWVzOiBudW1iZXJbXQ0KICBpZiAoaXNQcm9qZWN0ZWRDcnMoKSkgew0KICAgIGNvbnN0IFt3LCBzLCBlLCBuXSA9IGNvZ0Jib3ghIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdDQogICAgY29uc3QgaXNEZWcgPSBNYXRoLmFicyh3KSA8PSAxODAgJiYgTWF0aC5hYnMoZSkgPD0gMTgwICYmIE1hdGguYWJzKHMpIDw9IDkwICYmIE1hdGguYWJzKG4pIDw9IDkwDQogICAgaWYgKGlzRGVnKSB7DQogICAgICBiYm94RGVncmVlcyA9IGNvZ0Jib3ghDQogICAgICBiYm94SXNQcm9qZWN0ZWQgPSBmYWxzZQ0KICAgIH0gZWxzZSB7DQogICAgICBjb25zdCBbbG9uVywgbGF0U10gPSBwcm9qZWN0ZWRUb0RlZ3JlZXModywgcykNCiAgICAgIGNvbnN0IFtsb25FLCBsYXROXSA9IHByb2plY3RlZFRvRGVncmVlcyhlLCBuKQ0KICAgICAgaWYgKGlzRmluaXRlKGxvblcpICYmIGlzRmluaXRlKGxhdFMpICYmIGlzRmluaXRlKGxvbkUpICYmIGlzRmluaXRlKGxhdE4pKSB7DQogICAgICAgIGJib3hEZWdyZWVzID0gW2xvblcsIGxhdFMsIGxvbkUsIGxhdE5dDQogICAgICAgIGJib3hJc1Byb2plY3RlZCA9IHRydWUNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGJib3hEZWdyZWVzID0gY29nQmJveCENCiAgICAgICAgYmJveElzUHJvamVjdGVkID0gZmFsc2UNCiAgICAgIH0NCiAgICB9DQogIH0gZWxzZSB7DQogICAgYmJveERlZ3JlZXMgPSBjb2dCYm94IQ0KICAgIGJib3hJc1Byb2plY3RlZCA9IGZhbHNlDQogIH0NCg0KICBjb25zb2xlLmxvZygNCiAgICBgW0NPRzpJTklUXSBiYm94SXNQcm9qZWN0ZWQ9JHtiYm94SXNQcm9qZWN0ZWR9LCBiYm94RGVncmVlcz1bJHtiYm94RGVncmVlcy5tYXAoKHYpID0+IHYudG9GaXhlZCg0KSkuam9pbignLCcpfV1gLA0KICApDQoNCiAgLy8g6aKE6K6h566X5YiG6L6o546HDQogIGNvbnN0IFtjb2dXLCBjb2dTLCBjb2dFLCBjb2dOXSA9IGNvZ0Jib3ghIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdDQogIGNvbnN0IHNwYW4gPSBjb2dFIC0gY29nVw0KICBpbWFnZVJlc29sdXRpb25zID0gaW1hZ2VzLm1hcCgoaW1nKSA9PiBzcGFuIC8gaW1nLmdldFdpZHRoKCkpDQoNCiAgLy8g6K6h566XIG1heExldmVsDQogIGNvbnN0IGJib3hMb25TcGFuID0gYmJveERlZ3JlZXNbMl0hIC0gYmJveERlZ3JlZXNbMF0hDQogIGNvbnN0IGNvZ1JlcyA9IGJib3hMb25TcGFuIC8gbWFpbkltZy5nZXRXaWR0aCgpDQogIGxldCBtYXhMZXZlbCA9IE1hdGgubWluKDE3LCBNYXRoLmNlaWwoTWF0aC5sb2cyKDM2MCAvICgyNTYgKiBjb2dSZXMpKSkpDQoNCiAgLy8g6K6h566XIG1pbkxldmVs77yI5L2/55So5pyA5bCPIG92ZXJ2aWV3IOWBmuWGheWtmOmihOeul++8iQ0KICBjb25zdCBNQVhfVElMRV9CVUZGRVJfQllURVMgPSA2NCAqIDEwMjQgKiAxMDI0DQogIGNvbnN0IE1BWF9USUxFX1BJWEVMUyA9IE1BWF9USUxFX0JVRkZFUl9CWVRFUyAvIDQNCiAgY29uc3QgbGFzdEltZyA9IGltYWdlc1tpbWFnZXMubGVuZ3RoIC0gMV0hDQogIGNvbnN0IGVmZmVjdGl2ZUltZ1cgPSBNYXRoLm1heChsYXN0SW1nLmdldFdpZHRoKCksIDUxMikNCiAgY29uc3QgZWZmZWN0aXZlSW1nSCA9IE1hdGgubWF4KGxhc3RJbWcuZ2V0SGVpZ2h0KCksIDUxMikNCiAgY29uc3QgYmJveExhdFNwYW4gPSBiYm94RGVncmVlc1szXSEgLSBiYm94RGVncmVlc1sxXSENCiAgY29uc3QgY29nU3BhbiA9IE1hdGgubWF4KGJib3hMb25TcGFuLCBiYm94TGF0U3BhbikNCiAgbGV0IG1pbkxldmVsID0gMA0KICBpZiAoY29nU3BhbiA+IDApIHsNCiAgICBtaW5MZXZlbCA9IE1hdGguZmxvb3IoTWF0aC5sb2cyKDM2MCAvIGNvZ1NwYW4pKQ0KICAgIG1pbkxldmVsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obWluTGV2ZWwsIG1heExldmVsKSkNCiAgfQ0KICBmb3IgKGxldCBsdmwgPSBtaW5MZXZlbDsgbHZsIDw9IG1heExldmVsOyBsdmwrKykgew0KICAgIGNvbnN0IHR3ID0gMzYwIC8gTWF0aC5wb3coMiwgbHZsICsgMSkNCiAgICBjb25zdCB0aCA9IDE4MCAvIE1hdGgucG93KDIsIGx2bCkNCiAgICBjb25zdCBydyA9DQogICAgICBNYXRoLmNlaWwoKChNYXRoLm1pbih0dywgYmJveExvblNwYW4pIC8gYmJveExvblNwYW4pICogZWZmZWN0aXZlSW1nVykgLyBibG9ja1NpemUpICogYmxvY2tTaXplDQogICAgY29uc3QgcmggPQ0KICAgICAgTWF0aC5jZWlsKCgoTWF0aC5taW4odGgsIGJib3hMYXRTcGFuKSAvIGJib3hMYXRTcGFuKSAqIGVmZmVjdGl2ZUltZ0gpIC8gYmxvY2tTaXplKSAqIGJsb2NrU2l6ZQ0KICAgIGlmIChydyAqIHJoIDw9IE1BWF9USUxFX1BJWEVMUykgew0KICAgICAgaWYgKGx2bCA+IG1pbkxldmVsKQ0KICAgICAgICBjb25zb2xlLmxvZygNCiAgICAgICAgICBgW0NPRzpJTklUXSBtaW5MZXZlbCDku44gJHttaW5MZXZlbH0g5o+Q5Y2H5YiwICR7bHZsfSAo55Om54mH57yT5a2YIH4keygocncgKiByaCAqIDQpIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMCl9TUIsIElGRCAke2ltYWdlcy5sZW5ndGggLSAxfSlgLA0KICAgICAgICApDQogICAgICBtaW5MZXZlbCA9IGx2bA0KICAgICAgYnJlYWsNCiAgICB9DQogIH0NCg0KICAvLyDkv67mraMgbWF4TGV2ZWzvvJrljZXlsYIgQ09HDQogIGlmIChpbWFnZUNvdW50IDw9IDEpIHsNCiAgICBsZXQgbGltaXRlZE1heCA9IG1heExldmVsDQogICAgZm9yIChsZXQgbHZsID0gbWF4TGV2ZWw7IGx2bCA+PSBtaW5MZXZlbDsgbHZsLS0pIHsNCiAgICAgIGNvbnN0IHRpbGVXID0gMzYwIC8gTWF0aC5wb3coMiwgbHZsICsgMSkNCiAgICAgIGNvbnN0IHRpbGVIID0gMTgwIC8gTWF0aC5wb3coMiwgbHZsKQ0KICAgICAgaWYgKE1hdGguY2VpbChiYm94TG9uU3BhbiAvIHRpbGVXKSAqIE1hdGguY2VpbChiYm94TGF0U3BhbiAvIHRpbGVIKSA8PSAxMDAwKSB7DQogICAgICAgIGxpbWl0ZWRNYXggPSBsdmwNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGxpbWl0ZWRNYXggPCBtYXhMZXZlbCkgew0KICAgICAgY29uc29sZS5sb2coYFtDT0c6SU5JVF0gbWF4TGV2ZWwg5LuOICR7bWF4TGV2ZWx9IOS/ruato+S4uiAke2xpbWl0ZWRNYXh9ICjljZXlsYIgQ09H77yM55Om54mH6L+H5aSaKWApDQogICAgICBtYXhMZXZlbCA9IGxpbWl0ZWRNYXgNCiAgICB9DQogIH0NCg0KICBjb25zb2xlLmxvZygNCiAgICBgW0NPR10g5Yid5aeL5YyW5a6M5oiQOiBFUFNHOiR7Y3JzVHlwZX0sICR7aW1hZ2VDb3VudH0g5bGCLCDkuLvlm74gJHttYWluSW1nLmdldFdpZHRoKCl9eCR7bWFpbkltZy5nZXRIZWlnaHQoKX0sIGAgKw0KICAgICAgYGJib3g9WyR7YmJveERlZ3JlZXMubWFwKCh2KSA9PiB2LnRvRml4ZWQoNCkpLmpvaW4oJywnKX1dLCBtYXhMZXZlbD0ke21heExldmVsfSwgbWluTGV2ZWw9JHttaW5MZXZlbH0sIHNhbXBsZXM9JHtzYW1wbGVzUGVyUGl4ZWx9YCwNCiAgKQ0KDQogIHJldHVybiB7IGJib3hEZWdyZWVzLCBjcnNUeXBlLCBtYXhMZXZlbCwgbWluTGV2ZWwsIG1haW5JbWcgfQ0KfQ0KDQovLyAtLS0tIFdvcmtlciDmtojmga/lpITnkIYgLS0tLQ0KDQpzZWxmLm9ubWVzc2FnZSA9IGFzeW5jIChlOiBNZXNzYWdlRXZlbnQ8V29ya2VySW5NZXNzYWdlPikgPT4gew0KICBjb25zdCB7IHR5cGUsIHBheWxvYWQsIHRhc2tJZCB9ID0gZS5kYXRhDQoNCiAgdHJ5IHsNCiAgICBzd2l0Y2ggKHR5cGUpIHsNCiAgICAgIGNhc2UgJ0xBWllfSU5JVCc6IHsNCiAgICAgICAgLy8g5oeS5Yid5aeL5YyW77ya5Y+q5a2YIFVSTO+8jOS4jeino+aekCBDT0fvvIzpppbmrKEgUFJPQ0VTU19USUxFIOaXtuWGjeWKoOi9vQ0KICAgICAgICBsYXp5VXJsID0gcGF5bG9hZC51cmwNCiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ0lOSVRfRE9ORScsDQogICAgICAgICAgdGFza0lkLA0KICAgICAgICAgIHBheWxvYWQ6IHsNCiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsDQogICAgICAgICAgICBiYm94OiBbMCwgMCwgMCwgMF0sDQogICAgICAgICAgICBjcnNUeXBlOiAnNDMyNicsDQogICAgICAgICAgICBtYXhMZXZlbDogMTcsDQogICAgICAgICAgICBtaW5MZXZlbDogOSwNCiAgICAgICAgICB9LA0KICAgICAgICB9KQ0KICAgICAgICBicmVhaw0KICAgICAgfQ0KICAgICAgY2FzZSAnSU5JVCc6IHsNCiAgICAgICAgY29uc3QgeyB1cmwgfSA9IHBheWxvYWQNCiAgICAgICAgY29uc3QgbWV0YSA9IGF3YWl0IF9mdWxsSW5pdCh1cmwpDQogICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoew0KICAgICAgICAgIHR5cGU6ICdJTklUX0RPTkUnLA0KICAgICAgICAgIHRhc2tJZCwNCiAgICAgICAgICBwYXlsb2FkOiB7DQogICAgICAgICAgICBzdWNjZXNzOiB0cnVlLA0KICAgICAgICAgICAgYmJveDogbWV0YS5iYm94RGVncmVlcywNCiAgICAgICAgICAgIGNyc1R5cGU6IG1ldGEuY3JzVHlwZSwNCiAgICAgICAgICAgIG1heExldmVsOiBtZXRhLm1heExldmVsLA0KICAgICAgICAgICAgbWluTGV2ZWw6IG1ldGEubWluTGV2ZWwsDQogICAgICAgICAgfSwNCiAgICAgICAgfSkNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCg0KICAgICAgY2FzZSAnUFJPQ0VTU19USUxFJzogew0KICAgICAgICBjb25zdCB7IHgsIHksIGxldmVsLCB0aWxlUmVjdCB9ID0gcGF5bG9hZA0KICAgICAgICBpZiAobGV2ZWwgPCAwIHx8IHggPCAwIHx8IHkgPCAwKSB7DQogICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICdUSUxFX0RPTkUnLCB0YXNrSWQsIHBheWxvYWQ6IHsgZW1wdHk6IHRydWUgfSB9KQ0KICAgICAgICAgIHJldHVybg0KICAgICAgICB9DQoNCiAgICAgICAgLy8g5oeS5Yid5aeL5YyW77ya5aaC5p6cIHRpZmYg5pyq5Yid5aeL5YyW5L2GIGxhenlVcmwg5a2Y5Zyo77yM6aaW5qyh5L2/55So5YmN5Yqg6L29IENPRw0KICAgICAgICBpZiAoIXRpZmYgJiYgbGF6eVVybCkgew0KICAgICAgICAgIGlmICghX2luaXRMb2NrKSB7DQogICAgICAgICAgICBfaW5pdExvY2sgPSAoYXN5bmMgKCkgPT4gew0KICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGF3YWl0IF9mdWxsSW5pdChsYXp5VXJsISkNCiAgICAgICAgICAgICAgICBsYXp5VXJsID0gbnVsbA0KICAgICAgICAgICAgICB9IGZpbmFsbHkgew0KICAgICAgICAgICAgICAgIF9pbml0TG9jayA9IG51bGwNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkoKQ0KICAgICAgICAgIH0NCiAgICAgICAgICBhd2FpdCBfaW5pdExvY2sNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IFtjb2dXLCBjb2dTLCBjb2dFLCBjb2dOXSA9IGNvZ0Jib3ghIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdDQoNCiAgICAgICAgLy8g5bCG55Om54mH55+p5b2i57uf5LiA5YiwIENPRyDlnZDmoIfnqbrpl7QNCiAgICAgICAgbGV0IHRXOiBudW1iZXIsIHRTOiBudW1iZXIsIHRFOiBudW1iZXIsIHROOiBudW1iZXINCiAgICAgICAgaWYgKGJib3hJc1Byb2plY3RlZCkgew0KICAgICAgICAgIGNvbnN0IHN3ID0gZGVncmVlc1RvUHJvamVjdGVkKHRpbGVSZWN0Lndlc3QsIHRpbGVSZWN0LnNvdXRoKQ0KICAgICAgICAgIGNvbnN0IG5lID0gZGVncmVlc1RvUHJvamVjdGVkKHRpbGVSZWN0LmVhc3QsIHRpbGVSZWN0Lm5vcnRoKQ0KICAgICAgICAgIDtbdFcsIHRTXSA9IHN3DQogICAgICAgICAgO1t0RSwgdE5dID0gbmUNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0VyA9IHRpbGVSZWN0Lndlc3QNCiAgICAgICAgICB0UyA9IHRpbGVSZWN0LnNvdXRoDQogICAgICAgICAgdEUgPSB0aWxlUmVjdC5lYXN0DQogICAgICAgICAgdE4gPSB0aWxlUmVjdC5ub3J0aA0KICAgICAgICB9DQoNCiAgICAgICAgLy8g6K6h566X5Lqk6ZuGDQogICAgICAgIGNvbnN0IGludGVyVyA9IE1hdGgubWF4KHRXLCBjb2dXKQ0KICAgICAgICBjb25zdCBpbnRlclMgPSBNYXRoLm1heCh0UywgY29nUykNCiAgICAgICAgY29uc3QgaW50ZXJFID0gTWF0aC5taW4odEUsIGNvZ0UpDQogICAgICAgIGNvbnN0IGludGVyTiA9IE1hdGgubWluKHROLCBjb2dOKQ0KDQogICAgICAgIGlmIChpbnRlclcgPj0gaW50ZXJFIHx8IGludGVyUyA+PSBpbnRlck4pIHsNCiAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsgdHlwZTogJ1RJTEVfRE9ORScsIHRhc2tJZCwgcGF5bG9hZDogeyBlbXB0eTogdHJ1ZSB9IH0pDQogICAgICAgICAgcmV0dXJuDQogICAgICAgIH0NCg0KICAgICAgICAvLyDpgInmi6kgb3ZlcnZpZXcg5bGCDQogICAgICAgIGNvbnN0IHJlc05lZWRlZCA9ICh0RSAtIHRXKSAvIFRJTEVfU0laRQ0KICAgICAgICBjb25zdCBvdmVydmlld0JpYXMgPSBpc1Byb2plY3RlZENycygpID8gMS4wIDogMS4wDQogICAgICAgIGxldCBpbWFnZUluZGV4ID0gMA0KICAgICAgICBmb3IgKGxldCBpID0gaW1hZ2VSZXNvbHV0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KICAgICAgICAgIGlmIChpbWFnZVJlc29sdXRpb25zW2ldISA8PSByZXNOZWVkZWQgKiBvdmVydmlld0JpYXMpIHsNCiAgICAgICAgICAgIGltYWdlSW5kZXggPSBpDQogICAgICAgICAgICBicmVhaw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIOi+heWKqe+8muiuoeeul+WcqOaMh+WumiBJRkQg5LiK6K+75Y+W55qE5a+56b2Q5Yy65Z+fDQogICAgICAgIGNvbnN0IGNhbGNBbGlnbmVkV2luZG93ID0gKGlmZElkeDogbnVtYmVyKTogQWxpZ25lZFdpbmRvdyA9PiB7DQogICAgICAgICAgY29uc3QgaW1nID0gaW1hZ2VzW2lmZElkeF0hDQogICAgICAgICAgY29uc3QgaXcgPSBpbWcuZ2V0V2lkdGgoKQ0KICAgICAgICAgIGNvbnN0IGloID0gaW1nLmdldEhlaWdodCgpDQogICAgICAgICAgY29uc3QgcnggPSBNYXRoLmZsb29yKCgoaW50ZXJXIC0gY29nVykgLyAoY29nRSAtIGNvZ1cpKSAqIGl3KQ0KICAgICAgICAgIGNvbnN0IHJ5ID0gTWF0aC5mbG9vcigoKGNvZ04gLSBpbnRlck4pIC8gKGNvZ04gLSBjb2dTKSkgKiBpaCkNCiAgICAgICAgICBjb25zdCBydyA9IE1hdGguY2VpbCgoKGludGVyRSAtIGludGVyVykgLyAoY29nRSAtIGNvZ1cpKSAqIGl3KQ0KICAgICAgICAgIGNvbnN0IHJoID0gTWF0aC5jZWlsKCgoaW50ZXJOIC0gaW50ZXJTKSAvIChjb2dOIC0gY29nUykpICogaWgpDQogICAgICAgICAgLy8g5a+56b2Q5YiwIGJsb2NrIOi+ueeVjA0KICAgICAgICAgIGNvbnN0IGF4ID0gTWF0aC5mbG9vcihyeCAvIGJsb2NrU2l6ZSkgKiBibG9ja1NpemUNCiAgICAgICAgICBjb25zdCBheSA9IE1hdGguZmxvb3IocnkgLyBibG9ja1NpemUpICogYmxvY2tTaXplDQogICAgICAgICAgY29uc3QgYXcgPSBNYXRoLm1pbihNYXRoLmNlaWwoKHJ4ICsgcncpIC8gYmxvY2tTaXplKSAqIGJsb2NrU2l6ZSAtIGF4LCBpdyAtIGF4KQ0KICAgICAgICAgIGNvbnN0IGFoID0gTWF0aC5taW4oTWF0aC5jZWlsKChyeSArIHJoKSAvIGJsb2NrU2l6ZSkgKiBibG9ja1NpemUgLSBheSwgaWggLSBheSkNCiAgICAgICAgICBjb25zdCBibG9ja3MgPSBNYXRoLmNlaWwoYXcgLyBibG9ja1NpemUpICogTWF0aC5jZWlsKGFoIC8gYmxvY2tTaXplKQ0KICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBibG9ja3MsDQogICAgICAgICAgICBpbWdXOiBpdywNCiAgICAgICAgICAgIGltZ0g6IGloLA0KICAgICAgICAgICAgcmVhZFg6IHJ4LA0KICAgICAgICAgICAgcmVhZFk6IHJ5LA0KICAgICAgICAgICAgcmVhZFc6IHJ3LA0KICAgICAgICAgICAgcmVhZEg6IHJoLA0KICAgICAgICAgICAgYWxpZ25lZFg6IGF4LA0KICAgICAgICAgICAgYWxpZ25lZFk6IGF5LA0KICAgICAgICAgICAgYWxpZ25lZFc6IGF3LA0KICAgICAgICAgICAgYWxpZ25lZEg6IGFoLA0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIOS7juW9k+WJjSBJRkQg5byA5aeL77yM5bCd6K+V5om+5Yiw5Z2X5pWw5rKh6LaF6ZmQ55qEIElGRA0KICAgICAgICBsZXQgaW5mbyA9IGNhbGNBbGlnbmVkV2luZG93KGltYWdlSW5kZXgpDQogICAgICAgIGlmIChpbmZvLmJsb2NrcyA+IE1BWF9CTE9DS1NfUEVSX1RJTEUpIHsNCiAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZQ0KICAgICAgICAgIGlmIChpbWFnZXMubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IGltYWdlSW5kZXggKyAxOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgIGNvbnN0IGFsdCA9IGNhbGNBbGlnbmVkV2luZG93KGkpDQogICAgICAgICAgICAgIGlmIChhbHQuYmxvY2tzIDw9IE1BWF9CTE9DS1NfUEVSX1RJTEUgfHwgaSA9PT0gaW1hZ2VzLmxlbmd0aCAtIDEpIHsNCiAgICAgICAgICAgICAgICBpbmZvID0gYWx0DQogICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA9IGkNCiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWUNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIC8vIOWNleWxgiBDT0cg5LiU6LaF6ZmQ5pe25LiN6L+U5Zue56m677yM55u05o6l55So5Y6f57uT5p6c57un57ut77yI6Jm954S25oWi5L2G5LiN5Ye656m655Om54mH77yJDQogICAgICAgICAgaWYgKCFmb3VuZCAmJiBpbWFnZXMubGVuZ3RoIDw9IDEpIHsNCiAgICAgICAgICAgIGNvbnNvbGUud2FybigNCiAgICAgICAgICAgICAgYFtDT0ddIOeTpueJhyAke3h9LCR7eX1AJHtsZXZlbH06IOWdl+aVsOi2hemZkCAoJHtpbmZvLmJsb2Nrc30gPiAke01BWF9CTE9DS1NfUEVSX1RJTEV9Ke+8jOS7jee7p+e7reWkhOeQhmAsDQogICAgICAgICAgICApDQogICAgICAgICAgICAvLyDkuI3ov5Tlm57nqbrvvIznu6fnu63lpITnkIYNCiAgICAgICAgICB9IGVsc2UgaWYgKCFmb3VuZCkgew0KICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICdUSUxFX0RPTkUnLCB0YXNrSWQsIHBheWxvYWQ6IHsgZW1wdHk6IHRydWUgfSB9KQ0KICAgICAgICAgICAgcmV0dXJuDQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgeyByZWFkWCwgcmVhZFksIHJlYWRXLCByZWFkSCwgYWxpZ25lZFgsIGFsaWduZWRZLCBhbGlnbmVkVywgYWxpZ25lZEggfSA9IGluZm8NCg0KICAgICAgICBpZiAocmVhZFcgPD0gMCB8fCByZWFkSCA8PSAwKSB7DQogICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICdUSUxFX0RPTkUnLCB0YXNrSWQsIHBheWxvYWQ6IHsgZW1wdHk6IHRydWUgfSB9KQ0KICAgICAgICAgIHJldHVybg0KICAgICAgICB9DQoNCiAgICAgICAgLy8g6K+75Y+W5rOi5q6177yI5bimIFdvcmtlciDlhoXpg6jnvJPlrZjvvIkNCiAgICAgICAgY29uc3Qgc2FtcGxlTGlzdDogbnVtYmVyW10gPSBoYXNBbHBoYQ0KICAgICAgICAgID8gWzAsIDEsIDIsIDNdDQogICAgICAgICAgOiBzYW1wbGVzUGVyUGl4ZWwgPj0gMw0KICAgICAgICAgICAgPyBbMCwgMSwgMl0NCiAgICAgICAgICAgIDogWzBdDQogICAgICAgIGNvbnN0IHdpbmRvd0tleSA9IGAke2ltYWdlSW5kZXh9XyR7YWxpZ25lZFh9XyR7YWxpZ25lZFl9XyR7YWxpZ25lZFd9XyR7YWxpZ25lZEh9XyR7c2FtcGxlTGlzdC5qb2luKCcsJyl9YA0KICAgICAgICBsZXQgcmFzdGVycyA9IGJsb2NrQ2FjaGUuZ2V0KHdpbmRvd0tleSkgYXMgVHlwZWRBcnJheVtdIHwgdW5kZWZpbmVkDQogICAgICAgIGlmICghcmFzdGVycykgew0KICAgICAgICAgIHJhc3RlcnMgPSAoYXdhaXQgaW1hZ2VzW2ltYWdlSW5kZXhdIS5yZWFkUmFzdGVycyh7DQogICAgICAgICAgICB3aW5kb3c6IFthbGlnbmVkWCwgYWxpZ25lZFksIGFsaWduZWRYICsgYWxpZ25lZFcsIGFsaWduZWRZICsgYWxpZ25lZEhdLA0KICAgICAgICAgICAgc2FtcGxlczogc2FtcGxlTGlzdCwNCiAgICAgICAgICB9KSkgYXMgVHlwZWRBcnJheVtdDQogICAgICAgICAgLy8g57yT5a2Y6Kej56CB57uT5p6c77yM5o6n5Yi257yT5a2Y5aSn5bCPDQogICAgICAgICAgaWYgKGJsb2NrQ2FjaGUuc2l6ZSA+IE1BWF9DQUNIRV9TSVpFKSB7DQogICAgICAgICAgICBjb25zdCBmaXJzdEtleSA9IGJsb2NrQ2FjaGUua2V5cygpLm5leHQoKS52YWx1ZQ0KICAgICAgICAgICAgaWYgKGZpcnN0S2V5KSBibG9ja0NhY2hlLmRlbGV0ZShmaXJzdEtleSBhcyBzdHJpbmcpDQogICAgICAgICAgfQ0KICAgICAgICAgIGJsb2NrQ2FjaGUuc2V0KHdpbmRvd0tleSwgcmFzdGVycykNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIOehruS/nSBzdGFnaW5nIGNhbnZhcyDotrPlpJ/lpKcNCiAgICAgICAgZW5zdXJlU3RhZ2luZ0NhbnZhcyhNYXRoLm1heChhbGlnbmVkVywgYWxpZ25lZEgpKQ0KDQogICAgICAgIC8vIOS9v+eUqOmihOWIhumFjeeahOWDj+e0oOe8k+WGsuWMug0KICAgICAgICBjb25zdCBwaXhlbENvdW50ID0gYWxpZ25lZFcgKiBhbGlnbmVkSA0KICAgICAgICBsZXQgcHgzMjogVWludDMyQXJyYXkgPSByZXVzYWJsZVB4MzINCiAgICAgICAgbGV0IHB4ODogVWludDhDbGFtcGVkQXJyYXkgPSByZXVzYWJsZVB4OA0KICAgICAgICBpZiAocGl4ZWxDb3VudCAqIDQgPiByZXVzYWJsZVBpeGVsQnVmZmVyLmJ5dGVMZW5ndGgpIHsNCiAgICAgICAgICBjb25zdCBiaWdCdWYgPSBuZXcgQXJyYXlCdWZmZXIocGl4ZWxDb3VudCAqIDQpDQogICAgICAgICAgcHgzMiA9IG5ldyBVaW50MzJBcnJheShiaWdCdWYpDQogICAgICAgICAgcHg4ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJpZ0J1ZikNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHIwID0gcmFzdGVyc1swXSENCiAgICAgICAgY29uc3QgbGVuID0gcjAubGVuZ3RoDQoNCiAgICAgICAgaWYgKGhhc0FscGhhKSB7DQogICAgICAgICAgY29uc3QgcjEgPSByYXN0ZXJzWzFdISwNCiAgICAgICAgICAgIHIyID0gcmFzdGVyc1syXSEsDQogICAgICAgICAgICByMyA9IHJhc3RlcnNbM10hDQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgY29uc3QgYSA9IHIzW2ldIQ0KICAgICAgICAgICAgcHgzMltpXSA9IGEgPCAzMCA/IDAgOiAoYSA8PCAyNCkgfCAocjJbaV0hIDw8IDE2KSB8IChyMVtpXSEgPDwgOCkgfCByMFtpXSENCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlc1BlclBpeGVsID49IDMpIHsNCiAgICAgICAgICBjb25zdCByMSA9IHJhc3RlcnNbMV0hLA0KICAgICAgICAgICAgcjIgPSByYXN0ZXJzWzJdIQ0KICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgICAgIGNvbnN0IHIgPSByMFtpXSEsDQogICAgICAgICAgICAgIGcgPSByMVtpXSEsDQogICAgICAgICAgICAgIGIgPSByMltpXSENCiAgICAgICAgICAgIHB4MzJbaV0gPSByICsgZyArIGIgPCA5MCA/IDAgOiAoMHhmZjAwMDAwMCB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDANCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgY29uc3QgdiA9IHIwW2ldIQ0KICAgICAgICAgICAgcHgzMltpXSA9ICgweGZmMDAwMDAwIHwgKHYgPDwgMTYpIHwgKHYgPDwgOCkgfCB2KSA+Pj4gMA0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHJhd0ltZ0RhdGEgPSBuZXcgSW1hZ2VEYXRhKA0KICAgICAgICAgIHB4OC5zdWJhcnJheSgwLCBwaXhlbENvdW50ICogNCkgYXMgVWludDhDbGFtcGVkQXJyYXk8QXJyYXlCdWZmZXI+LA0KICAgICAgICAgIGFsaWduZWRXLA0KICAgICAgICAgIGFsaWduZWRILA0KICAgICAgICApDQogICAgICAgIHN0YWdpbmdDdHghLnB1dEltYWdlRGF0YShyYXdJbWdEYXRhLCAwLCAwKQ0KDQogICAgICAgIC8vIEdQVSDliqDpgJ/nvKnmlL4gKyDoo4HliarvvIhkcmF3SW1hZ2Ug6KaG55uW5YWo5Yy65Z+f77yM5peg6ZyAIGNsZWFyUmVjdO+8iQ0KICAgICAgICBjb25zdCBzcmNYID0gcmVhZFggLSBhbGlnbmVkWA0KICAgICAgICBjb25zdCBzcmNZID0gcmVhZFkgLSBhbGlnbmVkWQ0KICAgICAgICBjb25zdCBkZXN0VyA9IE1hdGgucm91bmQoKChpbnRlckUgLSBpbnRlclcpIC8gKHRFIC0gdFcpKSAqIFRJTEVfU0laRSkNCiAgICAgICAgY29uc3QgZGVzdEggPSBNYXRoLnJvdW5kKCgoaW50ZXJOIC0gaW50ZXJTKSAvICh0TiAtIHRTKSkgKiBUSUxFX1NJWkUpDQogICAgICAgIGNvbnN0IGRlc3RYID0gTWF0aC5mbG9vcigoKGludGVyVyAtIHRXKSAvICh0RSAtIHRXKSkgKiBUSUxFX1NJWkUpDQogICAgICAgIGNvbnN0IGRlc3RZID0gTWF0aC5mbG9vcigoKHROIC0gaW50ZXJOKSAvICh0TiAtIHRTKSkgKiBUSUxFX1NJWkUpDQogICAgICAgIHRpbGVDdHguZHJhd0ltYWdlKHN0YWdpbmdDYW52YXMsIHNyY1gsIHNyY1ksIHJlYWRXLCByZWFkSCwgZGVzdFgsIGRlc3RZLCBkZXN0VywgZGVzdEgpDQoNCiAgICAgICAgLy8gdHJhbnNmZXJUb0ltYWdlQml0bWFwIOavlCBjcmVhdGVJbWFnZUJpdG1hcCDmm7Tlv6vvvIznm7TmjqXovaznp7sgR1BVIOe6ueeQhuiAjOaXoOmcgOaLt+i0nQ0KICAgICAgICBjb25zdCBiaXRtYXAgPSB0aWxlQ2FudmFzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpDQoNCiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICdUSUxFX0RPTkUnLCB0YXNrSWQsIHBheWxvYWQ6IHsgYml0bWFwLCBlbXB0eTogZmFsc2UgfSB9LCBbYml0bWFwXSkNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCg0KICAgICAgZGVmYXVsdDoNCiAgICAgICAgYnJlYWsNCiAgICB9DQogIH0gY2F0Y2ggKGVycjogdW5rbm93bikgew0KICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikNCiAgICBjb25zdCBzdGFjayA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkDQogICAgY29uc29sZS5lcnJvcihgW0NPRyBXb3JrZXJdIOmUmeivryAodHlwZT0ke3R5cGV9LCB0YXNrSWQ9JHt0YXNrSWR9KTpgLCBtZXNzYWdlLCBzdGFjaykNCiAgICBzZWxmLnBvc3RNZXNzYWdlKHsgdHlwZTogJ0VSUk9SJywgdGFza0lkLCBwYXlsb2FkOiB7IGVycm9yOiBtZXNzYWdlIH0gfSkNCiAgfQ0KfQ0K", "" + import.meta.url);
165
+ return new Worker(g.href, { type: "module" });
166
+ }
167
+ J();
168
+ var H = {
169
169
  poolSize: Math.max(2, Math.min(6, Math.floor((navigator.hardwareConcurrency || 4) / 2))),
170
170
  maxLoadPerWorker: 8,
171
171
  timeout: 3e4,
172
172
  tileCacheSize: 512,
173
173
  alpha: 1
174
- }, I = class {
174
+ }, Q = class {
175
175
  tileWidth = 256;
176
176
  tileHeight = 256;
177
- tilingScheme = new z();
177
+ tilingScheme = new K();
178
178
  hasAlphaChannel = !0;
179
179
  ready = !0;
180
180
  maximumLevel;
@@ -201,128 +201,128 @@ var q = {
201
201
  0
202
202
  ];
203
203
  _initialized = !1;
204
- constructor(e, t) {
205
- this._url = e, this._options = {
206
- ...q,
207
- ...t
208
- }, this._tileCache = new W(this._options.tileCacheSize, (r, i) => {
209
- i.close();
204
+ constructor(g, I) {
205
+ this._url = g, this._options = {
206
+ ...H,
207
+ ...I
208
+ }, this._tileCache = new v(this._options.tileCacheSize, (C, A) => {
209
+ A.close();
210
210
  }), this._emptyTile = document.createElement("canvas"), this._emptyTile.width = 256, this._emptyTile.height = 256;
211
211
  }
212
212
  async init() {
213
213
  if (this._initialized) return;
214
214
  if (this._destroyed) throw new Error("CogImageryProvider 已销毁");
215
- this._workerPool = new R(() => new G(), this._options.poolSize, this._options.maxLoadPerWorker);
216
- const e = await Promise.race([this._workerPool.initOne({ url: this._url }), new Promise((l, c) => setTimeout(() => c(/* @__PURE__ */ new Error("COG 初始化超时")), this._options.timeout))]);
217
- if (!e || !Array.isArray(e.bbox) || e.bbox.length !== 4) throw new Error("COG 元数据无效: bbox 格式错误");
218
- const t = e.bbox, r = t[0], i = t[1], s = t[2], o = t[3];
219
- if (!isFinite(r) || !isFinite(i) || !isFinite(s) || !isFinite(o)) throw new Error("COG 元数据无效: bbox 包含非数值");
220
- const n = e.maxLevel ?? 17, a = e.minLevel ?? Math.max(0, n - 8), d = e.crsType ?? "4326";
221
- this._bbox = this._normalizeBbox(r, i, s, o, d), this.maximumLevel = n, this.minimumLevel = a, this.rectangle = T.fromDegrees(this._bbox[0], this._bbox[1], this._bbox[2], this._bbox[3]), this._errorEvent = new P(), this._initialized = !0, console.log(`[COG] 初始化完成, 级别 ${a}-${n}, bbox: [${this._bbox.join(", ")}]`);
215
+ this._workerPool = new w(() => F(), this._options.poolSize, this._options.maxLoadPerWorker);
216
+ const g = await Promise.race([this._workerPool.initOne({ url: this._url }), new Promise((t, a) => setTimeout(() => a(/* @__PURE__ */ new Error("COG 初始化超时")), this._options.timeout))]);
217
+ if (!g || !Array.isArray(g.bbox) || g.bbox.length !== 4) throw new Error("COG 元数据无效: bbox 格式错误");
218
+ const I = g.bbox, C = I[0], A = I[1], i = I[2], e = I[3];
219
+ if (!isFinite(C) || !isFinite(A) || !isFinite(i) || !isFinite(e)) throw new Error("COG 元数据无效: bbox 包含非数值");
220
+ const o = g.maxLevel ?? 17, l = g.minLevel ?? Math.max(0, o - 8), c = g.crsType ?? "4326";
221
+ this._bbox = this._normalizeBbox(C, A, i, e, c), this.maximumLevel = o, this.minimumLevel = l, this.rectangle = V.fromDegrees(this._bbox[0], this._bbox[1], this._bbox[2], this._bbox[3]), this._errorEvent = new p(), this._initialized = !0, console.log(`[COG] 初始化完成, 级别 ${l}-${o}, bbox: [${this._bbox.join(", ")}]`);
222
222
  }
223
- _normalizeBbox(e, t, r, i, s) {
224
- if (Math.abs(e) <= 360 && Math.abs(r) <= 360 && Math.abs(t) <= 90 && Math.abs(i) <= 90) return [
225
- e,
226
- t,
227
- r,
228
- i
223
+ _normalizeBbox(g, I, C, A, i) {
224
+ if (Math.abs(g) <= 360 && Math.abs(C) <= 360 && Math.abs(I) <= 90 && Math.abs(A) <= 90) return [
225
+ g,
226
+ I,
227
+ C,
228
+ A
229
229
  ];
230
230
  try {
231
- const o = C(`EPSG:${s}`, "EPSG:4326"), n = o.forward([e, t]), a = o.forward([r, i]);
232
- if (isFinite(n[0]) && isFinite(n[1]) && isFinite(a[0]) && isFinite(a[1]) && Math.abs(n[0]) <= 180 && Math.abs(a[0]) <= 180 && Math.abs(n[1]) <= 90 && Math.abs(a[1]) <= 90) return [
233
- n[0],
234
- n[1],
235
- a[0],
236
- a[1]
231
+ const e = D(`EPSG:${i}`, "EPSG:4326"), o = e.forward([g, I]), l = e.forward([C, A]);
232
+ if (isFinite(o[0]) && isFinite(o[1]) && isFinite(l[0]) && isFinite(l[1]) && Math.abs(o[0]) <= 180 && Math.abs(l[0]) <= 180 && Math.abs(o[1]) <= 90 && Math.abs(l[1]) <= 90) return [
233
+ o[0],
234
+ o[1],
235
+ l[0],
236
+ l[1]
237
237
  ];
238
238
  } catch {
239
239
  }
240
- throw new Error(`bbox 超出度坐标范围 [${e}, ${t}, ${r}, ${i}],CRS=${s},转换失败`);
240
+ throw new Error(`bbox 超出度坐标范围 [${g}, ${I}, ${C}, ${A}],CRS=${i},转换失败`);
241
241
  }
242
242
  isDestroyed() {
243
243
  return this._destroyed;
244
244
  }
245
- async requestImage(e, t, r) {
245
+ async requestImage(g, I, C) {
246
246
  if (this._destroyed || !this._initialized) return;
247
- const [i, s, o, n] = this._bbox, a = Math.pow(2, r + 1), d = Math.pow(2, r), l = 360 / a, c = 180 / d, m = e * l - 180, v = m + l, p = 90 - t * c, y = p - c;
248
- if (v <= i || m >= o || p <= s || y >= n) return this._emptyTile;
249
- const g = `${this._url}_${e}_${t}_${r}`, _ = this._tileCache.get(g);
250
- if (_) {
251
- const u = document.createElement("canvas");
252
- return u.width = _.width, u.height = _.height, u.getContext("2d").drawImage(_, 0, 0), u;
247
+ const [A, i, e, o] = this._bbox, l = Math.pow(2, C + 1), c = Math.pow(2, C), t = 360 / l, a = 180 / c, b = g * t - 180, h = b + t, d = 90 - I * a, r = d - a;
248
+ if (h <= A || b >= e || d <= i || r >= o) return this._emptyTile;
249
+ const m = `${this._url}_${g}_${I}_${C}`, G = this._tileCache.get(m);
250
+ if (G) {
251
+ const n = document.createElement("canvas");
252
+ return n.width = G.width, n.height = G.height, n.getContext("2d").drawImage(G, 0, 0), n;
253
253
  }
254
- let f = this._inflightRequests.get(g);
255
- f || (f = this._fetchTile(g, e, t, r, {
256
- west: m,
257
- south: y,
258
- east: v,
259
- north: p
260
- }), this._inflightRequests.set(g, f));
261
- const w = await f;
262
- if (!w) return this._emptyTile;
263
- const h = document.createElement("canvas");
264
- return h.width = w.width, h.height = w.height, h.getContext("2d").drawImage(w, 0, 0), h;
254
+ let Z = this._inflightRequests.get(m);
255
+ Z || (Z = this._fetchTile(m, g, I, C, {
256
+ west: b,
257
+ south: r,
258
+ east: h,
259
+ north: d
260
+ }), this._inflightRequests.set(m, Z));
261
+ const W = await Z;
262
+ if (!W) return this._emptyTile;
263
+ const s = document.createElement("canvas");
264
+ return s.width = W.width, s.height = W.height, s.getContext("2d").drawImage(W, 0, 0), s;
265
265
  }
266
- async _fetchTile(e, t, r, i, s) {
266
+ async _fetchTile(g, I, C, A, i) {
267
267
  try {
268
- const o = await this._workerPool.execute("PROCESS_TILE", {
269
- x: t,
270
- y: r,
271
- level: i,
272
- tileRect: s,
268
+ const e = await this._workerPool.execute("PROCESS_TILE", {
269
+ x: I,
270
+ y: C,
271
+ level: A,
272
+ tileRect: i,
273
273
  alpha: this._options.alpha
274
274
  });
275
- return !o || o.empty || !o.bitmap ? null : (this._tileCache.set(e, o.bitmap), o.bitmap);
275
+ return !e || e.empty || !e.bitmap ? null : (this._tileCache.set(g, e.bitmap), e.bitmap);
276
276
  } finally {
277
- this._inflightRequests.delete(e);
277
+ this._inflightRequests.delete(g);
278
278
  }
279
279
  }
280
280
  destroy() {
281
281
  this._destroyed = !0, this._workerPool?.terminate(), this._tileCache.clear(), this._inflightRequests.clear(), this._initialized = !1;
282
282
  }
283
283
  };
284
- function $(e, t = 0.3) {
285
- const r = e.east - e.west, i = e.north - e.south, s = r * t, o = i * t;
284
+ function k(g, I = 0.3) {
285
+ const C = g.east - g.west, A = g.north - g.south, i = C * I, e = A * I;
286
286
  return {
287
- west: e.west - s,
288
- south: e.south - o,
289
- east: e.east + s,
290
- north: e.north + o
287
+ west: g.west - i,
288
+ south: g.south - e,
289
+ east: g.east + i,
290
+ north: g.north + e
291
291
  };
292
292
  }
293
- async function N(e, t) {
294
- const r = new I(e, t);
295
- return await r.init(), r;
293
+ async function U(g, I) {
294
+ const C = new Q(g, I);
295
+ return await C.init(), C;
296
296
  }
297
- async function B(e, t, r) {
298
- const i = new I(t, r);
299
- await i.init();
300
- const s = e.imageryLayers.addImageryProvider(i);
301
- if (s.alpha = r?.alpha ?? 1, r?.flyTo !== !1 && e.camera) {
302
- const o = i.bboxDegrees, n = $({
303
- west: o[0],
304
- south: o[1],
305
- east: o[2],
306
- north: o[3]
297
+ async function f(g, I, C) {
298
+ const A = new Q(I, C);
299
+ await A.init();
300
+ const i = g.imageryLayers.addImageryProvider(A);
301
+ if (i.alpha = C?.alpha ?? 1, C?.flyTo !== !1 && g.camera) {
302
+ const e = A.bboxDegrees, o = k({
303
+ west: e[0],
304
+ south: e[1],
305
+ east: e[2],
306
+ north: e[3]
307
307
  }, 0.3);
308
- e.camera.flyTo({
308
+ g.camera.flyTo({
309
309
  destination: {
310
- west: n.west,
311
- south: n.south,
312
- east: n.east,
313
- north: n.north
310
+ west: o.west,
311
+ south: o.south,
312
+ east: o.east,
313
+ north: o.north
314
314
  },
315
315
  duration: 1.5
316
316
  });
317
317
  }
318
- return s;
318
+ return i;
319
319
  }
320
- async function Y(e, t, r) {
321
- const i = new I(t, r);
322
- await i.init();
323
- const s = i.bboxDegrees, o = i.maximumLevel, n = i.minimumLevel, a = await j(), { TileGrid: d } = a.tilegrid, l = 256, c = [];
324
- for (let g = 0; g <= o; g++) c.push(360 / (l * Math.pow(2, g + 1)));
325
- const m = new d({
320
+ async function x(g, I, C) {
321
+ const A = new Q(I, C);
322
+ await A.init();
323
+ const i = A.bboxDegrees, e = A.maximumLevel, o = A.minimumLevel, l = await R(), { TileGrid: c } = l.tilegrid, t = 256, a = [];
324
+ for (let m = 0; m <= e; m++) a.push(360 / (t * Math.pow(2, m + 1)));
325
+ const b = new c({
326
326
  extent: [
327
327
  -180,
328
328
  -90,
@@ -330,43 +330,43 @@ async function Y(e, t, r) {
330
330
  90
331
331
  ],
332
332
  origin: [-180, 90],
333
- resolutions: c,
334
- tileSize: [l, l]
335
- }), v = new a.source.TileImage({
333
+ resolutions: a,
334
+ tileSize: [t, t]
335
+ }), h = new l.source.TileImage({
336
336
  projection: "EPSG:4326",
337
- tileGrid: m,
338
- tileUrlFunction: (g) => `cog://${g[0]}/${g[1]}/${g[2]}`,
339
- tileLoadFunction: (g, _) => {
340
- const f = _.replace("cog://", "").split("/"), w = Number(f[0]), h = Number(f[1]), u = Number(f[2]);
341
- i.requestImage(h, u, w).then((L) => {
342
- L && L.toBlob((b) => {
343
- if (b) {
344
- const M = g.getImage();
345
- M.src = URL.createObjectURL(b);
337
+ tileGrid: b,
338
+ tileUrlFunction: (m) => `cog://${m[0]}/${m[1]}/${m[2]}`,
339
+ tileLoadFunction: (m, G) => {
340
+ const Z = G.replace("cog://", "").split("/"), W = Number(Z[0]), s = Number(Z[1]), n = Number(Z[2]);
341
+ A.requestImage(s, n, W).then((y) => {
342
+ y && y.toBlob((B) => {
343
+ if (B) {
344
+ const Y = m.getImage();
345
+ Y.src = URL.createObjectURL(B);
346
346
  }
347
347
  });
348
348
  }).catch(() => {
349
349
  });
350
350
  }
351
- }), p = new a.layer.Tile({
352
- source: v,
353
- opacity: r?.opacity ?? 1,
351
+ }), d = new l.layer.Tile({
352
+ source: h,
353
+ opacity: C?.opacity ?? 1,
354
354
  extent: [
355
- s[0],
356
- s[1],
357
- s[2],
358
- s[3]
355
+ i[0],
356
+ i[1],
357
+ i[2],
358
+ i[3]
359
359
  ],
360
- minResolution: c[Math.min(o, c.length - 1)],
361
- maxResolution: c[Math.min(n, c.length - 1)]
360
+ minResolution: a[Math.min(e, a.length - 1)],
361
+ maxResolution: a[Math.min(o, a.length - 1)]
362
362
  });
363
- e.addLayer(p);
364
- const y = e.getView();
365
- return y && y.fit([
366
- s[0],
367
- s[1],
368
- s[2],
369
- s[3]
363
+ g.addLayer(d);
364
+ const r = g.getView();
365
+ return r && r.fit([
366
+ i[0],
367
+ i[1],
368
+ i[2],
369
+ i[3]
370
370
  ], {
371
371
  padding: [
372
372
  50,
@@ -375,208 +375,208 @@ async function Y(e, t, r) {
375
375
  50
376
376
  ],
377
377
  duration: 1500
378
- }), p;
378
+ }), d;
379
379
  }
380
- async function j() {
380
+ async function R() {
381
381
  try {
382
- const e = (await import("ol/tilegrid/TileGrid")).default, t = (await import("ol/source/TileImage")).default, r = (await import("ol/layer/Tile")).default;
382
+ const g = (await import("ol/tilegrid/TileGrid")).default, I = (await import("ol/source/TileImage")).default, C = (await import("ol/layer/Tile")).default;
383
383
  return {
384
- tilegrid: { TileGrid: e },
385
- source: { TileImage: t },
386
- layer: { Tile: r }
384
+ tilegrid: { TileGrid: g },
385
+ source: { TileImage: I },
386
+ layer: { Tile: C }
387
387
  };
388
388
  } catch {
389
389
  throw new Error("OpenLayers 依赖未找到,请安装: npm install ol");
390
390
  }
391
391
  }
392
- function A(e) {
393
- const t = /* @__PURE__ */ new Map();
392
+ function L(g) {
393
+ const I = /* @__PURE__ */ new Map();
394
394
  return {
395
- async addCogLayer(r, i, s = {}) {
396
- const o = e();
397
- if (!o) throw new Error("Cesium Viewer 未初始化");
398
- const n = {
395
+ async addCogLayer(C, A, i = {}) {
396
+ const e = g();
397
+ if (!e) throw new Error("Cesium Viewer 未初始化");
398
+ const o = {
399
399
  alpha: 1,
400
400
  flyTo: !0,
401
- ...s
401
+ ...i
402
402
  };
403
- let a = null, d = null;
403
+ let l = null, c = null;
404
404
  try {
405
- a = new I(i, n), await a.init(), d = o.imageryLayers.addImageryProvider(a), d.alpha = n.alpha;
406
- const l = a.bboxDegrees, c = {
407
- imageryLayer: d,
408
- layerId: r,
409
- provider: a,
410
- bbox: [...l]
405
+ l = new Q(A, o), await l.init(), c = e.imageryLayers.addImageryProvider(l), c.alpha = o.alpha;
406
+ const t = l.bboxDegrees, a = {
407
+ imageryLayer: c,
408
+ layerId: C,
409
+ provider: l,
410
+ bbox: [...t]
411
411
  };
412
- if (t.set(r, c), n.flyTo !== !1) {
413
- const [m, v, p, y] = l, g = p - m, _ = y - v, f = g * 0.3, w = _ * 0.3, h = T.fromDegrees(m - f, v - w, p + f, y + w);
414
- o.camera.flyTo({
415
- destination: h,
412
+ if (I.set(C, a), o.flyTo !== !1) {
413
+ const [b, h, d, r] = t, m = d - b, G = r - h, Z = m * 0.3, W = G * 0.3, s = V.fromDegrees(b - Z, h - W, d + Z, r + W);
414
+ e.camera.flyTo({
415
+ destination: s,
416
416
  duration: 1.5
417
417
  });
418
418
  }
419
- return console.log("[COG] 加载成功:", r), c;
420
- } catch (l) {
421
- if (a?.destroy(), d) try {
422
- o.imageryLayers.remove(d, !0);
419
+ return console.log("[COG] 加载成功:", C), a;
420
+ } catch (t) {
421
+ if (l?.destroy(), c) try {
422
+ e.imageryLayers.remove(c, !0);
423
423
  } catch {
424
424
  }
425
- throw l;
425
+ throw t;
426
426
  }
427
427
  },
428
- removeCogLayer(r) {
429
- const i = t.get(r);
430
- if (!i) {
431
- console.warn("[COG] 图层不存在:", r);
428
+ removeCogLayer(C) {
429
+ const A = I.get(C);
430
+ if (!A) {
431
+ console.warn("[COG] 图层不存在:", C);
432
432
  return;
433
433
  }
434
434
  try {
435
- i.provider.destroy();
436
- const s = e();
437
- s && (i.imageryLayer.show = !1, s.scene.requestRender(), requestAnimationFrame(() => {
435
+ A.provider.destroy();
436
+ const i = g();
437
+ i && (A.imageryLayer.show = !1, i.scene.requestRender(), requestAnimationFrame(() => {
438
438
  try {
439
- s.imageryLayers.remove(i.imageryLayer, !0), s.scene.requestRender();
439
+ i.imageryLayers.remove(A.imageryLayer, !0), i.scene.requestRender();
440
440
  } catch {
441
441
  }
442
442
  }));
443
- } catch (s) {
444
- console.warn("[COG] 移除图层时出错:", s);
443
+ } catch (i) {
444
+ console.warn("[COG] 移除图层时出错:", i);
445
445
  }
446
- t.delete(r);
446
+ I.delete(C);
447
447
  },
448
- flyToCogLayer(r) {
449
- const i = t.get(r);
450
- if (!i) {
451
- console.warn("[COG] 图层不存在:", r);
448
+ flyToCogLayer(C) {
449
+ const A = I.get(C);
450
+ if (!A) {
451
+ console.warn("[COG] 图层不存在:", C);
452
452
  return;
453
453
  }
454
- const s = e();
455
- if (!s) return;
456
- const [o, n, a, d] = i.bbox, l = (a - o) * 0.3, c = (d - n) * 0.3, m = T.fromDegrees(o - l, n - c, a + l, d + c);
457
- s.camera.flyTo({
458
- destination: m,
454
+ const i = g();
455
+ if (!i) return;
456
+ const [e, o, l, c] = A.bbox, t = (l - e) * 0.3, a = (c - o) * 0.3, b = V.fromDegrees(e - t, o - a, l + t, c + a);
457
+ i.camera.flyTo({
458
+ destination: b,
459
459
  duration: 1.5
460
460
  });
461
461
  },
462
462
  destroyCogTools() {
463
- for (const [r] of t) this.removeCogLayer(r);
464
- t.clear();
463
+ for (const [C] of I) this.removeCogLayer(C);
464
+ I.clear();
465
465
  }
466
466
  };
467
467
  }
468
- function V(e = {}) {
469
- const { baseUrl: t = "/Cesium/", cogApiUrl: r = "http://localhost:5158/api/cog/list", cogStaticBaseUrl: i = "http://localhost:5158", viewerOptions: s = {} } = e, o = S(null), n = x([]), a = x(""), d = x(!1), l = x(null);
470
- let c = null, m = null;
471
- const v = async (h = "cesiumContainer") => {
468
+ function j(g = {}) {
469
+ const { baseUrl: I = "/Cesium/", cogApiUrl: C = "http://localhost:5158/api/cog/list", cogStaticBaseUrl: A = "http://localhost:5158", viewerOptions: i = {} } = g, e = S(null), o = u([]), l = u(""), c = u(!1), t = u(null);
470
+ let a = null, b = null;
471
+ const h = async (s = "cesiumContainer") => {
472
472
  try {
473
- window.CESIUM_BASE_URL = t, k.RequestScheduler.maximumRequests = 100, k.RequestScheduler.maximumRequestsPerServer = 24, o.value = new k.Viewer(h, {
473
+ window.CESIUM_BASE_URL = I, N.RequestScheduler.maximumRequests = 100, N.RequestScheduler.maximumRequestsPerServer = 24, e.value = new N.Viewer(s, {
474
474
  geocoder: !1,
475
475
  animation: !1,
476
476
  timeline: !1,
477
477
  baseLayerPicker: !1,
478
- terrainProvider: new k.EllipsoidTerrainProvider(),
478
+ terrainProvider: new N.EllipsoidTerrainProvider(),
479
479
  imagery: !1,
480
480
  sun: !1,
481
481
  moon: !1,
482
- ...s
483
- }), o.value.imageryLayers.length > 0 ? console.log("[CogManager] 当前已有底图,不再重复清理") : o.value.imageryLayers.addImageryProvider(new k.UrlTemplateImageryProvider({
482
+ ...i
483
+ }), e.value.imageryLayers.length > 0 ? console.log("[CogManager] 当前已有底图,不再重复清理") : e.value.imageryLayers.addImageryProvider(new N.UrlTemplateImageryProvider({
484
484
  url: "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
485
- tilingScheme: new k.WebMercatorTilingScheme(),
485
+ tilingScheme: new N.WebMercatorTilingScheme(),
486
486
  maximumLevel: 18
487
487
  }));
488
- const u = o.value.scene;
489
- u.fog.enabled = !1, u.highDynamicRange = !1, u.globe.depthTestAgainstTerrain = !1, u.globe.baseColor = k.Color.fromCssColorString("#1a1a2e"), u.backgroundColor = k.Color.fromCssColorString("#1a1a2e"), u.skyAtmosphere && (u.skyAtmosphere.show = !1), u.light.enabled = !1, o.value.cesiumWidget.creditContainer && (o.value.cesiumWidget.creditContainer.style.display = "none"), await new Promise((L) => requestAnimationFrame(() => L())), c = A(() => o.value), l.value = null;
490
- } catch (u) {
491
- throw l.value = u.message || "Viewer 初始化失败", console.error("[CogManager] 初始化失败:", u), u;
488
+ const n = e.value.scene;
489
+ n.fog.enabled = !1, n.highDynamicRange = !1, n.globe.depthTestAgainstTerrain = !1, n.globe.baseColor = N.Color.fromCssColorString("#1a1a2e"), n.backgroundColor = N.Color.fromCssColorString("#1a1a2e"), n.skyAtmosphere && (n.skyAtmosphere.show = !1), n.light.enabled = !1, e.value.cesiumWidget.creditContainer && (e.value.cesiumWidget.creditContainer.style.display = "none"), await new Promise((y) => requestAnimationFrame(() => y())), a = L(() => e.value), t.value = null;
490
+ } catch (n) {
491
+ throw t.value = n.message || "Viewer 初始化失败", console.error("[CogManager] 初始化失败:", n), n;
492
492
  }
493
- }, p = async () => {
493
+ }, d = async () => {
494
494
  try {
495
- const h = new AbortController(), u = setTimeout(() => h.abort(), 1e4), L = await fetch(r, { signal: h.signal });
496
- clearTimeout(u), n.value = (await L.json()).map((b) => ({
497
- name: b.name,
498
- url: b.staticUrl.startsWith("http") ? b.staticUrl : `${i}${b.staticUrl}`
499
- })), n.value.length > 0 && (a.value = n.value[0].url), l.value = null;
500
- } catch (h) {
501
- console.error("[CogManager] 获取 COG 列表失败:", h), n.value = [], l.value = "获取 COG 列表失败: " + (h.name === "AbortError" ? "请求超时" : h.message);
495
+ const s = new AbortController(), n = setTimeout(() => s.abort(), 1e4), y = await fetch(C, { signal: s.signal });
496
+ clearTimeout(n), o.value = (await y.json()).map((B) => ({
497
+ name: B.name,
498
+ url: B.staticUrl.startsWith("http") ? B.staticUrl : `${A}${B.staticUrl}`
499
+ })), o.value.length > 0 && (l.value = o.value[0].url), t.value = null;
500
+ } catch (s) {
501
+ console.error("[CogManager] 获取 COG 列表失败:", s), o.value = [], t.value = "获取 COG 列表失败: " + (s.name === "AbortError" ? "请求超时" : s.message);
502
502
  }
503
- }, y = async () => {
504
- if (!(!a.value || d.value)) {
505
- d.value = !0, l.value = null;
503
+ }, r = async () => {
504
+ if (!(!l.value || c.value)) {
505
+ c.value = !0, t.value = null;
506
506
  try {
507
- if (m) {
507
+ if (b) {
508
508
  try {
509
- c?.removeCogLayer(m);
510
- } catch (u) {
511
- console.warn("[CogManager] 移除旧图层时出错(继续加载):", u);
509
+ a?.removeCogLayer(b);
510
+ } catch (n) {
511
+ console.warn("[CogManager] 移除旧图层时出错(继续加载):", n);
512
512
  }
513
- m = null, await new Promise((u) => requestAnimationFrame(() => requestAnimationFrame(() => u())));
513
+ b = null, await new Promise((n) => requestAnimationFrame(() => requestAnimationFrame(() => n())));
514
514
  }
515
- const h = "cog-layer-" + Date.now();
516
- await c.addCogLayer(h, a.value, {
515
+ const s = "cog-layer-" + Date.now();
516
+ await a.addCogLayer(s, l.value, {
517
517
  alpha: 1,
518
518
  flyTo: !0
519
- }), m = h, console.log("[CogManager] 加载成功:", h);
520
- } catch (h) {
521
- throw console.error("[CogManager] 加载失败:", h), l.value = h.message, h;
519
+ }), b = s, console.log("[CogManager] 加载成功:", s);
520
+ } catch (s) {
521
+ throw console.error("[CogManager] 加载失败:", s), t.value = s.message, s;
522
522
  } finally {
523
- d.value = !1;
523
+ c.value = !1;
524
524
  }
525
525
  }
526
- }, g = () => {
527
- if (!m) {
528
- l.value = "没有可移除的图层";
526
+ }, m = () => {
527
+ if (!b) {
528
+ t.value = "没有可移除的图层";
529
529
  return;
530
530
  }
531
- if (!c) {
532
- l.value = "系统未初始化";
531
+ if (!a) {
532
+ t.value = "系统未初始化";
533
533
  return;
534
534
  }
535
- console.log("[CogManager] 移除图层:", m), c.removeCogLayer(m), m = null, l.value = null;
536
- }, _ = () => {
537
- if (!m) {
538
- l.value = "没有可飞行的图层";
535
+ console.log("[CogManager] 移除图层:", b), a.removeCogLayer(b), b = null, t.value = null;
536
+ }, G = () => {
537
+ if (!b) {
538
+ t.value = "没有可飞行的图层";
539
539
  return;
540
540
  }
541
- if (!c) {
542
- l.value = "系统未初始化";
541
+ if (!a) {
542
+ t.value = "系统未初始化";
543
543
  return;
544
544
  }
545
- c.flyToCogLayer(m), l.value = null;
546
- }, f = async (h) => {
547
- a.value = h;
545
+ a.flyToCogLayer(b), t.value = null;
546
+ }, Z = async (s) => {
547
+ l.value = s;
548
548
  try {
549
- await y();
550
- } catch (u) {
551
- console.error("[CogManager] 切换 COG 失败:", u);
549
+ await r();
550
+ } catch (n) {
551
+ console.error("[CogManager] 切换 COG 失败:", n);
552
552
  }
553
- }, w = () => {
554
- c?.destroyCogTools(), o.value?.destroy(), o.value = null, c = null, m = null;
553
+ }, W = () => {
554
+ a?.destroyCogTools(), e.value?.destroy(), e.value = null, a = null, b = null;
555
555
  };
556
- return E(w), {
557
- viewer: o,
558
- cogList: n,
559
- selectedCog: a,
560
- isLoading: d,
561
- error: l,
562
- initViewer: v,
563
- fetchCogList: p,
564
- loadCOG: y,
565
- removeCOG: g,
566
- flyTo: _,
567
- switchCog: f,
568
- destroy: w
556
+ return X(W), {
557
+ viewer: e,
558
+ cogList: o,
559
+ selectedCog: l,
560
+ isLoading: c,
561
+ error: t,
562
+ initViewer: h,
563
+ fetchCogList: d,
564
+ loadCOG: r,
565
+ removeCOG: m,
566
+ flyTo: G,
567
+ switchCog: Z,
568
+ destroy: W
569
569
  };
570
570
  }
571
571
  export {
572
- I as CogImageryProvider,
573
- W as LRUCache,
574
- B as addCogLayerToMap,
575
- Y as addCogLayerToOpenLayers,
576
- N as createCogProvider,
577
- $ as expandRectangle,
578
- V as useCogManager,
579
- A as useCogTif
572
+ Q as CogImageryProvider,
573
+ v as LRUCache,
574
+ f as addCogLayerToMap,
575
+ x as addCogLayerToOpenLayers,
576
+ U as createCogProvider,
577
+ k as expandRectangle,
578
+ j as useCogManager,
579
+ L as useCogTif
580
580
  };
581
581
 
582
582
  //# sourceMappingURL=index.js.map