@terra.gl/core 0.0.1-alpha.71 → 0.0.1-alpha.72
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 +4 -4
- package/dist/index.umd.cjs +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as yt from "three";
|
|
2
2
|
import { REVISION as pf, TrianglesDrawMode as ib, TriangleFanDrawMode as ec, TriangleStripDrawMode as mf, Mesh as Ze, Vector3 as O, Color as he, FrontSide as ua, Plane as gf, Matrix4 as Le, Vector4 as Mi, PerspectiveCamera as cr, WebGLRenderTarget as Dr, UniformsUtils as dr, UniformsLib as aa, ShaderMaterial as At, MOUSE as wn, TOUCH as bn, Spherical as ad, Quaternion as bi, OrthographicCamera as hr, Vector2 as ce, Ray as nb, PlaneGeometry as Ti, HalfFloatType as rr, AdditiveBlending as yc, MeshBasicMaterial as xi, RGBAFormat as yf, LinearFilter as Wn, NoBlending as rb, Clock as da, Loader as _c, LoaderUtils as Xr, FileLoader as Zn, MeshPhysicalMaterial as Oi, SpotLight as _f, PointLight as tc, DirectionalLight as la, InstancedMesh as vc, InstancedBufferAttribute as ic, Object3D as Si, TextureLoader as zs, ImageBitmapLoader as sb, BufferAttribute as Mt, InterleavedBuffer as ob, InterleavedBufferAttribute as sr, LinearMipmapLinearFilter as Os, NearestMipmapLinearFilter as ab, LinearMipmapNearestFilter as lb, NearestMipmapNearestFilter as cb, NearestFilter as vf, RepeatWrapping as Li, MirroredRepeatWrapping as hb, ClampToEdgeWrapping as nc, PointsMaterial as fa, Material as Gl, LineBasicMaterial as wc, MeshStandardMaterial as Ds, DoubleSide as Yr, PropertyBinding as As, BufferGeometry as Bt, SkinnedMesh as wf, LineSegments as ub, Line as bc, LineLoop as db, Points as Br, Group as ci, MathUtils as wt, Skeleton as bf, AnimationClip as xf, Bone as rc, InterpolateDiscrete as fb, InterpolateLinear as Tf, Texture as Ur, VectorKeyframeTrack as sc, NumberKeyframeTrack as oc, QuaternionKeyframeTrack as ac, Interpolant as pb, Box3 as mr, Sphere as xc, Curve as mb, MeshPhongMaterial as Rs, MeshLambertMaterial as Sf, EquirectangularReflectionMapping as gb, AmbientLight as Mf, Float32BufferAttribute as xn, Uint16BufferAttribute as yb, Matrix3 as _b, Euler as Ls, DataTextureLoader as vb, FloatType as ra, DataUtils as Ao, InstancedBufferGeometry as Lf, InstancedInterleavedBuffer as lc, WireframeGeometry as wb, Line3 as bb, EventDispatcher as Pf, Scene as Cf, FogExp2 as ld, CubeTextureLoader as xb, WebGLRenderer as Tb, PCFSoftShadowMap as Sb, ACESFilmicToneMapping as Mb, SRGBColorSpace as Kr, CameraHelper as Lb, CubicBezierCurve3 as Pb, Frustum as Cb, Raycaster as Fs, CanvasTexture as gr, SpriteMaterial as Rn, Sprite as Vi, DynamicDrawUsage as cd, NormalBlending as Gf, CurvePath as Wf, LineCurve3 as kr, QuadraticBezierCurve3 as Zf, TubeGeometry as Gb, BackSide as Wb, Shape as Zb, ShapeGeometry as Rb, CylinderGeometry as Ib, AnimationMixer as Eb, LoopRepeat as Ab, LoopOnce as Fb, LoadingManager as Vb, Box2 as zb, ImageLoader as Rf } from "three";
|
|
3
|
-
const Ob = "0.0.1-alpha.
|
|
3
|
+
const Ob = "0.0.1-alpha.72", Wl = {
|
|
4
4
|
name: "Criska"
|
|
5
5
|
};
|
|
6
6
|
var Is = function() {
|
|
@@ -19785,7 +19785,7 @@ function A2(r, e) {
|
|
|
19785
19785
|
}
|
|
19786
19786
|
const F2 = `{
|
|
19787
19787
|
"name": "@terra.gl/core",
|
|
19788
|
-
"version": "0.0.1-alpha.
|
|
19788
|
+
"version": "0.0.1-alpha.72",
|
|
19789
19789
|
"type": "module",
|
|
19790
19790
|
"files": [
|
|
19791
19791
|
"dist"
|
|
@@ -25048,12 +25048,12 @@ class pC extends Hs {
|
|
|
25048
25048
|
const n = e.size ?? 32, s = new Rn({
|
|
25049
25049
|
map: i,
|
|
25050
25050
|
transparent: !0,
|
|
25051
|
+
depthTest: !1,
|
|
25051
25052
|
depthWrite: !1,
|
|
25052
|
-
// Allow features behind to show through transparent areas
|
|
25053
25053
|
sizeAttenuation: !1
|
|
25054
25054
|
// Use pixel size, not world size
|
|
25055
25055
|
}), a = new Vi(s);
|
|
25056
|
-
a.scale.set(n, n, 1);
|
|
25056
|
+
a.scale.set(n, n, 1), a.renderOrder = 999;
|
|
25057
25057
|
const c = e.anchor ?? [0.5, 0.5];
|
|
25058
25058
|
a.center.set(c[0], c[1]), this._marker = a, console.log("TrajectoryLayer: marker sprite created manually", {
|
|
25059
25059
|
texWidth: i.image?.width,
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(q,p){typeof exports=="object"&&typeof module<"u"?p(exports,require("three")):typeof define=="function"&&define.amd?define(["exports","three"],p):(q=typeof globalThis<"u"?globalThis:q||self,p(q["terra-gl"]={},q.THREE))})(this,function(q,p){"use strict";function pf(r){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const t in r)if(t!=="default"){const i=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,i.get?i:{enumerable:!0,get:()=>r[t]})}}return e.default=r,Object.freeze(e)}const ut=pf(p),mf="0.0.1-alpha.
|
|
1
|
+
(function(q,p){typeof exports=="object"&&typeof module<"u"?p(exports,require("three")):typeof define=="function"&&define.amd?define(["exports","three"],p):(q=typeof globalThis<"u"?globalThis:q||self,p(q["terra-gl"]={},q.THREE))})(this,function(q,p){"use strict";function pf(r){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const t in r)if(t!=="default"){const i=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,i.get?i:{enumerable:!0,get:()=>r[t]})}}return e.default=r,Object.freeze(e)}const ut=pf(p),mf="0.0.1-alpha.72",xo={name:"Criska"};var gr=function(){var r=0,e=document.createElement("div");e.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000",e.addEventListener("click",function(m){m.preventDefault(),i(++r%e.children.length)},!1);function t(m){return e.appendChild(m.dom),m}function i(m){for(var f=0;f<e.children.length;f++)e.children[f].style.display=f===m?"block":"none";r=m}var n=(performance||Date).now(),s=n,a=0,c=t(new gr.Panel("FPS","#0ff","#002")),h=t(new gr.Panel("MS","#0f0","#020"));if(self.performance&&self.performance.memory)var d=t(new gr.Panel("MB","#f08","#201"));return i(0),{REVISION:16,dom:e,addPanel:t,showPanel:i,begin:function(){n=(performance||Date).now()},end:function(){a++;var m=(performance||Date).now();if(h.update(m-n,200),m>=s+1e3&&(c.update(a*1e3/(m-s),100),s=m,a=0,d)){var f=performance.memory;d.update(f.usedJSHeapSize/1048576,f.jsHeapSizeLimit/1048576)}return m},update:function(){n=this.end()},domElement:e,setMode:i}};gr.Panel=function(r,e,t){var i=1/0,n=0,s=Math.round,a=s(window.devicePixelRatio||1),c=80*a,h=48*a,d=3*a,m=2*a,f=3*a,g=15*a,_=74*a,w=30*a,b=document.createElement("canvas");b.width=c,b.height=h,b.style.cssText="width:80px;height:48px";var x=b.getContext("2d");return x.font="bold "+9*a+"px Helvetica,Arial,sans-serif",x.textBaseline="top",x.fillStyle=t,x.fillRect(0,0,c,h),x.fillStyle=e,x.fillText(r,d,m),x.fillRect(f,g,_,w),x.fillStyle=t,x.globalAlpha=.9,x.fillRect(f,g,_,w),{dom:b,update:function(L,M){i=Math.min(i,L),n=Math.max(n,L),x.fillStyle=t,x.globalAlpha=1,x.fillRect(0,0,c,g),x.fillStyle=e,x.fillText(s(L)+" "+r+" ("+s(i)+"-"+s(n)+")",d,m),x.drawImage(b,f+a,g,_-a,w,f,g,_-a,w),x.fillRect(f+_-a,g,a,w),x.fillStyle=t,x.globalAlpha=.9,x.fillRect(f+_-a,g,a,s((1-L/M)*w))}}};const ns=parseInt(p.REVISION.replace(/\D+/g,"")),Mo=ns>=125?"uv1":"uv2";function Dl(r,e){if(e===p.TrianglesDrawMode)return console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."),r;if(e===p.TriangleFanDrawMode||e===p.TriangleStripDrawMode){let t=r.getIndex();if(t===null){const a=[],c=r.getAttribute("position");if(c!==void 0){for(let h=0;h<c.count;h++)a.push(h);r.setIndex(a),t=r.getIndex()}else return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."),r}const i=t.count-2,n=[];if(t)if(e===p.TriangleFanDrawMode)for(let a=1;a<=i;a++)n.push(t.getX(0)),n.push(t.getX(a)),n.push(t.getX(a+1));else for(let a=0;a<i;a++)a%2===0?(n.push(t.getX(a)),n.push(t.getX(a+1)),n.push(t.getX(a+2))):(n.push(t.getX(a+2)),n.push(t.getX(a+1)),n.push(t.getX(a)));n.length/3!==i&&console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.");const s=r.clone();return s.setIndex(n),s.clearGroups(),s}else return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:",e),r}var Kt=Uint8Array,Xi=Uint16Array,So=Uint32Array,Xl=new Kt([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),kl=new Kt([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),gf=new Kt([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Ul=function(r,e){for(var t=new Xi(31),i=0;i<31;++i)t[i]=e+=1<<r[i-1];for(var n=new So(t[30]),i=1;i<30;++i)for(var s=t[i];s<t[i+1];++s)n[s]=s-t[i]<<5|i;return[t,n]},Nl=Ul(Xl,2),Kl=Nl[0],yf=Nl[1];Kl[28]=258,yf[258]=28;for(var _f=Ul(kl,0),vf=_f[0],Lo=new Xi(32768),Ze=0;Ze<32768;++Ze){var ki=(Ze&43690)>>>1|(Ze&21845)<<1;ki=(ki&52428)>>>2|(ki&13107)<<2,ki=(ki&61680)>>>4|(ki&3855)<<4,Lo[Ze]=((ki&65280)>>>8|(ki&255)<<8)>>>1}for(var yr=function(r,e,t){for(var i=r.length,n=0,s=new Xi(e);n<i;++n)++s[r[n]-1];var a=new Xi(e);for(n=0;n<e;++n)a[n]=a[n-1]+s[n-1]<<1;var c;if(t){c=new Xi(1<<e);var h=15-e;for(n=0;n<i;++n)if(r[n])for(var d=n<<4|r[n],m=e-r[n],f=a[r[n]-1]++<<m,g=f|(1<<m)-1;f<=g;++f)c[Lo[f]>>>h]=d}else for(c=new Xi(i),n=0;n<i;++n)r[n]&&(c[n]=Lo[a[r[n]-1]++]>>>15-r[n]);return c},_r=new Kt(288),Ze=0;Ze<144;++Ze)_r[Ze]=8;for(var Ze=144;Ze<256;++Ze)_r[Ze]=9;for(var Ze=256;Ze<280;++Ze)_r[Ze]=7;for(var Ze=280;Ze<288;++Ze)_r[Ze]=8;for(var Bl=new Kt(32),Ze=0;Ze<32;++Ze)Bl[Ze]=5;var wf=yr(_r,9,1),bf=yr(Bl,5,1),Po=function(r){for(var e=r[0],t=1;t<r.length;++t)r[t]>e&&(e=r[t]);return e},ii=function(r,e,t){var i=e/8|0;return(r[i]|r[i+1]<<8)>>(e&7)&t},Co=function(r,e){var t=e/8|0;return(r[t]|r[t+1]<<8|r[t+2]<<16)>>(e&7)},xf=function(r){return(r/8|0)+(r&7&&1)},Mf=function(r,e,t){(t==null||t>r.length)&&(t=r.length);var i=new(r instanceof Xi?Xi:r instanceof So?So:Kt)(t-e);return i.set(r.subarray(e,t)),i},Sf=function(r,e,t){var i=r.length;if(!i||t&&!t.l&&i<5)return e||new Kt(0);var n=!e||t,s=!t||t.i;t||(t={}),e||(e=new Kt(i*3));var a=function(pt){var $e=e.length;if(pt>$e){var Re=new Kt(Math.max($e*2,pt));Re.set(e),e=Re}},c=t.f||0,h=t.p||0,d=t.b||0,m=t.l,f=t.d,g=t.m,_=t.n,w=i*8;do{if(!m){t.f=c=ii(r,h,1);var b=ii(r,h+1,3);if(h+=3,b)if(b==1)m=wf,f=bf,g=9,_=5;else if(b==2){var C=ii(r,h,31)+257,W=ii(r,h+10,15)+4,D=C+ii(r,h+5,31)+1;h+=14;for(var z=new Kt(D),X=new Kt(19),I=0;I<W;++I)X[gf[I]]=ii(r,h+I*3,7);h+=W*3;for(var U=Po(X),V=(1<<U)-1,G=yr(X,U,1),I=0;I<D;){var N=G[ii(r,h,V)];h+=N&15;var x=N>>>4;if(x<16)z[I++]=x;else{var j=0,Y=0;for(x==16?(Y=3+ii(r,h,3),h+=2,j=z[I-1]):x==17?(Y=3+ii(r,h,7),h+=3):x==18&&(Y=11+ii(r,h,127),h+=7);Y--;)z[I++]=j}}var H=z.subarray(0,C),Q=z.subarray(C);g=Po(H),_=Po(Q),m=yr(H,g,1),f=yr(Q,_,1)}else throw"invalid block type";else{var x=xf(h)+4,L=r[x-4]|r[x-3]<<8,M=x+L;if(M>i){if(s)throw"unexpected EOF";break}n&&a(d+L),e.set(r.subarray(x,M),d),t.b=d+=L,t.p=h=M*8;continue}if(h>w){if(s)throw"unexpected EOF";break}}n&&a(d+131072);for(var re=(1<<g)-1,ne=(1<<_)-1,le=h;;le=h){var j=m[Co(r,h)&re],de=j>>>4;if(h+=j&15,h>w){if(s)throw"unexpected EOF";break}if(!j)throw"invalid length/literal";if(de<256)e[d++]=de;else if(de==256){le=h,m=null;break}else{var ge=de-254;if(de>264){var I=de-257,fe=Xl[I];ge=ii(r,h,(1<<fe)-1)+Kl[I],h+=fe}var Se=f[Co(r,h)&ne],st=Se>>>4;if(!Se)throw"invalid distance";h+=Se&15;var Q=vf[st];if(st>3){var fe=kl[st];Q+=Co(r,h)&(1<<fe)-1,h+=fe}if(h>w){if(s)throw"unexpected EOF";break}n&&a(d+131072);for(var ot=d+ge;d<ot;d+=4)e[d]=e[d-Q],e[d+1]=e[d+1-Q],e[d+2]=e[d+2-Q],e[d+3]=e[d+3-Q];d=ot}}t.l=m,t.p=le,t.b=d,m&&(c=1,t.m=g,t.d=f,t.n=_)}while(!c);return d==e.length?e:Mf(e,0,d)},Lf=new Kt(0),Pf=function(r){if((r[0]&15)!=8||r[0]>>>4>7||(r[0]<<8|r[1])%31)throw"invalid zlib data";if(r[1]&32)throw"invalid zlib data: preset dictionaries not supported"};function Cf(r,e){return Sf((Pf(r),r.subarray(2,-4)),e)}var Tf=typeof TextDecoder<"u"&&new TextDecoder,Gf=0;try{Tf.decode(Lf,{stream:!0}),Gf=1}catch{}class Wf extends p.Mesh{constructor(e,t={}){super(e),this.isWater=!0;const i=this,n=t.textureWidth!==void 0?t.textureWidth:512,s=t.textureHeight!==void 0?t.textureHeight:512,a=t.clipBias!==void 0?t.clipBias:0,c=t.alpha!==void 0?t.alpha:1,h=t.time!==void 0?t.time:0,d=t.waterNormals!==void 0?t.waterNormals:null,m=t.sunDirection!==void 0?t.sunDirection:new p.Vector3(.70707,.70707,0),f=new p.Color(t.sunColor!==void 0?t.sunColor:16777215),g=new p.Color(t.waterColor!==void 0?t.waterColor:8355711),_=t.eye!==void 0?t.eye:new p.Vector3(0,0,0),w=t.distortionScale!==void 0?t.distortionScale:20,b=t.side!==void 0?t.side:p.FrontSide,x=t.fog!==void 0?t.fog:!1,L=new p.Plane,M=new p.Vector3,C=new p.Vector3,W=new p.Vector3,D=new p.Matrix4,z=new p.Vector3(0,0,-1),X=new p.Vector4,I=new p.Vector3,U=new p.Vector3,V=new p.Vector4,G=new p.Matrix4,N=new p.PerspectiveCamera,j=new p.WebGLRenderTarget(n,s),Y={uniforms:p.UniformsUtils.merge([p.UniformsLib.fog,p.UniformsLib.lights,{normalSampler:{value:null},mirrorSampler:{value:null},alpha:{value:1},time:{value:0},size:{value:1},distortionScale:{value:20},textureMatrix:{value:new p.Matrix4},sunColor:{value:new p.Color(8355711)},sunDirection:{value:new p.Vector3(.70707,.70707,0)},eye:{value:new p.Vector3},waterColor:{value:new p.Color(5592405)}}]),vertexShader:`
|
|
2
2
|
uniform mat4 textureMatrix;
|
|
3
3
|
uniform float time;
|
|
4
4
|
|
|
@@ -1121,7 +1121,7 @@ function print() { __p += __j.call(arguments, '') }
|
|
|
1121
1121
|
}
|
|
1122
1122
|
`)}setDiffusionFromObject(e){if(!this.shaderOption.effects?.diffusion)return;const t=new ut.Box3().setFromObject(e);if(t.isEmpty())return;const i=new ut.Vector3;t.getCenter(i);const n=[new ut.Vector3(t.min.x,t.min.y,t.min.z),new ut.Vector3(t.max.x,t.max.y,t.max.z)];let s=0;n.forEach(a=>{const c=i.distanceTo(a);c>s&&(s=c)}),this.shaderOption.effects.diffusion={...this.shaderOption.effects.diffusion,center:i,maxDistance:s},this.needsUpdate=!0}updateBoundingBox(e,t){this.shaderOption.minY=e,this.shaderOption.maxY=t,this.needsUpdate=!0}updateEffects(e){this.shaderOption.effects={...this.shaderOption.effects,...e},this.needsUpdate=!0}animate(){requestAnimationFrame(()=>this.animate()),this.time.value=this.clock.getElapsedTime(),this.startTime.value<1&&(this.startTime.value+=.01)}}var ty=Object.defineProperty,iy=(r,e,t)=>e in r?ty(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,ri=(r,e,t)=>iy(r,typeof e!="symbol"?e+"":e,t);const ny={emissive:!1,emissiveIntensity:1,emissiveColor:"#ffffff"};class sh extends ni{constructor(e){super(e),ri(this,"_type","Model"),ri(this,"_emissive",!1),ri(this,"_emissiveIntensity",1),ri(this,"_emissiveColor","#ffffff"),ri(this,"_mixer",null),ri(this,"_currentAction",null),ri(this,"_animations",[]),ri(this,"_clock",new p.Clock),ri(this,"_autoUpdate",!0),ri(this,"_animationRequestId",null),ri(this,"_iscity",!1),this._emissive=e.emissive||!1,this._emissiveIntensity=e.emissiveIntensity||1,this._emissiveColor=e.emissiveColor||"#ffffff",this.castShadow=e.castShadow||!1,this.receiveShadow=e.receiveShadow||!1,this._iscity=e.iscity||!1}async _toThreeJSGeometry(){if(this._position=this._coordsTransform(),this._style){if(this._threeGeometry&&this._disposeGeometry(),this.modelunino=await this._createObject(this._style),this._threeGeometry=this.modelunino.model,!this._threeGeometry){console.error("Model load failed: model returned by _createObject is undefined"),console.error("模型加载失败:_createObject返回的model为undefined");return}this._threeGeometry.userData._type="Model",this.modelunino.animations&&this.modelunino.animations.length>0&&(this._animations=this.modelunino.animations,this._mixer=new p.AnimationMixer(this._threeGeometry),this._startAnimationLoop(),this.playAnimation({name:this._animations[0].name,loop:!0,speed:1.5,fadeInDuration:.5,fadeOutDuration:.3})),this._updateGeometry(),this.setShadows({cast:this.castShadow,receive:this.receiveShadow}),this._applyEmissionProperties(),this._iscity&&this._rendercity(),this.trigger("loaded",{timestamp:xc(),targrt:this})}}async _createObject(e){switch(e.config.type){case"fbx":case"gltf":return mg(e.config,this._position);default:throw new Error(`Unsupported style type: ${e.config.type}`)}}_applyEmissionProperties(){this._threeGeometry&&this._threeGeometry.traverse(e=>{if("material"in e){const t=e.material;t&&(t.emissiveIntensity=this._emissive?this._emissiveIntensity:0,t.emissive&&t.emissive.setStyle(this._emissiveColor))}})}get emissive(){return this._emissive}set emissive(e){this._emissive=e,this._applyEmissionProperties()}get emissiveIntensity(){return this._emissiveIntensity}set emissiveIntensity(e){this._emissiveIntensity=e,this._applyEmissionProperties()}get emissiveColor(){return this._emissiveColor}set emissiveColor(e){this._emissiveColor=e,this._applyEmissionProperties()}setEmission(e,t,i){this._emissive=e,t!==void 0&&(this._emissiveIntensity=t),i!==void 0&&(this._emissiveColor=i),this._applyEmissionProperties()}async setShadows(e){this.castShadow=e.cast,this.receiveShadow=e.receive,this._threeGeometry&&this._threeGeometry.traverse(t=>{t.isMesh&&t.material&&(t.castShadow=e.cast,t.receiveShadow=e.receive)})}playAnimation(e){if(!this._mixer||this._animations.length===0){console.warn("No available animations for model"),console.warn("模型没有可用的动画");return}this._currentAction&&(e.fadeOutDuration&&e.fadeOutDuration>0?this._currentAction.fadeOut(e.fadeOutDuration):this._currentAction.stop());const t=typeof e.name=="number"?this._animations[e.name]:this._animations.find(i=>i.name===e.name);if(!t){console.warn(`Animation not found: ${e.name}`),console.warn(`找不到动画: ${e.name}`);return}this._currentAction=this._mixer.clipAction(t),this._currentAction.setLoop(e.loop?p.LoopRepeat:p.LoopOnce,e.loop?1/0:1),this._currentAction.timeScale=e.speed||1,this._currentAction.time=e.startAt||0,this._currentAction.setEffectiveWeight(e.weight||1),e.fadeInDuration&&e.fadeInDuration>0&&this._currentAction.fadeIn(e.fadeInDuration),this._currentAction.play(),this._autoUpdate&&this._animationRequestId===null&&this._startAnimationLoop()}stopAnimation(e={}){this._currentAction&&(e.fadeDuration&&e.fadeDuration>0?(this._currentAction.fadeOut(e.fadeDuration),setTimeout(()=>{this._currentAction&&(this._currentAction.stop(),this._currentAction=null)},e.fadeDuration*1e3)):(this._currentAction.stop(),this._currentAction=null))}setAnimationPaused(e){this._currentAction&&(this._currentAction.paused=e.paused)}setAnimationSpeed(e){this._currentAction&&(this._currentAction.timeScale=e.speed)}updateAnimation(e){this._mixer&&this._mixer.update(e.deltaTime)}getAnimationNames(){return this._animations.map(e=>e.name)}getCurrentAnimationName(){return this._currentAction?this._currentAction.getClip().name:null}getAnimationDuration(e){let t;return typeof e.name=="number"?t=this._animations[e.name]:t=this._animations.find(i=>i.name===e.name),t?t.duration:null}dispose(){this._stopAnimationLoop(),this._mixer&&(this._mixer.stopAllAction(),this._mixer.uncacheRoot(this._threeGeometry)),super.dispose()}_startAnimationLoop(){if(!this._autoUpdate||this._animationRequestId!==null)return;const e=()=>{if(this._mixer){const t=this._clock.getDelta();this._mixer.update(t)}this._animationRequestId=requestAnimationFrame(e)};this._clock.start(),this._animationRequestId=requestAnimationFrame(e)}_stopAnimationLoop(){this._animationRequestId!==null&&(cancelAnimationFrame(this._animationRequestId),this._animationRequestId=null),this._clock.stop()}setAutoUpdate(e){this._autoUpdate=e,e?this._startAnimationLoop():this._stopAnimationLoop()}_computeOverlayVertices(e){const t=e.feature;if(t&&Array.isArray(t._vertexPoints)&&t._vertexPoints.length>=6){const h=t.getMap?.()||this.getMap();if(h&&h.prjcenter){const d=h.prjcenter,m=t._vertexPoints,f=[];for(let g=0;g+2<m.length;g+=3){const _=m[g],w=m[g+2],b=d.x+_,x=d.z+w;f.push(new p.Vector2(b,x))}if(f.length>=3)return f}}const i=this.getMap();if(!i||!e.geometry)return null;const n=e.geometry;let s;if(n.type==="Polygon")s=n.coordinates;else if(n.type==="MultiPolygon"){if(!n.coordinates.length)return null;s=n.coordinates[0]}else return null;if(!s.length||!s[0].length)return null;const a=s[0],c=[];for(const h of a){const d=h[0],m=h[1],f=i.geo2world(new p.Vector3(d,m,0));c.push(new p.Vector2(f.x,f.z))}return c.length<3?null:c}_rendercity(){const e=this.getLayer();let t=null;if(e&&e.getRegionOverlays){const i=e.getRegionOverlays()||[];if(i.length){const n=i.filter(a=>(a.mode??"overlay")==="overlay").sort((a,c)=>(a.zIndex??0)-(c.zIndex??0)),s=n[n.length-1];if(s&&(s.geometry||s.feature)){const a=this._computeOverlayVertices(s);a&&a.length>=3&&(t={color:new p.Color(s.color??"#00FF88"),opacity:s.opacity??.3,vertices:a})}}}this.traverse(async i=>{if(i instanceof p.Mesh&&i.material){if(i.castShadow=!0,i.name==="building"){const n=new ey({color:new p.Color("#6BA7EC").multiplyScalar(1.8),opacity:.9,shaderOption:{minY:0,maxY:50,minRate:.3,maxRate:1.5,effects:{diffusion:{enabled:!0,color:new p.Color("#FFFFF"),width:300,speed:.05},flow:{enabled:!1,color:new p.Color("#FFFFF"),range:1e3,speed:3e3},sweep:{enabled:!0,color:new p.Color("#ffffff"),width:3,speed:5}}},regionOverlay:t||void 0}),s=new p.Box3().setFromObject(i);n.updateBoundingBox(s.min.y,s.max.y),n.setDiffusionFromObject(i),i.receiveShadow=!1,i.material=n,i.material.needsUpdate=!0}i.name==="grass"&&(i.castShadow=!1,i.receiveShadow=!0,i.material.color=new p.Color("#81e4d8ff)").multiplyScalar(.7),i.material.metalness=.2,i.material.roughness=.8,["metalnessMap","normalMap","roughnessMap","specularColorMap"].forEach(n=>{const s=i.material[n];s&&(s.wrapS=s.wrapT=p.RepeatWrapping,s.repeat.set(.3,.3),s.needsUpdate=!0)}),i.material.normalScale=new p.Vector2(3,3))}})}}sh.mergeOptions(ny);var ry=Object.defineProperty,sy=(r,e,t)=>e in r?ry(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,oy=(r,e,t)=>sy(r,e+"",t);const ay={};class oh extends ni{constructor(e){super(e),oy(this,"_type","Cloud")}async _toThreeJSGeometry(){this._position=this._coordsTransform(),this._style&&(this._threeGeometry&&this._disposeGeometry(),this._threeGeometry=await this._createObject(this._style),this._updateGeometry())}_updateGeometry(){this._disposeGeometry();const e=this.getLayer();this._threeGeometry&&(this._threeGeometry.position.copy(this._position),this._threeGeometry.renderOrder=99,e&&(e._clouds.add(this._threeGeometry),e._clouds.updateMatrixWorld()))}async _createObject(e){switch(e.config.type){case"cloud":return wg(e.config,this._position);default:throw new Error(`Unsupported style type: ${e.config.type}`)}}}oh.mergeOptions(ay);var ly=Object.defineProperty,cy=(r,e,t)=>e in r?ly(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,hy=(r,e,t)=>cy(r,e+"",t);const uy={};class ah extends ni{constructor(e){super(e),hy(this,"_type","Label")}async _toThreeJSGeometry(){this._position=this._coordsTransform(),this._style&&(this._threeGeometry&&this._disposeGeometry(),this._threeGeometry=await this._createObject(this._style),this._updateGeometry())}_updateGeometryPositions(){this._position=this._coordsTransform(),this._threeGeometry?(this._threeGeometry.position.copy(this._position),this.children.includes(this._threeGeometry)||this.add(this._threeGeometry),this.updateMatrixWorld(!0),this._threeGeometry.updateMatrixWorld(!0)):this._toThreeJSGeometry()}async _createObject(e){switch(e.config.type){case"canvas-label-fixed":return xg(e.config,new p.Vector3(0,0,0),this.getMap());case"canvas-label":return bg(e.config,new p.Vector3(0,0,0));default:throw new Error(`Unsupported style type: ${e.config.type}`)}}}ah.mergeOptions(uy);var dy=Object.defineProperty,fy=(r,e,t)=>e in r?dy(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,lh=(r,e,t)=>fy(r,typeof e!="symbol"?e+"":e,t);const py={};class ch extends ni{constructor(e){super(e),lh(this,"_type","TPoints"),lh(this,"_geometries"),this._geometries=e.geometries}async _toThreeJSGeometry(){this._position=this._coordsTransform(),this._style&&(this._threeGeometry&&this._disposeGeometry(),this._threeGeometry=await this._createObject(this._style),this._updateGeometry())}_updateGeometry(){this._threeGeometry&&(this._threeGeometry.points&&this.add(this._threeGeometry.points),this._threeGeometry.InstancedCol&&this.add(this._threeGeometry.InstancedCol),this.updateMatrixWorld(!0))}async _createObject(e){switch(e.config.type){case"light":return Zg(e.config,this._geometries,this.getMap());default:throw new Error(`Unsupported style type: ${e.config.type}`)}}}ch.mergeOptions(py);var my=Object.defineProperty,gy=(r,e,t)=>e in r?my(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Qi=(r,e,t)=>gy(r,typeof e!="symbol"?e+"":e,t);class Vr extends Yi(Object){constructor(e,t){super(),Qi(this,"options"),Qi(this,"map"),Qi(this,"_sprite",null),Qi(this,"_isDragging",!1),Qi(this,"_dragStartPosition",null),Qi(this,"_lastCoordinate",null),Qi(this,"_boundOnMouseMove",null),Qi(this,"_boundOnMouseUp",null),this.map=t,this.options={position:e.position,index:e.index,symbol:e.symbol??0,size:e.size??8,color:e.color??"#ffffff",opacity:e.opacity??.9,draggable:e.draggable??!0},this._createSprite(),this._boundOnMouseMove=this._onMouseMove.bind(this),this._boundOnMouseUp=this._onMouseUp.bind(this)}_createSprite(){const t=document.createElement("canvas"),i=t.getContext("2d");t.width=64,t.height=64;const n=64/2,s=64/2-2;i.clearRect(0,0,t.width,t.height),i.beginPath(),i.arc(n,n,s,0,2*Math.PI),i.fillStyle="#000000",i.fill(),i.beginPath(),i.arc(n,n,s-2,0,2*Math.PI),i.fillStyle=this.options.color,i.fill();const a=new p.CanvasTexture(t);a.needsUpdate=!0;const c=new p.SpriteMaterial({map:a,opacity:this.options.opacity,transparent:!0,depthTest:!1,depthWrite:!1,sizeAttenuation:!0});this._sprite=new p.Sprite(c),this._sprite.position.copy(this.options.position),this._sprite.renderOrder=999999;const h=new p.Vector2;this._sprite.onBeforeRender=(d,m,f)=>{if(!this._sprite||!f)return;const g=f.position.distanceTo(this._sprite.position);d.getSize(h);const _=d.getPixelRatio(),w=this.options.size*_;let b=1;if(f.isPerspectiveCamera){const x=f.fov*Math.PI/180,L=2*Math.tan(x/2)*g;b=w/h.y*L}else if(f.isOrthographicCamera){const x=f.top,L=f.bottom,M=Math.abs(x-L)/f.zoom;b=w/h.y*M}this._sprite.scale.set(b,b,1)},this._sprite._editHandle=this,this.map.viewer.scene.add(this._sprite)}updatePosition(e){this.options.position=e,this._sprite&&this._sprite.position.copy(e)}getPosition(){return this.options.position.clone()}getIndex(){return this.options.index}getSymbol(){return this.options.symbol}getSprite(){return this._sprite}intersect(e){return!this._sprite||!this.options.draggable?!1:e.intersectObject(this._sprite).length>0}startDrag(e){this.options.draggable&&(this._isDragging=!0,this._dragStartPosition=this.options.position.clone(),this._lastCoordinate=e,this.map.viewer.config("draggable",!1),this.map.on("mousemove",this._boundOnMouseMove),this.map.on("mouseup",this._boundOnMouseUp),this.trigger("dragstart",{target:this,coordinate:e,position:this.options.position.clone()}))}_onMouseMove(e){if(!this._isDragging||!this._lastCoordinate)return;const t=e.coordinate,i=t[0]-this._lastCoordinate[0],n=t[1]-this._lastCoordinate[1],s=this.map.world2geo(this.options.position),a=this.map.geo2world(new p.Vector3(t[0],t[1],s.z));this.updatePosition(a),this._lastCoordinate=t,this.trigger("dragging",{target:this,coordinate:t,position:this.options.position.clone(),offset:{dx:i,dy:n}})}_onMouseUp(e){this._isDragging&&(this._isDragging=!1,this.map.viewer.config("draggable",!0),this.map.off("mousemove",this._boundOnMouseMove),this.map.off("mouseup",this._boundOnMouseUp),this.trigger("dragend",{target:this,coordinate:e.coordinate,position:this.options.position.clone(),startPosition:this._dragStartPosition}),this._dragStartPosition=null,this._lastCoordinate=null)}show(){this._sprite&&(this._sprite.visible=!0)}hide(){this._sprite&&(this._sprite.visible=!1)}remove(){if(this._isDragging&&(this._isDragging=!1,this.map.viewer.config("draggable",!0),this.map.off("mousemove",this._boundOnMouseMove),this.map.off("mouseup",this._boundOnMouseUp)),this._sprite){this.map.viewer.scene.remove(this._sprite);const e=this._sprite.material;e.map&&e.map.dispose(),e.dispose(),this._sprite=null}this._dragStartPosition=null,this._lastCoordinate=null,this._boundOnMouseMove=null,this._boundOnMouseUp=null}}function sa(r,e,t){const{currentTarget:i,clientX:n,clientY:s}=r;if(i instanceof HTMLElement){const a=i.clientWidth,c=i.clientHeight,h=new p.Vector2(n/a*2-1,-(s/c)*2+1);return e.getLocalInfoFromScreen(t,h)?.location}else return}var yy=Object.defineProperty,_y=(r,e,t)=>e in r?yy(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,ft=(r,e,t)=>_y(r,typeof e!="symbol"?e+"":e,t);class vy extends ds{constructor(e,t){super(e),ft(this,"options"),ft(this,"_handles",[]),ft(this,"_middleHandles",[]),ft(this,"_middleHandleColor","rgba(255, 255, 255, 0.6)"),ft(this,"_editing",!1),ft(this,"_shadow",null),ft(this,"_shadowSnapshot",null),ft(this,"_updating",!1),ft(this,"_history",[]),ft(this,"_historyIndex",-1),ft(this,"_draggableOriginalState",!1),ft(this,"_boundOnMapMouseMove",null),ft(this,"_boundOnMapClick",null),ft(this,"_boundOnMapMouseDown",null),ft(this,"_boundOnFeatureDragging",null),ft(this,"_boundOnFeatureDragEnd",null),this.options={handleSize:t?.handleSize??8,handleColor:t?.handleColor??"#ffffff",showMiddleHandles:t?.showMiddleHandles??!1,maxHistorySize:t?.maxHistorySize??20,removeVertexOn:t?.removeVertexOn??"contextmenu"},this._boundOnMapMouseMove=this._onMapMouseMove.bind(this),this._boundOnMapClick=this._onMapClick.bind(this),this._boundOnMapMouseDown=this._onMapMouseDown.bind(this),this._boundOnFeatureDragging=this._onFeatureDragging.bind(this),this._boundOnFeatureDragEnd=this._onFeatureDragEnd.bind(this)}enable(){return this._editing?this:(super.enable(),this._editing=!0,this._createShadow(),this._saveSnapshot(),this._setFeatureEditingStyle(!0),this._createHandles(),this.target.trigger("editstart"),this._draggableOriginalState=this.target.options.draggable||!1,this._draggableOriginalState||(this.target.options.draggable=!0,this.target.draggable&&this.target.draggable.enable()),this)}disable(){return this._editing?(super.disable(),this._editing=!1,this._clearHandles(),this._setFeatureEditingStyle(!1),this._draggableOriginalState||(this.target.options.draggable=!1,this.target.draggable&&this.target.draggable.disable()),this._draggableOriginalState=!1,this._updateCoordFromShadow(),this._removeShadow(),this.target.trigger("editend"),this):this}addHooks(){const e=this._getMap();e&&(e.on("mousemove",this._boundOnMapMouseMove),e.on("click",this._boundOnMapClick),e.viewer.container&&e.viewer.container.addEventListener("mousedown",this._boundOnMapMouseDown,!0),this.options.removeVertexOn==="contextmenu"&&e.on("contextmenu",this._boundOnMapClick)),this.target.on("dragging",this._boundOnFeatureDragging),this.target.on("dragend",this._boundOnFeatureDragEnd)}removeHooks(){const e=this._getMap();e&&(e.off("mousemove",this._boundOnMapMouseMove),e.off("click",this._boundOnMapClick),e.viewer.container&&e.viewer.container.removeEventListener("mousedown",this._boundOnMapMouseDown,!0),this.options.removeVertexOn==="contextmenu"&&e.off("contextmenu",this._boundOnMapClick)),this.target.off("dragging",this._boundOnFeatureDragging),this.target.off("dragend",this._boundOnFeatureDragEnd)}isEditing(){return this._editing}_createShadow(){this._shadow=null}_removeShadow(){this._shadow&&(this._shadow=null),this._shadowSnapshot=null}_updateCoordFromShadow(e=!1){e&&!this._updating&&this.target._onPositionChanged(!0)}_saveSnapshot(){const e=this.target._geometry;this._shadowSnapshot={type:e.type,coordinates:JSON.parse(JSON.stringify(e.coordinates))},this._addHistory(e.coordinates)}_addHistory(e){this._historyIndex<this._history.length-1&&(this._history=this._history.slice(0,this._historyIndex+1)),this._history.push({coordinates:JSON.parse(JSON.stringify(e)),timestamp:Date.now()}),this._history.length>this.options.maxHistorySize?this._history.shift():this._historyIndex++}undo(){if(this._historyIndex>0){this._historyIndex--;const e=this._history[this._historyIndex];this._restoreCoordinates(e.coordinates),this.target.trigger("editundo")}return this}redo(){if(this._historyIndex<this._history.length-1){this._historyIndex++;const e=this._history[this._historyIndex];this._restoreCoordinates(e.coordinates),this.target.trigger("editredo")}return this}_restoreCoordinates(e){const t=this.target._geometry;t.coordinates=JSON.parse(JSON.stringify(e)),this.target._onPositionChanged(!0),this._updateHandlePositions()}cancel(){return this._shadowSnapshot&&this._restoreCoordinates(this._shadowSnapshot.coordinates),this.disable(),this}_createHandles(){const e=this.target._geometry,t=this._getMap();if(!t){console.warn("[FeatureEditHandler] No map found, cannot create handles");return}this.target instanceof ni?this._createPointHandles(e,t):this.target instanceof Lt?this._createLineStringHandles(e,t):this.target instanceof wi&&this._createPolygonHandles(e,t)}_createPointHandles(e,t){const i=e.coordinates,n=t.geo2world(new p.Vector3(i[0],i[1],i[2]||0)),s=new Vr({position:n,index:0,symbol:0,size:this.options.handleSize,color:this.options.handleColor},t);s.on("dragstart",a=>{this._onHandleDragStart(a,0)}),s.on("dragging",a=>{this._onHandleDragging(a,0)}),s.on("dragend",a=>{this._onHandleDragEnd(a,0)}),this._handles.push(s)}_createLineStringHandles(e,t){const i=e.coordinates;i.forEach((n,s)=>{const a=t.geo2world(new p.Vector3(n[0],n[1],n[2]||0)),c=new Vr({position:a,index:s,symbol:0,size:this.options.handleSize,color:this.options.handleColor},t);c.on("dragstart",h=>{this._onHandleDragStart(h,s)}),c.on("dragging",h=>{this._onHandleDragging(h,s)}),c.on("dragend",h=>{this._onHandleDragEnd(h,s)}),this._handles.push(c)}),this.options.showMiddleHandles&&this._createLineStringMiddleHandles(i,t)}_onHandleDragging(e,t){this._updating=!0;const n=e.target.getPosition();if(!this._getMap())return;const a=this._fixHandlePointCoordinates(n,t),c=this.target._geometry;this.target instanceof ni?c.coordinates=[a.x,a.y,a.z]:this.target instanceof Lt&&(c.coordinates[t]=[a.x,a.y,a.z]),this.target._onPositionChanged(!0),this.target.trigger("handledragging",{index:t,coordinate:[a.x,a.y,a.z]}),this.target.trigger("editing",{index:t,coordinate:[a.x,a.y,a.z]}),this._updating=!1}_onHandleDragStart(e,t){this._updating=!0,this.target.trigger("handledragstart",{index:t,coordinate:e.coordinate})}_onHandleDragEnd(e,t){this._updating=!1;const i=this.target._geometry;this._addHistory(i.coordinates),this.target.trigger("handledragend",{index:t,coordinate:this.target instanceof ni?i.coordinates:i.coordinates[t]}),this.target.trigger("editvertex",{index:t,coordinate:this.target instanceof ni?i.coordinates:i.coordinates[t]})}_createPolygonHandles(e,t){const i=e.coordinates;if(!i||!Array.isArray(i)||i.length===0){console.warn("[FeatureEditHandler] Invalid polygon coordinates");return}i.forEach((s,a)=>{if(!s||s.length<3)return;const c=s[0][0]===s[s.length-1][0]&&s[0][1]===s[s.length-1][1]?s.length-1:s.length;for(let h=0;h<c;h++){const d=s[h],m=t.geo2world(new p.Vector3(d[0],d[1],d[2]||0)),f=new Vr({position:m,index:h,symbol:0,size:this.options.handleSize,color:this.options.handleColor},t);f._ringIndex=a,f.on("dragstart",g=>{this._onPolygonHandleDragStart(g,h,a)}),f.on("dragging",g=>{this._onPolygonHandleDragging(g,h,a)}),f.on("dragend",g=>{this._onPolygonHandleDragEnd(g,h,a)}),this._handles.push(f)}this.options.showMiddleHandles&&this._createPolygonMiddleHandles(s,a,t)})}_onPolygonHandleDragStart(e,t,i){this._updating=!0,this.target.trigger("handledragstart",{index:t,ringIndex:i,coordinate:e.coordinate})}_onPolygonHandleDragging(e,t,i){const s=e.target.getPosition();if(!this._getMap())return;const c=this._fixHandlePointCoordinates(s,t,i),d=this.target._geometry.coordinates;if(d[i]&&d[i][t]&&(d[i][t]=[c.x,c.y,c.z],t===0&&d[i].length>1)){const m=d[i].length-1;d[i][m]=[c.x,c.y,c.z]}this.target._onPositionChanged(!0),this.target.trigger("handledragging",{index:t,ringIndex:i,coordinate:[c.x,c.y,c.z]}),this.target.trigger("editing",{index:t,ringIndex:i,coordinate:[c.x,c.y,c.z]})}_onPolygonHandleDragEnd(e,t,i){this._updating=!1;const n=this.target._geometry,s=n.coordinates;this._addHistory(n.coordinates),this.target.trigger("handledragend",{index:t,ringIndex:i,coordinate:s[i]?.[t]||null}),this.target.trigger("editvertex",{index:t,ringIndex:i,coordinate:s[i]?.[t]||null})}_updateHandlePositions(){const e=this.target._geometry,t=this._getMap();if(t){if(this.target instanceof ni){const i=e.coordinates,n=t.geo2world(new p.Vector3(i[0],i[1],i[2]||0));this._handles[0]&&this._handles[0].updatePosition(n)}else if(this.target instanceof Lt)e.coordinates.forEach((n,s)=>{const a=t.geo2world(new p.Vector3(n[0],n[1],n[2]||0));this._handles[s]&&this._handles[s].updatePosition(a)});else if(this.target instanceof wi){const i=e.coordinates;let n=0;i.forEach(s=>{const a=s[0][0]===s[s.length-1][0]&&s[0][1]===s[s.length-1][1]?s.length-1:s.length;for(let c=0;c<a;c++){const h=s[c],d=t.geo2world(new p.Vector3(h[0],h[1],h[2]||0));this._handles[n]&&this._handles[n].updatePosition(d),n++}})}}}_clearHandles(){this._handles.forEach(e=>e.remove()),this._handles=[],this._middleHandles.forEach(e=>e.remove()),this._middleHandles=[]}_onFeatureDragging(e){this._updateHandlePositions(),this.options.showMiddleHandles&&this._updateMiddleHandlePositions()}_onFeatureDragEnd(e){const t=this.target._geometry;this._addHistory(t.coordinates),this._updateHandlePositions(),this.options.showMiddleHandles&&this._updateMiddleHandlePositions()}_updateMiddleHandlePositions(){const e=this.target._geometry,t=this._getMap();if(!t)return;let i=0;if(this.target instanceof Lt){const n=e.coordinates;for(let s=0;s<n.length-1&&!(i>=this._middleHandles.length);s++){const a=n[s],c=n[s+1],h=[(a[0]+c[0])/2,(a[1]+c[1])/2,((a[2]||0)+(c[2]||0))/2],d=t.geo2world(new p.Vector3(h[0],h[1],h[2]));this._middleHandles[i].updatePosition(d),i++}}else this.target instanceof wi&&e.coordinates.forEach(s=>{const a=s[0][0]===s[s.length-1][0]&&s[0][1]===s[s.length-1][1]?s.length-1:s.length;for(let c=0;c<a&&!(i>=this._middleHandles.length);c++){const h=(c+1)%a,d=s[c],m=s[h],f=[(d[0]+m[0])/2,(d[1]+m[1])/2,((d[2]||0)+(m[2]||0))/2],g=t.geo2world(new p.Vector3(f[0],f[1],f[2]));this._middleHandles[i].updatePosition(g),i++}})}_onMapMouseDown(e){const t=this._getMap();if(!t)return;const i=new p.Raycaster;i.params.Points={threshold:.5};const n=e,s=t.viewer.renderer.domElement,a=s.getBoundingClientRect(),c=new p.Vector2((n.clientX-a.left)/a.width*2-1,-((n.clientY-a.top)/a.height)*2+1);i.setFromCamera(c,t.viewer.camera);const h=[...this._handles,...this._middleHandles];for(const d of h)if(d.intersect(i)){const m=sa({currentTarget:s,clientX:n.clientX,clientY:n.clientY},t.tilemap,t.viewer.camera);m&&(d.startDrag([m.x,m.y]),n.stopPropagation&&n.stopPropagation(),n.stopImmediatePropagation&&n.stopImmediatePropagation(),n.preventDefault&&n.preventDefault());return}}_onMapMouseMove(e){}_onMapClick(e){if(!(e.type===this.options.removeVertexOn))return;const i=this._getMap();if(!i)return;const n=new p.Raycaster;n.params.Points={threshold:.5};const s=e.originEvent;if(!s)return;const a=new p.Vector2(s.offsetX/i.viewer.renderer.domElement.clientWidth*2-1,-(s.offsetY/i.viewer.renderer.domElement.clientHeight)*2+1);n.setFromCamera(a,i.viewer.camera);for(let c=0;c<this._handles.length;c++)if(this._handles[c].intersect(n)){this._removeVertex(c),s.stopPropagation&&s.stopPropagation(),s.preventDefault&&s.preventDefault();return}}_setFeatureEditingStyle(e){const t=this.target._threeGeometry;t&&t.traverse(i=>{i.material&&(e?Array.isArray(i.material)?i.material.forEach(n=>{n.userData._originalOpacity||(n.userData._originalOpacity=n.opacity),n.opacity=Math.min(n.opacity*.6,.6),n.transparent=!0}):(i.material.userData._originalOpacity||(i.material.userData._originalOpacity=i.material.opacity),i.material.opacity=Math.min(i.material.opacity*.6,.6),i.material.transparent=!0):Array.isArray(i.material)?i.material.forEach(n=>{n.userData._originalOpacity!==void 0&&(n.opacity=n.userData._originalOpacity,delete n.userData._originalOpacity)}):i.material.userData._originalOpacity!==void 0&&(i.material.opacity=i.material.userData._originalOpacity,delete i.material.userData._originalOpacity))})}_removeVertex(e){const t=this.target._geometry,i=this._handles[e],n=i.getIndex(),s=i._ringIndex||0;let a=null;if(this.target instanceof Lt){const c=t.coordinates;if(c.length<=2){console.warn("[FeatureEditHandler] LineString requires at least 2 vertices");return}a=c[n],c.splice(n,1)}else if(this.target instanceof wi){const h=t.coordinates[s];if(!h)return;const d=h.length>1&&h[0][0]===h[h.length-1][0]&&h[0][1]===h[h.length-1][1],m=d?4:3;if(h.length<=m){console.warn("[FeatureEditHandler] Polygon ring requires at least 3 vertices");return}a=h[n],h.splice(n,1),d&&n===0&&h.length>0&&(h[h.length-1]=[...h[0]])}else return;this.target._onPositionChanged(!0),i.remove(),this._handles.splice(e,1),this._updateHandleIndices(),this._addHistory(t.coordinates),this.target.trigger("handleremove",{index:n,ringIndex:s,coordinate:a})}_createLineStringMiddleHandles(e,t){for(let i=0;i<e.length-1;i++){const n=e[i],s=e[i+1],a=[(n[0]+s[0])/2,(n[1]+s[1])/2,((n[2]||0)+(s[2]||0))/2],c=t.geo2world(new p.Vector3(a[0],a[1],a[2])),h=new Vr({position:c,index:i,symbol:1,size:this.options.handleSize,color:this._middleHandleColor,opacity:.6},t);h.on("dragstart",d=>{this._onMiddleHandleClick(i,"LineString",0)}),this._middleHandles.push(h)}}_createPolygonMiddleHandles(e,t,i){const n=e[0][0]===e[e.length-1][0]&&e[0][1]===e[e.length-1][1]?e.length-1:e.length;for(let s=0;s<n;s++){const a=(s+1)%n,c=e[s],h=e[a],d=[(c[0]+h[0])/2,(c[1]+h[1])/2,((c[2]||0)+(h[2]||0))/2],m=i.geo2world(new p.Vector3(d[0],d[1],d[2])),f=new Vr({position:m,index:s,symbol:1,size:this.options.handleSize,color:this._middleHandleColor,opacity:.6},i);f._ringIndex=t,f.on("dragstart",g=>{this._onMiddleHandleClick(s,"Polygon",t)}),this._middleHandles.push(f)}}_onMiddleHandleClick(e,t,i){const n=this.target._geometry;if(this._getMap()){if(t==="LineString"){const a=n.coordinates,c=a[e],h=a[e+1],d=[(c[0]+h[0])/2,(c[1]+h[1])/2,((c[2]||0)+(h[2]||0))/2];a.splice(e+1,0,d)}else if(t==="Polygon"){const c=n.coordinates[i];if(!c)return;const h=c[0][0]===c[c.length-1][0]&&c[0][1]===c[c.length-1][1]?c.length-1:c.length,d=(e+1)%h,m=c[e],f=c[d],g=[(m[0]+f[0])/2,(m[1]+f[1])/2,((m[2]||0)+(f[2]||0))/2];c.splice(e+1,0,g),c.length>1&&c[0][0]===c[c.length-1][0]&&c[0][1]===c[c.length-1][1]&&e===h-1&&(c[c.length-1]=[...c[0]])}this.target._onPositionChanged(!0),this._clearHandles(),this._createHandles(),this._addHistory(n.coordinates),this.target.trigger("vertexinsert",{index:e+1,ringIndex:i})}}_updateHandleIndices(){if(this.target instanceof Lt)this._handles.forEach((e,t)=>{e._index=t});else if(this.target instanceof wi){let e=0;this.target._geometry.coordinates.forEach((n,s)=>{const a=n[0][0]===n[n.length-1][0]&&n[0][1]===n[n.length-1][1]?n.length-1:n.length;for(let c=0;c<a;c++)this._handles[e]&&(this._handles[e]._index=c,this._handles[e]._ringIndex=s),e++})}}_fixHandlePointCoordinates(e,t,i=0){const n=this._getMap();if(!n)return e;const s=this.target._geometry;let a=null;if(this.target instanceof ni)a=s.coordinates;else if(this.target instanceof Lt)a=s.coordinates[t];else if(this.target instanceof wi){const h=s.coordinates;h[i]&&h[i][t]&&(a=h[i][t])}if(!a||!a[2]||a[2]===0)return n.world2geo(e);const c=n.world2geo(e);return c.z=a[2],c}_getMap(){return this.target.getMap()}remove(){this.disable(),this._history=[],this._historyIndex=-1,this._shadow=null,this._shadowSnapshot=null,this._boundOnMapMouseMove=null,this._boundOnMapClick=null,this._boundOnMapMouseDown=null}}dt.prototype.startEdit=function(r){return this.options?.editable?(this._editor&&this.endEdit(),this._editor=new vy(this,r),this._editor.enable(),this):(console.warn("Feature is not editable. Set editable option to true."),this)},dt.prototype.endEdit=function(){return this._editor&&(this._editor.disable(),this._editor.remove(),delete this._editor),this},dt.prototype.isEditing=function(){return this._editor?this._editor.isEditing():!1},dt.prototype.cancelEdit=function(){return this._editor&&this._editor.cancel(),this},dt.prototype.undoEdit=function(){return this._editor&&this._editor.undo(),this},dt.prototype.redoEdit=function(){return this._editor&&this._editor.redo(),this};function bs(r,e){if(!r||r===!0)return!0;if(!Array.isArray(r))return!!r;switch(r[0]){case"all":return r.slice(1).every(i=>bs(i,e));case"any":return r.slice(1).some(i=>bs(i,e));case"!":return!bs(r[1],e);case"==":{const i=ze(r[1],e),n=ze(r[2],e);return xs(i)==xs(n)}case"!=":{const i=ze(r[1],e),n=ze(r[2],e);return xs(i)!=xs(n)}case">":{const i=ze(r[1],e),n=ze(r[2],e);return Hi(i)>Hi(n)}case"<":{const i=ze(r[1],e),n=ze(r[2],e);return Hi(i)<Hi(n)}case">=":{const i=ze(r[1],e),n=ze(r[2],e);return Hi(i)>=Hi(n)}case"<=":{const i=ze(r[1],e),n=ze(r[2],e);return Hi(i)<=Hi(n)}case"in":{const i=ze(r[1],e);return r.slice(2).map(s=>ze(s,e)).includes(i)}case"!in":{const i=ze(r[1],e);return!r.slice(2).map(s=>ze(s,e)).includes(i)}case"has":{const i=r[1];return e!=null&&Object.prototype.hasOwnProperty.call(e,i)}case"!has":{const i=r[1];return!(e!=null&&Object.prototype.hasOwnProperty.call(e,i))}case"like":case"contains":{const i=ze(r[1],e),n=ze(r[2],e);return String(i).toLowerCase().includes(String(n).toLowerCase())}case"starts-with":{const i=ze(r[1],e),n=ze(r[2],e);return String(i).toLowerCase().startsWith(String(n).toLowerCase())}case"ends-with":{const i=ze(r[1],e),n=ze(r[2],e);return String(i).toLowerCase().endsWith(String(n).toLowerCase())}default:return!0}}function ze(r,e){if(Array.isArray(r))switch(r[0]){case"get":return e?e[r[1]]:void 0;default:return r}return r}function xs(r){if(r==null)return null;if(typeof r=="string"){const e=Number(r);if(!isNaN(e)&&r.trim()!=="")return e}return typeof r=="boolean"?r?1:0:r}function Hi(r){if(r==null)return 0;if(typeof r=="number")return r;if(typeof r=="boolean")return r?1:0;if(typeof r=="string"){const e=Number(r);return isNaN(e)?0:e}return Number(r)}var wy=Object.defineProperty,by=(r,e,t)=>e in r?wy(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,It=(r,e,t)=>by(r,typeof e!="symbol"?e+"":e,t);class Ms extends ji{constructor(e,t){super(e,t),It(this,"TILE_SIZE"),It(this,"EXTENT"),It(this,"style"),It(this,"interactive",!1),It(this,"_tileFeatureMap",new Map),It(this,"_activeFeatureFilter"),It(this,"_layerStyleMapCache",null),It(this,"_lastBuiltStyleMap",null),It(this,"_addedFeatureIds",new Set),It(this,"_styleInstanceCache",new Map),It(this,"_totalProcessTime",0),It(this,"_processCount",0),It(this,"_totalFeatureCount",0),this.TILE_SIZE=t.tileSize??256,this.EXTENT=t.extent??4096,this.style=t.style||[],this._onMapUpdate=this._onMapUpdate.bind(this)}getProcessStats(){return{totalTime:this._totalProcessTime,processCount:this._processCount,totalFeatures:this._totalFeatureCount,avgTime:this._processCount>0?this._totalProcessTime/this._processCount:0}}resetProcessStats(){this._totalProcessTime=0,this._processCount=0,this._totalFeatureCount=0}processTileData(e,t){const i=this.getMap(),n=`${e.z}-${e.x}-${e.y}`,s=performance.now(),a=this._tileFeatureMap.get(n);if(a&&a.length>0){for(let w=0;w<a.length;w++){const b=a[w];b.visible=!0,this._addedFeatureIds.has(b.uuid)||(b.addTo(this),this._addedFeatureIds.add(b.uuid))}return}const c=t.vectorData;if(!c||!c.layers||!i||this.style.length===0)return;const h=[],d=this.style,m=this._activeFeatureFilter;let f=this._layerStyleMapCache;(!f||f!==this._lastBuiltStyleMap)&&(f=this._buildLayerStyleMap(d),this._layerStyleMapCache=f,this._lastBuiltStyleMap=f);let g=0;Object.keys(c.layers).forEach(w=>{const b=c.layers[w],x=f.get(w)||d;for(let L=0;L<b.length;L++){g++;const M=b[L],C=M.geometry,W=M.properties;if(m&&!m(W))continue;let D=null;for(let z=0;z<x.length;z++){const X=x[z];if(this._evaluateFilter(X.filter,W,w,M.geometry.type)){D=X.style;break}}if(D){const z={isVectorTile:!0,tileZ:e.z,tileX:e.x,tileY:e.y,rawCoordinates:C,extent:this.EXTENT,tileSize:this.TILE_SIZE},X=this._createFeatureInstance(M.geometry,M.geometry.type,D,{layerName:w,...M.properties});if(X){X.userData.tileData=z;const I=JSON.stringify(D);let U=this._styleInstanceCache.get(I);U||(U=St.create(D),this._styleInstanceCache.set(I,U)),X.style=U,X.addTo(this),this._addedFeatureIds.add(X.uuid),X.initializeGeometry(),h.push(X)}}}}),this._tileFeatureMap.set(n,h);const _=performance.now()-s;this._totalProcessTime+=_,this._processCount++,this._totalFeatureCount+=h.length,this.interactive&&console.log(`[processTileData] ${n} 处理 (${g} -> ${h.length} features) 耗时: ${_.toFixed(2)}ms | 累计: ${this._totalProcessTime.toFixed(2)}ms (${this._processCount}次, ${this._totalFeatureCount}个feature)`)}_evaluateFilter(e,t,i,n){if(!e||e===!0)return!0;const s={...t,$layer:i,$type:n};return bs(e,s)}_buildLayerStyleMap(e){const t=new Map;for(let i=0;i<e.length;i++){const n=e[i],s=n.filter;if(s&&typeof s=="object"&&s.$layer){const a=Array.isArray(s.$layer)?s.$layer[0]:s.$layer;t.has(a)||t.set(a,[]),t.get(a).push(n)}}return t}hideFeaturesByTileKey(e){const t=this._tileFeatureMap.get(e);t&&t.forEach(i=>{i.visible=!1})}removeFeaturesByTileKey(e){this._removeFeaturesByTileKey(e)}_removeFeaturesByTileKey(e){const t=this._tileFeatureMap.get(e);if(t){for(let i=0;i<t.length;i++){const n=t[i];this._addedFeatureIds.delete(n.uuid),n._remove()}this._tileFeatureMap.delete(e)}}_createFeatureInstance(e,t,i,n){const a={geometry:{ismvt:!0,...e},style:i,userData:n};switch(t){case"Point":return new Ti(a);case"LineString":return new Lt(a);default:return null}}setFeatureFilter(e){this._activeFeatureFilter=e}clearFeatureFilter(){this._activeFeatureFilter=void 0}setOpacity(e){this.opacity=e,this._tileFeatureMap.forEach(t=>{t.forEach(i=>{i.material&&(i.material.opacity=e,i.material.transparent=e<1)})})}_onMapUpdate(){}updateStyle(e,t){if(!e||!Array.isArray(e)){console.warn("[VectorTileRenderLayer] updateStyle called with invalid style rules.");return}this._layerStyleMapCache=null,this._lastBuiltStyleMap=null,this.style=e,this._tileFeatureMap.forEach((i,n)=>{const s=t.get(n);if(!s||!s.data||!s.data.vectorData)return;const a=s.data.vectorData;i.forEach(c=>{const h=c.userData,d=c.userData.tileData?.rawCoordinates?.type;let m="";if(a&&a.layers){for(const[g,_]of Object.entries(a.layers))if(_.some(b=>b.properties===h||JSON.stringify(b.properties)===JSON.stringify(h))){m=g;break}}if(this._activeFeatureFilter&&!this._activeFeatureFilter(h)){c.visible=!1;return}let f=null;for(const g of e)if(this._evaluateFilter(g.filter,h,m,d)){f=g.style;break}f?(this._applyStyleToFeature(c,f),c.visible=!0):c.visible=!1})})}_applyStyleToFeature(e,t){e.style=St.create(t),e.initializeGeometry()}validateFeature(e){return e instanceof dt}dispose(){this._tileFeatureMap.forEach((e,t)=>{this._removeFeaturesByTileKey(t)})}}var xy=Object.defineProperty,My=(r,e,t)=>e in r?xy(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Pt=(r,e,t)=>My(r,typeof e!="symbol"?e+"":e,t);class hh extends Pr{constructor(e,t){super(e,t),this.layerId=e,Pt(this,"isTileLayer",!0),Pt(this,"layerType","base"),Pt(this,"isBaseLayer",!1),Pt(this,"_enabled",!0),Pt(this,"_visible",!0),Pt(this,"_rootTile"),Pt(this,"_loader"),Pt(this,"_LODThreshold",1),Pt(this,"isSceneLayer",!1),Pt(this,"opacity",1),Pt(this,"source"),Pt(this,"projection"),Pt(this,"minLevel",2),Pt(this,"maxLevel",19),this.source=t.source,this.projection=t.projection,this.minLevel=t.minLevel??2,this.maxLevel=t.maxLevel??19,this._LODThreshold=t.LODThreshold??1,this.opacity=t.opacity??1,this.name=`Layer-${e}`,this._loader=this.createLoader(),this._rootTile=new Ri,this._rootTile.matrixAutoUpdate=!0,this._rootTile.scale.set(this.projection.mapWidth,this.projection.mapHeight,1),this.add(this._rootTile),this._rootTile.updateMatrix(),this.layerId=e,this.name==="Layer-label-layer"&&this.position.set(0,0,1)}get LODThreshold(){return this._LODThreshold}set LODThreshold(e){this._LODThreshold=e}get loader(){return this._loader}get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._rootTile&&(this._rootTile.visible=e&&this._visible)}get ivisible(){return this._visible&&super._visible}set ivisible(e){this._visible=e,this._rootTile&&(this._rootTile.visible=e&&this._enabled)}update(e){if(!(!this._enabled||!this._visible)){try{this._rootTile.update({camera:e,loader:this._loader,minLevel:this.minLevel,maxLevel:this.maxLevel,LODThreshold:this.LODThreshold})}catch{}console.groupEnd()}}_debugTileTree(){this._rootTile.traverse(e=>{e.isTile&&(e.loaded,e.visible,e.inFrustum,e.loaded)})}_getLODThreshold(){return 1}_getCurrentTileLevel(){let e=0;return this._rootTile.traverse(t=>{t.isTile&&t.loaded&&(e=Math.max(e,t.z))}),`最大层级: ${e}`}dispose(){this.remove(this._rootTile),this._rootTile.reload(this._loader)}reload(){this._rootTile.reload(this._loader)}setElevation(e){this.position.y=e,this.updateMatrix(),this.updateMatrixWorld(!0)}raiseElevation(e){this.position.z+=e,this.updateMatrix(),this.updateMatrixWorld(!0)}getElevation(){return this.position.y}}var Sy=Object.defineProperty,Ly=(r,e,t)=>e in r?Sy(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Py=(r,e,t)=>Ly(r,e+"",t);class uh extends p.LoadingManager{constructor(){super(...arguments),Py(this,"onParseEnd")}parseEnd(e){this.onParseEnd&&this.onParseEnd(e)}}const De={manager:new uh,demLoaderMap:new Map,meshLoaderMap:new Map,imgLoaderMap:new Map,registerMaterialLoader(r){De.imgLoaderMap.set(r.dataType,r),r.info.author=r.info.author??xo.name},registerGeometryLoader(r){De.demLoaderMap.set(r.dataType,r),r.info.author=r.info.author??xo.name},registerMeshLoader(r){De.meshLoaderMap.set(r.dataType,r),r.info.author=r.info.author??xo.name},getMaterialLoader(r){const e=De.imgLoaderMap.get(r.dataType);if(e)return e;throw`Source dataType "${r.dataType}" is not support!`},getGeometryLoader(r){const e=De.demLoaderMap.get(r.dataType);if(e)return e;throw`Source dataType "${r.dataType}" is not support!`},getMeshLoader(r){const e=De.meshLoaderMap.get(r.dataType);if(e)return e;throw`Source dataType "${r.dataType}" is not support!`}};var Cy=Object.defineProperty,Ty=(r,e,t)=>e in r?Cy(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Gy=(r,e,t)=>Ty(r,e+"",t);class Wy{constructor(e){Gy(this,"worker"),this.worker=e()}async run(e,t){return new Promise(i=>{this.worker.onmessage=n=>{i(n.data)},this.worker.postMessage(e,t)})}terminate(){this.worker.terminate()}}const Zy=4096,dh=Math.PI;function oa(r,e){const t=Math.floor(r[0]*e),i=Math.floor(r[1]*e),n=Math.floor((r[2]-r[0])*e),s=Math.floor((r[3]-r[1])*e);return{sx:t,sy:i,sw:n,sh:s}}function aa(r,e,t,i){if(i<r.minLevel)return{url:void 0,clipBounds:[0,0,1,1]};if(i<=r.maxLevel)return{url:r._getUrl(e,t,i),clipBounds:[0,0,1,1]};const n=Vy(e,t,i,r.maxLevel),s=n.parentNO;return{url:r._getUrl(s.x,s.y,s.z),clipBounds:n.bounds}}function Vy(r,e,t,i){const n=t-i,s={x:r>>n,y:e>>n,z:t-n},a=Math.pow(2,n),c=Math.pow(.5,n),h=r%a/a-.5+c/2,d=e%a/a-.5+c/2,m=new p.Vector2(h,d),f=new p.Box2().setFromCenterAndSize(m,new p.Vector2(c,c)),g=[f.min.x+.5,f.min.y+.5,f.max.x+.5,f.max.y+.5];return{parentNO:s,bounds:g}}function la(r,e,t,i,n=Zy){const{x:s,y:a}=r,c=(e+s/n)/Math.pow(2,i),h=(t+a/n)/Math.pow(2,i),d=c*360-180,f=Math.atan(Math.sinh(dh*(1-2*h)))*180/dh;return[parseFloat(d.toFixed(8)),parseFloat(f.toFixed(8))]}function Iy(r,e,t,i){if(!r||!r.coordinates)throw new Error("无效的geometry数据格式");const n={type:r.type,coordinates:null};function s(a){if(typeof a=="object"&&a.x!==void 0&&a.y!==void 0)return la(a,e,t,i);if(Array.isArray(a)&&a.length>0){const c=a[0];return typeof c=="object"&&c.x!==void 0&&c.y!==void 0?a.map(h=>la(h,e,t,i)):a.map(h=>s(h))}return a}return n.coordinates=s(r.coordinates),n}var Ay=Object.defineProperty,Fy=(r,e,t)=>e in r?Ay(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Ss=(r,e,t)=>Fy(r,typeof e!="symbol"?e+"":e,t);class Ls{constructor(){Ss(this,"_imgSource",[]),Ss(this,"_demSource"),Ss(this,"_vtSource"),Ss(this,"manager",De.manager)}get imgSource(){return this._imgSource}set imgSource(e){this._imgSource=e}get demSource(){return this._demSource}set demSource(e){this._demSource=e}get vtSource(){return this._vtSource}set vtSource(e){this._vtSource=e}async load(e){const t=await this.loadGeometry(e),i=await this.loadMaterial(e);console.assert(!!i&&!!t);for(let n=0;n<i.length;n++)t.addGroup(0,1/0,n);return{materials:i,geometry:t}}unload(e){const t=e.material,i=e.geometry;for(let n=0;n<t.length;n++)t[n].dispose();i.dispose()}async loadGeometry(e){let t;if(this.demSource&&e.z>=this.demSource.minLevel&&this._isBoundsInSourceBounds(this.demSource,e.bounds)){const i=De.getGeometryLoader(this.demSource),n=this.demSource;t=await i.load({source:n,...e}).catch(s=>(console.error("Load material error",n.dataType,e.x,e.y,e.z),new p.PlaneGeometry)),t.addEventListener("dispose",()=>{i.unload&&i.unload(t)})}else if(this.vtSource&&e.z>=this.vtSource.minLevel&&this._isBoundsInSourceBounds(this.vtSource,e.bounds)){const i=De.getMeshLoader(this.vtSource),n=this.vtSource;t=await i.load({source:n,...e}).catch(s=>(console.error("Load geometry error",n.dataType,e.x,e.y,e.z),new p.PlaneGeometry)),t.addEventListener("dispose",()=>{i.unload&&i.unload(t)})}else t=new p.PlaneGeometry;return t}async loadMaterial(e){const i=this.imgSource.filter(n=>e.z>=n.minLevel&&this._isBoundsInSourceBounds(n,e.bounds)).map(async n=>{const s=De.getMaterialLoader(n),a=await s.load({source:n,...e}).catch(h=>(console.error("Load material error",n.dataType,e.x,e.y,e.z),new p.MeshBasicMaterial)),c=h=>{s.unload&&s.unload(h.target),h.target.removeEventListener("dispose",c)};return a instanceof p.MeshBasicMaterial||a.addEventListener("dispose",c),a});return Promise.all(i)}_isBoundsInSourceBounds(e,t){const i=e._projectionBounds;return!(t[2]<i[0]||t[3]<i[1]||t[0]>i[2]||t[1]>i[3])}}function Ir(...r){const e=r,t=e&&e.length>1&&e[0].constructor||null;if(!t)throw new Error("concatenateTypedArrays - incorrect quantity of arguments or arguments have incompatible data types");const i=e.reduce((a,c)=>a+c.length,0),n=new t(i);let s=0;for(const a of e)n.set(a,s),s+=a.length;return n}function fh(r,e,t,i){const n=i?zy(i,r.position.value):Oy(e),s=n.length,a=new Float32Array(s*6),c=new Float32Array(s*4),h=new e.constructor(s*6),d=new Float32Array(s*6);for(let f=0;f<s;f++)Dy({edge:n[f],edgeIndex:f,attributes:r,skirtHeight:t,newPosition:a,newTexcoord0:c,newTriangles:h,newNormals:d});r.position.value=Ir(r.position.value,a),r.texcoord.value=Ir(r.texcoord.value,c),r.normal.value=Ir(r.normal.value,d);const m=Ir(e,h);return{attributes:r,indices:m}}function Oy(r){const e=[],t=Array.isArray(r)?r:Array.from(r);for(let n=0;n<t.length;n+=3){const s=t[n],a=t[n+1],c=t[n+2];e.push([s,a],[a,c],[c,s])}e.sort(([n,s],[a,c])=>{const h=Math.min(n,s),d=Math.min(a,c);return h!==d?h-d:Math.max(n,s)-Math.max(a,c)});const i=[];for(let n=0;n<e.length;n++)n+1<e.length&&e[n][0]===e[n+1][1]&&e[n][1]===e[n+1][0]?n++:i.push(e[n]);return i}function zy(r,e){const t=(n,s)=>{n.sort(s)};t(r.westIndices,(n,s)=>e[3*n+1]-e[3*s+1]),t(r.eastIndices,(n,s)=>e[3*s+1]-e[3*n+1]),t(r.southIndices,(n,s)=>e[3*s]-e[3*n]),t(r.northIndices,(n,s)=>e[3*n]-e[3*s]);const i=[];return Object.values(r).forEach(n=>{if(n.length>1)for(let s=0;s<n.length-1;s++)i.push([n[s],n[s+1]])}),i}function Dy({edge:r,edgeIndex:e,attributes:t,skirtHeight:i,newPosition:n,newTexcoord0:s,newTriangles:a,newNormals:c}){const h=t.position.value.length,d=e*2,m=d+1;n.set(t.position.value.subarray(r[0]*3,r[0]*3+3),d*3),n[d*3+2]=n[d*3+2]-i,n.set(t.position.value.subarray(r[1]*3,r[1]*3+3),m*3),n[m*3+2]=n[m*3+2]-i,s.set(t.texcoord.value.subarray(r[0]*2,r[0]*2+2),d*2),s.set(t.texcoord.value.subarray(r[1]*2,r[1]*2+2),m*2);const f=e*2*3;a[f]=r[0],a[f+1]=h/3+m,a[f+2]=r[1],a[f+3]=h/3+m,a[f+4]=r[0],a[f+5]=h/3+d,c[f]=0,c[f+1]=0,c[f+2]=1,c[f+3]=0,c[f+4]=0,c[f+5]=1}function ph(r){if(r.length<4)throw new Error(`DEM数组长度必须大于4,当前长度: ${r.length}!`);const e=Math.floor(Math.sqrt(r.length)),t=e,i=e,n=ca(i,t);return{attributes:Xy(r,i,t),indices:n}}function Xy(r,e,t){const i=t*e,n=new Float32Array(i*3),s=new Float32Array(i*2);let a=0;for(let c=0;c<e;c++)for(let h=0;h<t;h++){const d=h/(t-1),m=c/(e-1);s[a*2]=d,s[a*2+1]=m,n[a*3]=d-.5,n[a*3+1]=m-.5,n[a*3+2]=r[(e-c-1)*t+h],a++}return{position:{value:n,size:3},texcoord:{value:s,size:2},normal:{value:ha(n,ca(e,t)),size:3}}}function ca(r,e){const t=6*(e-1)*(r-1),i=new Uint16Array(t);let n=0;for(let s=0;s<r-1;s++)for(let a=0;a<e-1;a++){const c=s*e+a,h=c+1,d=c+e,m=d+1,f=n*6;i[f]=c,i[f+1]=h,i[f+2]=d,i[f+3]=d,i[f+4]=h,i[f+5]=m,n++}return i}function ha(r,e){const t=new Float32Array(r.length);for(let i=0;i<e.length;i+=3){const n=e[i]*3,s=e[i+1]*3,a=e[i+2]*3,c=r[n],h=r[n+1],d=r[n+2],m=r[s],f=r[s+1],g=r[s+2],_=r[a],w=r[a+1],b=r[a+2],x=m-c,L=f-h,M=g-d,C=_-c,W=w-h,D=b-d,z=L*D-M*W,X=M*C-x*D,I=x*W-L*C,U=Math.sqrt(z*z+X*X+I*I),V=[0,0,1];if(U>0){const G=1/U;V[0]=z*G,V[1]=X*G,V[2]=I*G}for(let G=0;G<3;G++)t[n+G]=t[s+G]=t[a+G]=V[G]}return t}var ky=Object.defineProperty,Uy=(r,e,t)=>e in r?ky(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Ny=(r,e,t)=>Uy(r,e+"",t);class jn extends p.PlaneGeometry{constructor(){super(...arguments),Ny(this,"type","TileGeometry")}setData(e,t=1e3){let i=e instanceof Float32Array?ph(e):e;i=fh(i.attributes,i.indices,t);const{attributes:n,indices:s}=i;return this.setIndex(new p.BufferAttribute(s,1)),this.setAttribute("position",new p.BufferAttribute(n.position.value,n.position.size)),this.setAttribute("uv",new p.BufferAttribute(n.texcoord.value,n.texcoord.size)),this.setAttribute("normal",new p.BufferAttribute(n.normal.value,n.normal.size)),this.computeBoundingBox(),this.computeBoundingSphere(),this}}var Ky=Object.defineProperty,By=(r,e,t)=>e in r?Ky(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,$i=(r,e,t)=>By(r,typeof e!="symbol"?e+"":e,t);class mh{constructor(e=257){$i(this,"gridSize"),$i(this,"numTriangles"),$i(this,"numParentTriangles"),$i(this,"indices"),$i(this,"coords"),this.gridSize=e;const t=e-1;if(t&t-1)throw new Error(`Expected grid size to be 2^n+1, got ${e}.`);this.numTriangles=t*t*2-2,this.numParentTriangles=this.numTriangles-t*t,this.indices=new Uint32Array(this.gridSize*this.gridSize),this.coords=new Uint16Array(this.numTriangles*4);for(let i=0;i<this.numTriangles;i++){let n=i+2,s=0,a=0,c=0,h=0,d=0,m=0;for(n&1?c=h=d=t:s=a=m=t;(n>>=1)>1;){const g=s+c>>1,_=a+h>>1;n&1?(c=s,h=a,s=d,a=m):(s=c,a=h,c=d,h=m),d=g,m=_}const f=i*4;this.coords[f+0]=s,this.coords[f+1]=a,this.coords[f+2]=c,this.coords[f+3]=h}}createTile(e){return new Yy(e,this)}}class Yy{constructor(e,t){$i(this,"martini"),$i(this,"terrain"),$i(this,"errors");const i=t.gridSize;if(e.length!==i*i)throw new Error(`Expected terrain data of length ${i*i} (${i} x ${i}), got ${e.length}.`);this.terrain=e,this.martini=t,this.errors=new Float32Array(e.length),this.update()}update(){const{numTriangles:e,numParentTriangles:t,coords:i,gridSize:n}=this.martini,{terrain:s,errors:a}=this;for(let c=e-1;c>=0;c--){const h=c*4,d=i[h+0],m=i[h+1],f=i[h+2],g=i[h+3],_=d+f>>1,w=m+g>>1,b=_+w-m,x=w+d-_,L=(s[m*n+d]+s[g*n+f])/2,M=w*n+_,C=Math.abs(L-s[M]);if(a[M]=Math.max(a[M],C),c<t){const W=(m+x>>1)*n+(d+b>>1),D=(g+x>>1)*n+(f+b>>1);a[M]=Math.max(a[M],a[W],a[D])}}}getGeometryData(e=0){const{gridSize:t,indices:i}=this.martini,{errors:n}=this;let s=0,a=0;const c=t-1;let h,d,m=0;i.fill(0);function f(M,C,W,D,z,X){const I=M+W>>1,U=C+D>>1;Math.abs(M-z)+Math.abs(C-X)>1&&n[U*t+I]>e?(f(z,X,M,C,I,U),f(W,D,z,X,I,U)):(h=C*t+M,d=D*t+W,m=X*t+z,i[h]===0&&(i[h]=++s),i[d]===0&&(i[d]=++s),i[m]===0&&(i[m]=++s),a++)}f(0,0,c,c,c,0),f(c,c,0,0,0,c);const g=s*2,_=a*3,w=new Uint16Array(g),b=new Uint32Array(_);let x=0;function L(M,C,W,D,z,X){const I=M+W>>1,U=C+D>>1;if(Math.abs(M-z)+Math.abs(C-X)>1&&n[U*t+I]>e)L(z,X,M,C,I,U),L(W,D,z,X,I,U);else{const V=i[C*t+M]-1,G=i[D*t+W]-1,N=i[X*t+z]-1;w[2*V]=M,w[2*V+1]=C,w[2*G]=W,w[2*G+1]=D,w[2*N]=z,w[2*N+1]=X,b[x++]=V,b[x++]=G,b[x++]=N}}return L(0,0,c,c,c,0),L(c,c,0,0,0,c),{attributes:this._getMeshAttributes(this.terrain,w,b),indices:b}}_getMeshAttributes(e,t,i){const n=Math.floor(Math.sqrt(e.length)),s=n-1,a=t.length/2,c=new Float32Array(a*3),h=new Float32Array(a*2);for(let m=0;m<a;m++){const f=t[m*2],g=t[m*2+1],_=g*n+f;c[3*m+0]=f/s-.5,c[3*m+1]=.5-g/s,c[3*m+2]=e[_],h[2*m+0]=f/s,h[2*m+1]=1-g/s}const d=ha(c,i);return{position:{value:c,size:3},texcoord:{value:h,size:2},normal:{value:d,size:3}}}}var Ry=Object.defineProperty,jy=(r,e,t)=>e in r?Ry(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,gh=(r,e,t)=>jy(r,typeof e!="symbol"?e+"":e,t);class ua{constructor(){gh(this,"info",{version:"0.10.0",description:"Terrain loader base class"}),gh(this,"dataType","")}async load(e){const{source:t,x:i,y:n,z:s}=e,{url:a,clipBounds:c}=aa(t,i,n,s);if(!a)return new jn;const h=await this.doLoad(a,{source:t,x:i,y:n,z:s,bounds:c});return De.manager.parseEnd(a),h}}class da extends p.MeshStandardMaterial{constructor(e={}){super({transparent:!0,side:p.FrontSide,...e})}setTexture(e){this.map=e,this.needsUpdate=!0}dispose(){const e=this.map;e&&(e.image instanceof ImageBitmap&&e.image.close(),e.dispose())}}var rt=(r=>(r[r.Unknown=0]="Unknown",r[r.Point=1]="Point",r[r.Linestring=2]="Linestring",r[r.Polygon=3]="Polygon",r))(rt||{});class yh{render(e,t,i,n,s=1){switch(e.lineCap="round",e.lineJoin="round",(n.shadowBlur??0)>0&&(e.shadowBlur=n.shadowBlur??2,e.shadowColor=n.shadowColor??"black",e.shadowOffsetX=n.shadowOffset?n.shadowOffset[0]:0,e.shadowOffsetY=n.shadowOffset?n.shadowOffset[1]:0),t){case rt.Point:e.textAlign="center",e.textBaseline="middle",e.font=n.font??"14px Arial",e.fillStyle=n.fontColor??"white",this._renderPointText(e,i,s,n.textField??"name",n.fontOffset??[0,-8]);break;case rt.Linestring:this._renderLineString(e,i,s);break;case rt.Polygon:this._renderPolygon(e,i,s);break;default:console.warn(`Unknown feature type: ${t}`)}(n.fill||t===rt.Point)&&(e.globalAlpha=n.fillOpacity||.5,e.fillStyle=n.fillColor||n.color||"#3388ff",e.fill(n.fillRule||"evenodd")),(n.stroke??!0)&&(n.weight??1)>0&&(e.globalAlpha=n.opacity||1,e.lineWidth=n.weight||1,e.strokeStyle=n.color||"#3388ff",e.setLineDash(n.dashArray||[]),e.stroke())}_renderPointText(e,t,i=1,n="name",s=[0,0]){const a=t.geometry;e.beginPath();for(const h of a)for(let d=0;d<h.length;d++){const m=h[d];e.arc(m.x*i,m.y*i,2,0,2*Math.PI)}const c=t.properties;c&&c[n]&&e.fillText(c[n],a[0][0].x*i+s[0],a[0][0].y*i+s[1])}_renderLineString(e,t,i){const n=t.geometry;e.beginPath();for(const s of n)for(let a=0;a<s.length;a++){const{x:c,y:h}=s[a];a===0?e.moveTo(c*i,h*i):e.lineTo(c*i,h*i)}}_renderPolygon(e,t,i){const n=t.geometry;e.beginPath();for(let s=0;s<n.length;s++){const a=n[s];for(let c=0;c<a.length;c++){const{x:h,y:d}=a[c];c===0?e.moveTo(h*i,d*i):e.lineTo(h*i,d*i)}e.closePath()}}}var Jy=Object.defineProperty,Qy=(r,e,t)=>e in r?Jy(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,_h=(r,e,t)=>Qy(r,typeof e!="symbol"?e+"":e,t);class fa{constructor(){_h(this,"info",{version:"0.10.0",description:"Image loader base class"}),_h(this,"dataType","")}async load(e){const{source:t,x:i,y:n,z:s}=e,a=new da({}),{url:c,clipBounds:h}=aa(t,i,n,s);if(c){const d=await this.doLoad(c,{source:t,x:i,y:n,z:s,bounds:h});a.map=d,De.manager.parseEnd(c)}return a}}var Hy=Object.defineProperty,$y=(r,e,t)=>e in r?Hy(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,vh=(r,e,t)=>$y(r,typeof e!="symbol"?e+"":e,t);class Ey{constructor(){vh(this,"info",{version:"0.10.0",description:"Canvas tile abstract loader"}),vh(this,"dataType","")}async load(e){const t=this._creatCanvasContext(256,256);this.drawTile(t,e);const i=new p.CanvasTexture(t.canvas.transferToImageBitmap());return new da({transparent:!0,map:i,opacity:e.source.opacity})}_creatCanvasContext(e,t){const n=new OffscreenCanvas(e,t).getContext("2d");if(!n)throw new Error("create canvas context failed");return n.scale(1,-1),n.translate(0,-t),n}}var qy=Object.defineProperty,e_=(r,e,t)=>e in r?qy(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,pa=(r,e,t)=>e_(r,typeof e!="symbol"?e+"":e,t);class t_ extends fa{constructor(){super(...arguments),pa(this,"info",{version:"0.10.0",description:"Tile image loader. It can load xyz tile image."}),pa(this,"dataType","image"),pa(this,"loader",new p.ImageLoader(De.manager))}async doLoad(e,t){const i=await this.loader.loadAsync(e).catch(a=>new Image(1,1)),n=new p.Texture;n.colorSpace=p.SRGBColorSpace;const{bounds:s}=t;return s[2]-s[0]<1?n.image=i_(i,s):n.image=i,n.needsUpdate=!0,n}}function i_(r,e){const t=r.width,i=new OffscreenCanvas(t,t),n=i.getContext("2d"),{sx:s,sy:a,sw:c,sh:h}=oa(e,r.width);return n.drawImage(r,s,a,c,h,0,0,t,t),i}const n_=`{
|
|
1123
1123
|
"name": "@terra.gl/core",
|
|
1124
|
-
"version": "0.0.1-alpha.
|
|
1124
|
+
"version": "0.0.1-alpha.72",
|
|
1125
1125
|
"type": "module",
|
|
1126
1126
|
"files": [
|
|
1127
1127
|
"dist"
|
|
@@ -1187,7 +1187,7 @@ function print() { __p += __j.call(arguments, '') }
|
|
|
1187
1187
|
"vue": "^3.5.18"
|
|
1188
1188
|
}
|
|
1189
1189
|
}
|
|
1190
|
-
`;var r_=Object.defineProperty,s_=(r,e,t)=>e in r?r_(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,At=(r,e,t)=>s_(r,typeof e!="symbol"?e+"":e,t);class si{constructor(e){At(this,"dataType","image"),At(this,"attribution","isource"),At(this,"minLevel",0),At(this,"maxLevel",18),At(this,"projectionID","3857"),At(this,"url",""),At(this,"subdomains",[]),At(this,"s",""),At(this,"opacity",1),At(this,"isTMS",!1),At(this,"bounds",[-180,-85,180,85]),At(this,"_projectionBounds",[-1/0,-1/0,1/0,1/0]),At(this,"tileMaterial"),Object.assign(this,e)}getUrl(e,t,i){const n={...this,x:e,y:t,z:i};return o_(this.url,n)}_getUrl(e,t,i){const n=this.subdomains.length;if(n>0){const a=Math.floor(Math.random()*n);this.s=this.subdomains[a]}const s=this.isTMS?Math.pow(2,i)-1-t:t;return this.getUrl(e,s,i)}static create(e){return new si(e)}}function o_(r,e){const t=/\{ *([\w_-]+) *\}/g;return r.replace(t,(i,n)=>{const s=e[n]??(()=>{throw new Error(`source url template error, No value provided for variable: ${i}`)})();return typeof s=="function"?s(e):s})}const{version:a_,author:l_}=JSON.parse(n_);function c_(r,e=100){return new Promise(t=>{const i=setInterval(()=>{r&&(clearInterval(i),t())},e)})}function ma(r){return De.registerMaterialLoader(r),r}function ga(r){return De.registerGeometryLoader(r),r}function wh(r){return De.registerMeshLoader(r),r}ma(new t_);const bh="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIEsoayxkKXtjb25zdCB5PW5ldyBGbG9hdDMyQXJyYXkoay5sZW5ndGgpO2ZvcihsZXQgVj0wO1Y8ZC5sZW5ndGg7Vis9Myl7Y29uc3QgYT1kW1ZdKjMsZT1kW1YrMV0qMyxyPWRbVisyXSozLHM9a1thXSx0PWtbYSsxXSxuPWtbYSsyXSxoPWtbZV0saT1rW2UrMV0sbz1rW2UrMl0sYz1rW3JdLHU9a1tyKzFdLG09a1tyKzJdLHc9aC1zLGw9aS10LGY9by1uLGc9Yy1zLE09dS10LEQ9bS1uLHA9bCpELWYqTSxVPWYqZy13KkQsST13Kk0tbCpnLHo9TWF0aC5zcXJ0KHAqcCtVKlUrSSpJKSx4PVswLDAsMV07aWYoej4wKXtjb25zdCB2PTEvejt4WzBdPXAqdix4WzFdPVUqdix4WzJdPUkqdn1mb3IobGV0IHY9MDt2PDM7disrKXlbYSt2XT15W2Urdl09eVtyK3ZdPXhbdl19cmV0dXJuIHl9dmFyIFc9T2JqZWN0LmRlZmluZVByb3BlcnR5LFA9KGssZCx5KT0+ZCBpbiBrP1coayxkLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp5fSk6a1tkXT15LF89KGssZCx5KT0+UChrLHR5cGVvZiBkIT0ic3ltYm9sIj9kKyIiOmQseSk7Y2xhc3MgZWV7Y29uc3RydWN0b3IoZD0yNTcpe18odGhpcywiZ3JpZFNpemUiKSxfKHRoaXMsIm51bVRyaWFuZ2xlcyIpLF8odGhpcywibnVtUGFyZW50VHJpYW5nbGVzIiksXyh0aGlzLCJpbmRpY2VzIiksXyh0aGlzLCJjb29yZHMiKSx0aGlzLmdyaWRTaXplPWQ7Y29uc3QgeT1kLTE7aWYoeSZ5LTEpdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBncmlkIHNpemUgdG8gYmUgMl5uKzEsIGdvdCAke2R9LmApO3RoaXMubnVtVHJpYW5nbGVzPXkqeSoyLTIsdGhpcy5udW1QYXJlbnRUcmlhbmdsZXM9dGhpcy5udW1UcmlhbmdsZXMteSp5LHRoaXMuaW5kaWNlcz1uZXcgVWludDMyQXJyYXkodGhpcy5ncmlkU2l6ZSp0aGlzLmdyaWRTaXplKSx0aGlzLmNvb3Jkcz1uZXcgVWludDE2QXJyYXkodGhpcy5udW1UcmlhbmdsZXMqNCk7Zm9yKGxldCBWPTA7Vjx0aGlzLm51bVRyaWFuZ2xlcztWKyspe2xldCBhPVYrMixlPTAscj0wLHM9MCx0PTAsbj0wLGg9MDtmb3IoYSYxP3M9dD1uPXk6ZT1yPWg9eTsoYT4+PTEpPjE7KXtjb25zdCBvPWUrcz4+MSxjPXIrdD4+MTthJjE/KHM9ZSx0PXIsZT1uLHI9aCk6KGU9cyxyPXQscz1uLHQ9aCksbj1vLGg9Y31jb25zdCBpPVYqNDt0aGlzLmNvb3Jkc1tpKzBdPWUsdGhpcy5jb29yZHNbaSsxXT1yLHRoaXMuY29vcmRzW2krMl09cyx0aGlzLmNvb3Jkc1tpKzNdPXR9fWNyZWF0ZVRpbGUoZCl7cmV0dXJuIG5ldyByZShkLHRoaXMpfX1jbGFzcyByZXtjb25zdHJ1Y3RvcihkLHkpe18odGhpcywibWFydGluaSIpLF8odGhpcywidGVycmFpbiIpLF8odGhpcywiZXJyb3JzIik7Y29uc3QgVj15LmdyaWRTaXplO2lmKGQubGVuZ3RoIT09VipWKXRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdGVycmFpbiBkYXRhIG9mIGxlbmd0aCAke1YqVn0gKCR7Vn0geCAke1Z9KSwgZ290ICR7ZC5sZW5ndGh9LmApO3RoaXMudGVycmFpbj1kLHRoaXMubWFydGluaT15LHRoaXMuZXJyb3JzPW5ldyBGbG9hdDMyQXJyYXkoZC5sZW5ndGgpLHRoaXMudXBkYXRlKCl9dXBkYXRlKCl7Y29uc3R7bnVtVHJpYW5nbGVzOmQsbnVtUGFyZW50VHJpYW5nbGVzOnksY29vcmRzOlYsZ3JpZFNpemU6YX09dGhpcy5tYXJ0aW5pLHt0ZXJyYWluOmUsZXJyb3JzOnJ9PXRoaXM7Zm9yKGxldCBzPWQtMTtzPj0wO3MtLSl7Y29uc3QgdD1zKjQsbj1WW3QrMF0saD1WW3QrMV0saT1WW3QrMl0sbz1WW3QrM10sYz1uK2k+PjEsdT1oK28+PjEsbT1jK3UtaCx3PXUrbi1jLGw9KGVbaCphK25dK2VbbyphK2ldKS8yLGY9dSphK2MsZz1NYXRoLmFicyhsLWVbZl0pO2lmKHJbZl09TWF0aC5tYXgocltmXSxnKSxzPHkpe2NvbnN0IE09KGgrdz4+MSkqYSsobittPj4xKSxEPShvK3c+PjEpKmErKGkrbT4+MSk7cltmXT1NYXRoLm1heChyW2ZdLHJbTV0scltEXSl9fX1nZXRHZW9tZXRyeURhdGEoZD0wKXtjb25zdHtncmlkU2l6ZTp5LGluZGljZXM6Vn09dGhpcy5tYXJ0aW5pLHtlcnJvcnM6YX09dGhpcztsZXQgZT0wLHI9MDtjb25zdCBzPXktMTtsZXQgdCxuLGg9MDtWLmZpbGwoMCk7ZnVuY3Rpb24gaShmLGcsTSxELHAsVSl7Y29uc3QgST1mK00+PjEsej1nK0Q+PjE7TWF0aC5hYnMoZi1wKStNYXRoLmFicyhnLVUpPjEmJmFbeip5K0ldPmQ/KGkocCxVLGYsZyxJLHopLGkoTSxELHAsVSxJLHopKToodD1nKnkrZixuPUQqeStNLGg9VSp5K3AsVlt0XT09PTAmJihWW3RdPSsrZSksVltuXT09PTAmJihWW25dPSsrZSksVltoXT09PTAmJihWW2hdPSsrZSkscisrKX1pKDAsMCxzLHMscywwKSxpKHMscywwLDAsMCxzKTtjb25zdCBvPWUqMixjPXIqMyx1PW5ldyBVaW50MTZBcnJheShvKSxtPW5ldyBVaW50MzJBcnJheShjKTtsZXQgdz0wO2Z1bmN0aW9uIGwoZixnLE0sRCxwLFUpe2NvbnN0IEk9ZitNPj4xLHo9ZytEPj4xO2lmKE1hdGguYWJzKGYtcCkrTWF0aC5hYnMoZy1VKT4xJiZhW3oqeStJXT5kKWwocCxVLGYsZyxJLHopLGwoTSxELHAsVSxJLHopO2Vsc2V7Y29uc3QgeD1WW2cqeStmXS0xLHY9VltEKnkrTV0tMSxBPVZbVSp5K3BdLTE7dVsyKnhdPWYsdVsyKngrMV09Zyx1WzIqdl09TSx1WzIqdisxXT1ELHVbMipBXT1wLHVbMipBKzFdPVUsbVt3KytdPXgsbVt3KytdPXYsbVt3KytdPUF9fXJldHVybiBsKDAsMCxzLHMscywwKSxsKHMscywwLDAsMCxzKSx7YXR0cmlidXRlczp0aGlzLl9nZXRNZXNoQXR0cmlidXRlcyh0aGlzLnRlcnJhaW4sdSxtKSxpbmRpY2VzOm19fV9nZXRNZXNoQXR0cmlidXRlcyhkLHksVil7Y29uc3QgYT1NYXRoLmZsb29yKE1hdGguc3FydChkLmxlbmd0aCkpLGU9YS0xLHI9eS5sZW5ndGgvMixzPW5ldyBGbG9hdDMyQXJyYXkociozKSx0PW5ldyBGbG9hdDMyQXJyYXkocioyKTtmb3IobGV0IGg9MDtoPHI7aCsrKXtjb25zdCBpPXlbaCoyXSxvPXlbaCoyKzFdLGM9byphK2k7c1szKmgrMF09aS9lLS41LHNbMypoKzFdPS41LW8vZSxzWzMqaCsyXT1kW2NdLHRbMipoKzBdPWkvZSx0WzIqaCsxXT0xLW8vZX1jb25zdCBuPUsocyxWKTtyZXR1cm57cG9zaXRpb246e3ZhbHVlOnMsc2l6ZTozfSx0ZXhjb29yZDp7dmFsdWU6dCxzaXplOjJ9LG5vcm1hbDp7dmFsdWU6bixzaXplOjN9fX19Y29uc3QgbmU9ZnVuY3Rpb24oKXt2YXIgaz17fTtrLmRlZmF1bHROb0RhdGFWYWx1ZT0tMzQwMjc5OTkzODc5MDE0ODRlMjIsay5kZWNvZGU9ZnVuY3Rpb24ocixzKXtzPXN8fHt9O3ZhciB0PXMuZW5jb2RlZE1hc2tEYXRhfHxzLmVuY29kZWRNYXNrRGF0YT09PW51bGwsbj1hKHIscy5pbnB1dE9mZnNldHx8MCx0KSxoPXMubm9EYXRhVmFsdWUhPT1udWxsP3Mubm9EYXRhVmFsdWU6ay5kZWZhdWx0Tm9EYXRhVmFsdWUsaT1kKG4scy5waXhlbFR5cGV8fEZsb2F0MzJBcnJheSxzLmVuY29kZWRNYXNrRGF0YSxoLHMucmV0dXJuTWFzayksbz17d2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHQscGl4ZWxEYXRhOmkucmVzdWx0UGl4ZWxzLG1pblZhbHVlOmkubWluVmFsdWUsbWF4VmFsdWU6bi5waXhlbHMubWF4VmFsdWUsbm9EYXRhVmFsdWU6aH07cmV0dXJuIGkucmVzdWx0TWFzayYmKG8ubWFza0RhdGE9aS5yZXN1bHRNYXNrKSxzLnJldHVybkVuY29kZWRNYXNrJiZuLm1hc2smJihvLmVuY29kZWRNYXNrRGF0YT1uLm1hc2suYml0c2V0P24ubWFzay5iaXRzZXQ6bnVsbCkscy5yZXR1cm5GaWxlSW5mbyYmKG8uZmlsZUluZm89eShuKSxzLmNvbXB1dGVVc2VkQml0RGVwdGhzJiYoby5maWxlSW5mby5iaXREZXB0aHM9VihuKSkpLG99O3ZhciBkPWZ1bmN0aW9uKHIscyx0LG4saCl7dmFyIGk9MCxvPXIucGl4ZWxzLm51bUJsb2Nrc1gsYz1yLnBpeGVscy5udW1CbG9ja3NZLHU9TWF0aC5mbG9vcihyLndpZHRoL28pLG09TWF0aC5mbG9vcihyLmhlaWdodC9jKSx3PTIqci5tYXhaRXJyb3IsbD1OdW1iZXIuTUFYX1ZBTFVFLGY7dD10fHwoci5tYXNrP3IubWFzay5iaXRzZXQ6bnVsbCk7dmFyIGcsTTtnPW5ldyBzKHIud2lkdGgqci5oZWlnaHQpLGgmJnQmJihNPW5ldyBVaW50OEFycmF5KHIud2lkdGgqci5oZWlnaHQpKTtmb3IodmFyIEQ9bmV3IEZsb2F0MzJBcnJheSh1Km0pLHAsVSxJPTA7STw9YztJKyspe3ZhciB6PUkhPT1jP206ci5oZWlnaHQlYztpZih6IT09MClmb3IodmFyIHg9MDt4PD1vO3grKyl7dmFyIHY9eCE9PW8/dTpyLndpZHRoJW87aWYodiE9PTApe3ZhciBBPUkqci53aWR0aCptK3gqdSxUPXIud2lkdGgtdixTPXIucGl4ZWxzLmJsb2Nrc1tpXSxiLEwsRjtTLmVuY29kaW5nPDI/KFMuZW5jb2Rpbmc9PT0wP2I9Uy5yYXdEYXRhOihlKFMuc3R1ZmZlZERhdGEsUy5iaXRzUGVyUGl4ZWwsUy5udW1WYWxpZFBpeGVscyxTLm9mZnNldCx3LEQsci5waXhlbHMubWF4VmFsdWUpLGI9RCksTD0wKTpTLmVuY29kaW5nPT09Mj9GPTA6Rj1TLm9mZnNldDt2YXIgQjtpZih0KWZvcihVPTA7VTx6O1UrKyl7Zm9yKEEmNyYmKEI9dFtBPj4zXSxCPDw9QSY3KSxwPTA7cDx2O3ArKylBJjd8fChCPXRbQT4+M10pLEImMTI4PyhNJiYoTVtBXT0xKSxmPVMuZW5jb2Rpbmc8Mj9iW0wrK106RixsPWw+Zj9mOmwsZ1tBKytdPWYpOihNJiYoTVtBXT0wKSxnW0ErK109biksQjw8PTE7QSs9VH1lbHNlIGlmKFMuZW5jb2Rpbmc8Milmb3IoVT0wO1U8ejtVKyspe2ZvcihwPTA7cDx2O3ArKylmPWJbTCsrXSxsPWw+Zj9mOmwsZ1tBKytdPWY7QSs9VH1lbHNlIGZvcihsPWw+Rj9GOmwsVT0wO1U8ejtVKyspe2ZvcihwPTA7cDx2O3ArKylnW0ErK109RjtBKz1UfWlmKFMuZW5jb2Rpbmc9PT0xJiZMIT09Uy5udW1WYWxpZFBpeGVscyl0aHJvdyJCbG9jayBhbmQgTWFzayBkbyBub3QgbWF0Y2giO2krK319fXJldHVybntyZXN1bHRQaXhlbHM6ZyxyZXN1bHRNYXNrOk0sbWluVmFsdWU6bH19LHk9ZnVuY3Rpb24ocil7cmV0dXJue2ZpbGVJZGVudGlmaWVyU3RyaW5nOnIuZmlsZUlkZW50aWZpZXJTdHJpbmcsZmlsZVZlcnNpb246ci5maWxlVmVyc2lvbixpbWFnZVR5cGU6ci5pbWFnZVR5cGUsaGVpZ2h0OnIuaGVpZ2h0LHdpZHRoOnIud2lkdGgsbWF4WkVycm9yOnIubWF4WkVycm9yLGVvZk9mZnNldDpyLmVvZk9mZnNldCxtYXNrOnIubWFzaz97bnVtQmxvY2tzWDpyLm1hc2subnVtQmxvY2tzWCxudW1CbG9ja3NZOnIubWFzay5udW1CbG9ja3NZLG51bUJ5dGVzOnIubWFzay5udW1CeXRlcyxtYXhWYWx1ZTpyLm1hc2subWF4VmFsdWV9Om51bGwscGl4ZWxzOntudW1CbG9ja3NYOnIucGl4ZWxzLm51bUJsb2Nrc1gsbnVtQmxvY2tzWTpyLnBpeGVscy5udW1CbG9ja3NZLG51bUJ5dGVzOnIucGl4ZWxzLm51bUJ5dGVzLG1heFZhbHVlOnIucGl4ZWxzLm1heFZhbHVlLG5vRGF0YVZhbHVlOnIubm9EYXRhVmFsdWV9fX0sVj1mdW5jdGlvbihyKXtmb3IodmFyIHM9ci5waXhlbHMubnVtQmxvY2tzWCpyLnBpeGVscy5udW1CbG9ja3NZLHQ9e30sbj0wO248cztuKyspe3ZhciBoPXIucGl4ZWxzLmJsb2Nrc1tuXTtoLmVuY29kaW5nPT09MD90LmZsb2F0MzI9ITA6aC5lbmNvZGluZz09PTE/dFtoLmJpdHNQZXJQaXhlbF09ITA6dFswXT0hMH1yZXR1cm4gT2JqZWN0LmtleXModCl9LGE9ZnVuY3Rpb24ocixzLHQpe3ZhciBuPXt9LGg9bmV3IFVpbnQ4QXJyYXkocixzLDEwKTtpZihuLmZpbGVJZGVudGlmaWVyU3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxoKSxuLmZpbGVJZGVudGlmaWVyU3RyaW5nLnRyaW0oKSE9PSJDbnRaSW1hZ2UiKXRocm93IlVuZXhwZWN0ZWQgZmlsZSBpZGVudGlmaWVyIHN0cmluZzogIituLmZpbGVJZGVudGlmaWVyU3RyaW5nO3MrPTEwO3ZhciBpPW5ldyBEYXRhVmlldyhyLHMsMjQpO2lmKG4uZmlsZVZlcnNpb249aS5nZXRJbnQzMigwLCEwKSxuLmltYWdlVHlwZT1pLmdldEludDMyKDQsITApLG4uaGVpZ2h0PWkuZ2V0VWludDMyKDgsITApLG4ud2lkdGg9aS5nZXRVaW50MzIoMTIsITApLG4ubWF4WkVycm9yPWkuZ2V0RmxvYXQ2NCgxNiwhMCkscys9MjQsIXQpaWYoaT1uZXcgRGF0YVZpZXcocixzLDE2KSxuLm1hc2s9e30sbi5tYXNrLm51bUJsb2Nrc1k9aS5nZXRVaW50MzIoMCwhMCksbi5tYXNrLm51bUJsb2Nrc1g9aS5nZXRVaW50MzIoNCwhMCksbi5tYXNrLm51bUJ5dGVzPWkuZ2V0VWludDMyKDgsITApLG4ubWFzay5tYXhWYWx1ZT1pLmdldEZsb2F0MzIoMTIsITApLHMrPTE2LG4ubWFzay5udW1CeXRlcz4wKXt2YXIgbz1uZXcgVWludDhBcnJheShNYXRoLmNlaWwobi53aWR0aCpuLmhlaWdodC84KSk7aT1uZXcgRGF0YVZpZXcocixzLG4ubWFzay5udW1CeXRlcyk7dmFyIGM9aS5nZXRJbnQxNigwLCEwKSx1PTIsbT0wO2Rve2lmKGM+MClmb3IoO2MtLTspb1ttKytdPWkuZ2V0VWludDgodSsrKTtlbHNle3ZhciB3PWkuZ2V0VWludDgodSsrKTtmb3IoYz0tYztjLS07KW9bbSsrXT13fWM9aS5nZXRJbnQxNih1LCEwKSx1Kz0yfXdoaWxlKHU8bi5tYXNrLm51bUJ5dGVzKTtpZihjIT09LTMyNzY4fHxtPG8ubGVuZ3RoKXRocm93IlVuZXhwZWN0ZWQgZW5kIG9mIG1hc2sgUkxFIGVuY29kaW5nIjtuLm1hc2suYml0c2V0PW8scys9bi5tYXNrLm51bUJ5dGVzfWVsc2Ugbi5tYXNrLm51bUJ5dGVzfG4ubWFzay5udW1CbG9ja3NZfG4ubWFzay5tYXhWYWx1ZXx8KG4ubWFzay5iaXRzZXQ9bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKG4ud2lkdGgqbi5oZWlnaHQvOCkpKTtpPW5ldyBEYXRhVmlldyhyLHMsMTYpLG4ucGl4ZWxzPXt9LG4ucGl4ZWxzLm51bUJsb2Nrc1k9aS5nZXRVaW50MzIoMCwhMCksbi5waXhlbHMubnVtQmxvY2tzWD1pLmdldFVpbnQzMig0LCEwKSxuLnBpeGVscy5udW1CeXRlcz1pLmdldFVpbnQzMig4LCEwKSxuLnBpeGVscy5tYXhWYWx1ZT1pLmdldEZsb2F0MzIoMTIsITApLHMrPTE2O3ZhciBsPW4ucGl4ZWxzLm51bUJsb2Nrc1gsZj1uLnBpeGVscy5udW1CbG9ja3NZLGc9bCsobi53aWR0aCVsPjA/MTowKSxNPWYrKG4uaGVpZ2h0JWY+MD8xOjApO24ucGl4ZWxzLmJsb2Nrcz1uZXcgQXJyYXkoZypNKTtmb3IodmFyIEQ9MCxwPTA7cDxNO3ArKylmb3IodmFyIFU9MDtVPGc7VSsrKXt2YXIgST0wLHo9ci5ieXRlTGVuZ3RoLXM7aT1uZXcgRGF0YVZpZXcocixzLE1hdGgubWluKDEwLHopKTt2YXIgeD17fTtuLnBpeGVscy5ibG9ja3NbRCsrXT14O3ZhciB2PWkuZ2V0VWludDgoMCk7aWYoSSsrLHguZW5jb2Rpbmc9diY2Myx4LmVuY29kaW5nPjMpdGhyb3ciSW52YWxpZCBibG9jayBlbmNvZGluZyAoIit4LmVuY29kaW5nKyIpIjtpZih4LmVuY29kaW5nPT09Mil7cysrO2NvbnRpbnVlfWlmKHYhPT0wJiZ2IT09Mil7aWYodj4+PTYseC5vZmZzZXRUeXBlPXYsdj09PTIpeC5vZmZzZXQ9aS5nZXRJbnQ4KDEpLEkrKztlbHNlIGlmKHY9PT0xKXgub2Zmc2V0PWkuZ2V0SW50MTYoMSwhMCksSSs9MjtlbHNlIGlmKHY9PT0wKXgub2Zmc2V0PWkuZ2V0RmxvYXQzMigxLCEwKSxJKz00O2Vsc2UgdGhyb3ciSW52YWxpZCBibG9jayBvZmZzZXQgdHlwZSI7aWYoeC5lbmNvZGluZz09PTEpaWYodj1pLmdldFVpbnQ4KEkpLEkrKyx4LmJpdHNQZXJQaXhlbD12JjYzLHY+Pj02LHgubnVtVmFsaWRQaXhlbHNUeXBlPXYsdj09PTIpeC5udW1WYWxpZFBpeGVscz1pLmdldFVpbnQ4KEkpLEkrKztlbHNlIGlmKHY9PT0xKXgubnVtVmFsaWRQaXhlbHM9aS5nZXRVaW50MTYoSSwhMCksSSs9MjtlbHNlIGlmKHY9PT0wKXgubnVtVmFsaWRQaXhlbHM9aS5nZXRVaW50MzIoSSwhMCksSSs9NDtlbHNlIHRocm93IkludmFsaWQgdmFsaWQgcGl4ZWwgY291bnQgdHlwZSJ9aWYocys9SSx4LmVuY29kaW5nIT09Myl7dmFyIEEsVDtpZih4LmVuY29kaW5nPT09MCl7dmFyIFM9KG4ucGl4ZWxzLm51bUJ5dGVzLTEpLzQ7aWYoUyE9PU1hdGguZmxvb3IoUykpdGhyb3cidW5jb21wcmVzc2VkIGJsb2NrIGhhcyBpbnZhbGlkIGxlbmd0aCI7QT1uZXcgQXJyYXlCdWZmZXIoUyo0KSxUPW5ldyBVaW50OEFycmF5KEEpLFQuc2V0KG5ldyBVaW50OEFycmF5KHIscyxTKjQpKTt2YXIgYj1uZXcgRmxvYXQzMkFycmF5KEEpO3gucmF3RGF0YT1iLHMrPVMqNH1lbHNlIGlmKHguZW5jb2Rpbmc9PT0xKXt2YXIgTD1NYXRoLmNlaWwoeC5udW1WYWxpZFBpeGVscyp4LmJpdHNQZXJQaXhlbC84KSxGPU1hdGguY2VpbChMLzQpO0E9bmV3IEFycmF5QnVmZmVyKEYqNCksVD1uZXcgVWludDhBcnJheShBKSxULnNldChuZXcgVWludDhBcnJheShyLHMsTCkpLHguc3R1ZmZlZERhdGE9bmV3IFVpbnQzMkFycmF5KEEpLHMrPUx9fX1yZXR1cm4gbi5lb2ZPZmZzZXQ9cyxufSxlPWZ1bmN0aW9uKHIscyx0LG4saCxpLG8pe3ZhciBjPSgxPDxzKS0xLHU9MCxtLHc9MCxsLGYsZz1NYXRoLmNlaWwoKG8tbikvaCksTT1yLmxlbmd0aCo0LU1hdGguY2VpbChzKnQvOCk7Zm9yKHJbci5sZW5ndGgtMV08PD04Kk0sbT0wO208dDttKyspe2lmKHc9PT0wJiYoZj1yW3UrK10sdz0zMiksdz49cylsPWY+Pj53LXMmYyx3LT1zO2Vsc2V7dmFyIEQ9cy13O2w9KGYmYyk8PEQmYyxmPXJbdSsrXSx3PTMyLUQsbCs9Zj4+Pnd9aVttXT1sPGc/bitsKmg6b31yZXR1cm4gaX07cmV0dXJuIGt9KCksaWU9ZnVuY3Rpb24oKXt2YXIgaz17dW5zdHVmZjpmdW5jdGlvbihhLGUscixzLHQsbixoLGkpe3ZhciBvPSgxPDxyKS0xLGM9MCx1LG09MCx3LGwsZixnLE09YS5sZW5ndGgqNC1NYXRoLmNlaWwocipzLzgpO2lmKGFbYS5sZW5ndGgtMV08PD04Kk0sdClmb3IodT0wO3U8czt1KyspbT09PTAmJihsPWFbYysrXSxtPTMyKSxtPj1yPyh3PWw+Pj5tLXImbyxtLT1yKTooZj1yLW0sdz0obCZvKTw8ZiZvLGw9YVtjKytdLG09MzItZix3Kz1sPj4+bSksZVt1XT10W3ddO2Vsc2UgZm9yKGc9TWF0aC5jZWlsKChpLW4pL2gpLHU9MDt1PHM7dSsrKW09PT0wJiYobD1hW2MrK10sbT0zMiksbT49cj8odz1sPj4+bS1yJm8sbS09cik6KGY9ci1tLHc9KGwmbyk8PGYmbyxsPWFbYysrXSxtPTMyLWYsdys9bD4+Pm0pLGVbdV09dzxnP24rdypoOml9LHVuc3R1ZmZMVVQ6ZnVuY3Rpb24oYSxlLHIscyx0LG4pe3ZhciBoPSgxPDxlKS0xLGk9MCxvPTAsYz0wLHU9MCxtPTAsdyxsPVtdLGY9YS5sZW5ndGgqNC1NYXRoLmNlaWwoZSpyLzgpO2FbYS5sZW5ndGgtMV08PD04KmY7dmFyIGc9TWF0aC5jZWlsKChuLXMpL3QpO2ZvcihvPTA7bzxyO28rKyl1PT09MCYmKHc9YVtpKytdLHU9MzIpLHU+PWU/KG09dz4+PnUtZSZoLHUtPWUpOihjPWUtdSxtPSh3JmgpPDxjJmgsdz1hW2krK10sdT0zMi1jLG0rPXc+Pj51KSxsW29dPW08Zz9zK20qdDpuO3JldHVybiBsLnVuc2hpZnQocyksbH0sdW5zdHVmZjI6ZnVuY3Rpb24oYSxlLHIscyx0LG4saCxpKXt2YXIgbz0oMTw8ciktMSxjPTAsdSxtPTAsdz0wLGwsZixnO2lmKHQpZm9yKHU9MDt1PHM7dSsrKW09PT0wJiYoZj1hW2MrK10sbT0zMix3PTApLG0+PXI/KGw9Zj4+PncmbyxtLT1yLHcrPXIpOihnPXItbSxsPWY+Pj53Jm8sZj1hW2MrK10sbT0zMi1nLGx8PShmJigxPDxnKS0xKTw8ci1nLHc9ZyksZVt1XT10W2xdO2Vsc2V7dmFyIE09TWF0aC5jZWlsKChpLW4pL2gpO2Zvcih1PTA7dTxzO3UrKyltPT09MCYmKGY9YVtjKytdLG09MzIsdz0wKSxtPj1yPyhsPWY+Pj53Jm8sbS09cix3Kz1yKTooZz1yLW0sbD1mPj4+dyZvLGY9YVtjKytdLG09MzItZyxsfD0oZiYoMTw8ZyktMSk8PHItZyx3PWcpLGVbdV09bDxNP24rbCpoOml9cmV0dXJuIGV9LHVuc3R1ZmZMVVQyOmZ1bmN0aW9uKGEsZSxyLHMsdCxuKXt2YXIgaD0oMTw8ZSktMSxpPTAsbz0wLGM9MCx1PTAsbT0wLHc9MCxsLGY9W10sZz1NYXRoLmNlaWwoKG4tcykvdCk7Zm9yKG89MDtvPHI7bysrKXU9PT0wJiYobD1hW2krK10sdT0zMix3PTApLHU+PWU/KG09bD4+PncmaCx1LT1lLHcrPWUpOihjPWUtdSxtPWw+Pj53JmgsbD1hW2krK10sdT0zMi1jLG18PShsJigxPDxjKS0xKTw8ZS1jLHc9YyksZltvXT1tPGc/cyttKnQ6bjtyZXR1cm4gZi51bnNoaWZ0KHMpLGZ9LG9yaWdpbmFsVW5zdHVmZjpmdW5jdGlvbihhLGUscixzKXt2YXIgdD0oMTw8ciktMSxuPTAsaCxpPTAsbyxjLHUsbT1hLmxlbmd0aCo0LU1hdGguY2VpbChyKnMvOCk7Zm9yKGFbYS5sZW5ndGgtMV08PD04Km0saD0wO2g8cztoKyspaT09PTAmJihjPWFbbisrXSxpPTMyKSxpPj1yPyhvPWM+Pj5pLXImdCxpLT1yKToodT1yLWksbz0oYyZ0KTw8dSZ0LGM9YVtuKytdLGk9MzItdSxvKz1jPj4+aSksZVtoXT1vO3JldHVybiBlfSxvcmlnaW5hbFVuc3R1ZmYyOmZ1bmN0aW9uKGEsZSxyLHMpe3ZhciB0PSgxPDxyKS0xLG49MCxoLGk9MCxvPTAsYyx1LG07Zm9yKGg9MDtoPHM7aCsrKWk9PT0wJiYodT1hW24rK10saT0zMixvPTApLGk+PXI/KGM9dT4+Pm8mdCxpLT1yLG8rPXIpOihtPXItaSxjPXU+Pj5vJnQsdT1hW24rK10saT0zMi1tLGN8PSh1JigxPDxtKS0xKTw8ci1tLG89bSksZVtoXT1jO3JldHVybiBlfX0sZD17SFVGRk1BTl9MVVRfQklUU19NQVg6MTIsY29tcHV0ZUNoZWNrc3VtRmxldGNoZXIzMjpmdW5jdGlvbihhKXtmb3IodmFyIGU9NjU1MzUscj02NTUzNSxzPWEubGVuZ3RoLHQ9TWF0aC5mbG9vcihzLzIpLG49MDt0Oyl7dmFyIGg9dD49MzU5PzM1OTp0O3QtPWg7ZG8gZSs9YVtuKytdPDw4LHIrPWUrPWFbbisrXTt3aGlsZSgtLWgpO2U9KGUmNjU1MzUpKyhlPj4+MTYpLHI9KHImNjU1MzUpKyhyPj4+MTYpfXJldHVybiBzJjEmJihyKz1lKz1hW25dPDw4KSxlPShlJjY1NTM1KSsoZT4+PjE2KSxyPShyJjY1NTM1KSsocj4+PjE2KSwocjw8MTZ8ZSk+Pj4wfSxyZWFkSGVhZGVySW5mbzpmdW5jdGlvbihhLGUpe3ZhciByPWUucHRyLHM9bmV3IFVpbnQ4QXJyYXkoYSxyLDYpLHQ9e307aWYodC5maWxlSWRlbnRpZmllclN0cmluZz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwscyksdC5maWxlSWRlbnRpZmllclN0cmluZy5sYXN0SW5kZXhPZigiTGVyYzIiLDApIT09MCl0aHJvdyJVbmV4cGVjdGVkIGZpbGUgaWRlbnRpZmllciBzdHJpbmcgKGV4cGVjdCBMZXJjMiApOiAiK3QuZmlsZUlkZW50aWZpZXJTdHJpbmc7cis9Njt2YXIgbj1uZXcgRGF0YVZpZXcoYSxyLDgpLGg9bi5nZXRJbnQzMigwLCEwKTt0LmZpbGVWZXJzaW9uPWgscis9NCxoPj0zJiYodC5jaGVja3N1bT1uLmdldFVpbnQzMig0LCEwKSxyKz00KSxuPW5ldyBEYXRhVmlldyhhLHIsMTIpLHQuaGVpZ2h0PW4uZ2V0VWludDMyKDAsITApLHQud2lkdGg9bi5nZXRVaW50MzIoNCwhMCkscis9OCxoPj00Pyh0Lm51bURpbXM9bi5nZXRVaW50MzIoOCwhMCkscis9NCk6dC5udW1EaW1zPTEsbj1uZXcgRGF0YVZpZXcoYSxyLDQwKSx0Lm51bVZhbGlkUGl4ZWw9bi5nZXRVaW50MzIoMCwhMCksdC5taWNyb0Jsb2NrU2l6ZT1uLmdldEludDMyKDQsITApLHQuYmxvYlNpemU9bi5nZXRJbnQzMig4LCEwKSx0LmltYWdlVHlwZT1uLmdldEludDMyKDEyLCEwKSx0Lm1heFpFcnJvcj1uLmdldEZsb2F0NjQoMTYsITApLHQuek1pbj1uLmdldEZsb2F0NjQoMjQsITApLHQuek1heD1uLmdldEZsb2F0NjQoMzIsITApLHIrPTQwLGUuaGVhZGVySW5mbz10LGUucHRyPXI7dmFyIGksbztpZihoPj0zJiYobz1oPj00PzUyOjQ4LGk9dGhpcy5jb21wdXRlQ2hlY2tzdW1GbGV0Y2hlcjMyKG5ldyBVaW50OEFycmF5KGEsci1vLHQuYmxvYlNpemUtMTQpKSxpIT09dC5jaGVja3N1bSkpdGhyb3ciQ2hlY2tzdW0gZmFpbGVkLiI7cmV0dXJuITB9LGNoZWNrTWluTWF4UmFuZ2VzOmZ1bmN0aW9uKGEsZSl7dmFyIHI9ZS5oZWFkZXJJbmZvLHM9dGhpcy5nZXREYXRhVHlwZUFycmF5KHIuaW1hZ2VUeXBlKSx0PXIubnVtRGltcyp0aGlzLmdldERhdGFUeXBlU2l6ZShyLmltYWdlVHlwZSksbj10aGlzLnJlYWRTdWJBcnJheShhLGUucHRyLHMsdCksaD10aGlzLnJlYWRTdWJBcnJheShhLGUucHRyK3Qscyx0KTtlLnB0cis9Mip0O3ZhciBpLG89ITA7Zm9yKGk9MDtpPHIubnVtRGltcztpKyspaWYobltpXSE9PWhbaV0pe289ITE7YnJlYWt9cmV0dXJuIHIubWluVmFsdWVzPW4sci5tYXhWYWx1ZXM9aCxvfSxyZWFkU3ViQXJyYXk6ZnVuY3Rpb24oYSxlLHIscyl7dmFyIHQ7aWYocj09PVVpbnQ4QXJyYXkpdD1uZXcgVWludDhBcnJheShhLGUscyk7ZWxzZXt2YXIgbj1uZXcgQXJyYXlCdWZmZXIocyksaD1uZXcgVWludDhBcnJheShuKTtoLnNldChuZXcgVWludDhBcnJheShhLGUscykpLHQ9bmV3IHIobil9cmV0dXJuIHR9LHJlYWRNYXNrOmZ1bmN0aW9uKGEsZSl7dmFyIHI9ZS5wdHIscz1lLmhlYWRlckluZm8sdD1zLndpZHRoKnMuaGVpZ2h0LG49cy5udW1WYWxpZFBpeGVsLGg9bmV3IERhdGFWaWV3KGEsciw0KSxpPXt9O2lmKGkubnVtQnl0ZXM9aC5nZXRVaW50MzIoMCwhMCkscis9NCwobj09PTB8fHQ9PT1uKSYmaS5udW1CeXRlcyE9PTApdGhyb3ciaW52YWxpZCBtYXNrIjt2YXIgbyxjO2lmKG49PT0wKW89bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKHQvOCkpLGkuYml0c2V0PW8sYz1uZXcgVWludDhBcnJheSh0KSxlLnBpeGVscy5yZXN1bHRNYXNrPWMscis9aS5udW1CeXRlcztlbHNlIGlmKGkubnVtQnl0ZXM+MCl7bz1uZXcgVWludDhBcnJheShNYXRoLmNlaWwodC84KSksaD1uZXcgRGF0YVZpZXcoYSxyLGkubnVtQnl0ZXMpO3ZhciB1PWguZ2V0SW50MTYoMCwhMCksbT0yLHc9MCxsPTA7ZG97aWYodT4wKWZvcig7dS0tOylvW3crK109aC5nZXRVaW50OChtKyspO2Vsc2UgZm9yKGw9aC5nZXRVaW50OChtKyspLHU9LXU7dS0tOylvW3crK109bDt1PWguZ2V0SW50MTYobSwhMCksbSs9Mn13aGlsZShtPGkubnVtQnl0ZXMpO2lmKHUhPT0tMzI3Njh8fHc8by5sZW5ndGgpdGhyb3ciVW5leHBlY3RlZCBlbmQgb2YgbWFzayBSTEUgZW5jb2RpbmciO2M9bmV3IFVpbnQ4QXJyYXkodCk7dmFyIGY9MCxnPTA7Zm9yKGc9MDtnPHQ7ZysrKWcmNz8oZj1vW2c+PjNdLGY8PD1nJjcpOmY9b1tnPj4zXSxmJjEyOCYmKGNbZ109MSk7ZS5waXhlbHMucmVzdWx0TWFzaz1jLGkuYml0c2V0PW8scis9aS5udW1CeXRlc31yZXR1cm4gZS5wdHI9cixlLm1hc2s9aSwhMH0scmVhZERhdGFPbmVTd2VlcDpmdW5jdGlvbihhLGUscixzKXt2YXIgdD1lLnB0cixuPWUuaGVhZGVySW5mbyxoPW4ubnVtRGltcyxpPW4ud2lkdGgqbi5oZWlnaHQsbz1uLmltYWdlVHlwZSxjPW4ubnVtVmFsaWRQaXhlbCpkLmdldERhdGFUeXBlU2l6ZShvKSpoLHUsbT1lLnBpeGVscy5yZXN1bHRNYXNrO2lmKHI9PT1VaW50OEFycmF5KXU9bmV3IFVpbnQ4QXJyYXkoYSx0LGMpO2Vsc2V7dmFyIHc9bmV3IEFycmF5QnVmZmVyKGMpLGw9bmV3IFVpbnQ4QXJyYXkodyk7bC5zZXQobmV3IFVpbnQ4QXJyYXkoYSx0LGMpKSx1PW5ldyByKHcpfWlmKHUubGVuZ3RoPT09aSpoKXM/ZS5waXhlbHMucmVzdWx0UGl4ZWxzPWQuc3dhcERpbWVuc2lvbk9yZGVyKHUsaSxoLHIsITApOmUucGl4ZWxzLnJlc3VsdFBpeGVscz11O2Vsc2V7ZS5waXhlbHMucmVzdWx0UGl4ZWxzPW5ldyByKGkqaCk7dmFyIGY9MCxnPTAsTT0wLEQ9MDtpZihoPjEpe2lmKHMpe2ZvcihnPTA7ZzxpO2crKylpZihtW2ddKWZvcihEPWcsTT0wO008aDtNKyssRCs9aSllLnBpeGVscy5yZXN1bHRQaXhlbHNbRF09dVtmKytdfWVsc2UgZm9yKGc9MDtnPGk7ZysrKWlmKG1bZ10pZm9yKEQ9ZypoLE09MDtNPGg7TSsrKWUucGl4ZWxzLnJlc3VsdFBpeGVsc1tEK01dPXVbZisrXX1lbHNlIGZvcihnPTA7ZzxpO2crKyltW2ddJiYoZS5waXhlbHMucmVzdWx0UGl4ZWxzW2ddPXVbZisrXSl9cmV0dXJuIHQrPWMsZS5wdHI9dCwhMH0scmVhZEh1ZmZtYW5UcmVlOmZ1bmN0aW9uKGEsZSl7dmFyIHI9dGhpcy5IVUZGTUFOX0xVVF9CSVRTX01BWCxzPW5ldyBEYXRhVmlldyhhLGUucHRyLDE2KTtlLnB0cis9MTY7dmFyIHQ9cy5nZXRJbnQzMigwLCEwKTtpZih0PDIpdGhyb3cidW5zdXBwb3J0ZWQgSHVmZm1hbiB2ZXJzaW9uIjt2YXIgbj1zLmdldEludDMyKDQsITApLGg9cy5nZXRJbnQzMig4LCEwKSxpPXMuZ2V0SW50MzIoMTIsITApO2lmKGg+PWkpcmV0dXJuITE7dmFyIG89bmV3IFVpbnQzMkFycmF5KGktaCk7ZC5kZWNvZGVCaXRzKGEsZSxvKTt2YXIgYz1bXSx1LG0sdyxsO2Zvcih1PWg7dTxpO3UrKyltPXUtKHU8bj8wOm4pLGNbbV09e2ZpcnN0Om9bdS1oXSxzZWNvbmQ6bnVsbH07dmFyIGY9YS5ieXRlTGVuZ3RoLWUucHRyLGc9TWF0aC5jZWlsKGYvNCksTT1uZXcgQXJyYXlCdWZmZXIoZyo0KSxEPW5ldyBVaW50OEFycmF5KE0pO0Quc2V0KG5ldyBVaW50OEFycmF5KGEsZS5wdHIsZikpO3ZhciBwPW5ldyBVaW50MzJBcnJheShNKSxVPTAsSSx6PTA7Zm9yKEk9cFswXSx1PWg7dTxpO3UrKyltPXUtKHU8bj8wOm4pLGw9Y1ttXS5maXJzdCxsPjAmJihjW21dLnNlY29uZD1JPDxVPj4+MzItbCwzMi1VPj1sPyhVKz1sLFU9PT0zMiYmKFU9MCx6KyssST1wW3pdKSk6KFUrPWwtMzIseisrLEk9cFt6XSxjW21dLnNlY29uZHw9ST4+PjMyLVUpKTt2YXIgeD0wLHY9MCxBPW5ldyB5O2Zvcih1PTA7dTxjLmxlbmd0aDt1KyspY1t1XSE9PXZvaWQgMCYmKHg9TWF0aC5tYXgoeCxjW3VdLmZpcnN0KSk7eD49cj92PXI6dj14O3ZhciBUPVtdLFMsYixMLEYsQixDO2Zvcih1PWg7dTxpO3UrKylpZihtPXUtKHU8bj8wOm4pLGw9Y1ttXS5maXJzdCxsPjApaWYoUz1bbCxtXSxsPD12KWZvcihiPWNbbV0uc2Vjb25kPDx2LWwsTD0xPDx2LWwsdz0wO3c8TDt3KyspVFtifHddPVM7ZWxzZSBmb3IoYj1jW21dLnNlY29uZCxDPUEsRj1sLTE7Rj49MDtGLS0pQj1iPj4+RiYxLEI/KEMucmlnaHR8fChDLnJpZ2h0PW5ldyB5KSxDPUMucmlnaHQpOihDLmxlZnR8fChDLmxlZnQ9bmV3IHkpLEM9Qy5sZWZ0KSxGPT09MCYmIUMudmFsJiYoQy52YWw9U1sxXSk7cmV0dXJue2RlY29kZUx1dDpULG51bUJpdHNMVVRRaWNrOnYsbnVtQml0c0xVVDp4LHRyZWU6QSxzdHVmZmVkRGF0YTpwLHNyY1B0cjp6LGJpdFBvczpVfX0scmVhZEh1ZmZtYW46ZnVuY3Rpb24oYSxlLHIscyl7dmFyIHQ9ZS5oZWFkZXJJbmZvLG49dC5udW1EaW1zLGg9ZS5oZWFkZXJJbmZvLmhlaWdodCxpPWUuaGVhZGVySW5mby53aWR0aCxvPWkqaCxjPXRoaXMucmVhZEh1ZmZtYW5UcmVlKGEsZSksdT1jLmRlY29kZUx1dCxtPWMudHJlZSx3PWMuc3R1ZmZlZERhdGEsbD1jLnNyY1B0cixmPWMuYml0UG9zLGc9Yy5udW1CaXRzTFVUUWljayxNPWMubnVtQml0c0xVVCxEPWUuaGVhZGVySW5mby5pbWFnZVR5cGU9PT0wPzEyODowLHAsVSxJLHo9ZS5waXhlbHMucmVzdWx0TWFzayx4LHYsQSxULFMsYixMLEY9MDtmPjAmJihsKyssZj0wKTt2YXIgQj13W2xdLEM9ZS5lbmNvZGVNb2RlPT09MSxIPW5ldyByKG8qbiksTz1ILFg7aWYobjwyfHxDKXtmb3IoWD0wO1g8bjtYKyspaWYobj4xJiYoTz1uZXcgcihILmJ1ZmZlcixvKlgsbyksRj0wKSxlLmhlYWRlckluZm8ubnVtVmFsaWRQaXhlbD09PWkqaClmb3IoYj0wLFQ9MDtUPGg7VCsrKWZvcihTPTA7UzxpO1MrKyxiKyspe2lmKFU9MCx4PUI8PGY+Pj4zMi1nLHY9eCwzMi1mPGcmJih4fD13W2wrMV0+Pj42NC1mLWcsdj14KSx1W3ZdKVU9dVt2XVsxXSxmKz11W3ZdWzBdO2Vsc2UgZm9yKHg9Qjw8Zj4+PjMyLU0sdj14LDMyLWY8TSYmKHh8PXdbbCsxXT4+PjY0LWYtTSx2PXgpLHA9bSxMPTA7TDxNO0wrKylpZihBPXg+Pj5NLUwtMSYxLHA9QT9wLnJpZ2h0OnAubGVmdCwhKHAubGVmdHx8cC5yaWdodCkpe1U9cC52YWwsZj1mK0wrMTticmVha31mPj0zMiYmKGYtPTMyLGwrKyxCPXdbbF0pLEk9VS1ELEM/KFM+MD9JKz1GOlQ+MD9JKz1PW2ItaV06SSs9RixJJj0yNTUsT1tiXT1JLEY9SSk6T1tiXT1JfWVsc2UgZm9yKGI9MCxUPTA7VDxoO1QrKylmb3IoUz0wO1M8aTtTKyssYisrKWlmKHpbYl0pe2lmKFU9MCx4PUI8PGY+Pj4zMi1nLHY9eCwzMi1mPGcmJih4fD13W2wrMV0+Pj42NC1mLWcsdj14KSx1W3ZdKVU9dVt2XVsxXSxmKz11W3ZdWzBdO2Vsc2UgZm9yKHg9Qjw8Zj4+PjMyLU0sdj14LDMyLWY8TSYmKHh8PXdbbCsxXT4+PjY0LWYtTSx2PXgpLHA9bSxMPTA7TDxNO0wrKylpZihBPXg+Pj5NLUwtMSYxLHA9QT9wLnJpZ2h0OnAubGVmdCwhKHAubGVmdHx8cC5yaWdodCkpe1U9cC52YWwsZj1mK0wrMTticmVha31mPj0zMiYmKGYtPTMyLGwrKyxCPXdbbF0pLEk9VS1ELEM/KFM+MCYmeltiLTFdP0krPUY6VD4wJiZ6W2ItaV0/SSs9T1tiLWldOkkrPUYsSSY9MjU1LE9bYl09SSxGPUkpOk9bYl09SX19ZWxzZSBmb3IoYj0wLFQ9MDtUPGg7VCsrKWZvcihTPTA7UzxpO1MrKylpZihiPVQqaStTLCF6fHx6W2JdKWZvcihYPTA7WDxuO1grKyxiKz1vKXtpZihVPTAseD1CPDxmPj4+MzItZyx2PXgsMzItZjxnJiYoeHw9d1tsKzFdPj4+NjQtZi1nLHY9eCksdVt2XSlVPXVbdl1bMV0sZis9dVt2XVswXTtlbHNlIGZvcih4PUI8PGY+Pj4zMi1NLHY9eCwzMi1mPE0mJih4fD13W2wrMV0+Pj42NC1mLU0sdj14KSxwPW0sTD0wO0w8TTtMKyspaWYoQT14Pj4+TS1MLTEmMSxwPUE/cC5yaWdodDpwLmxlZnQsIShwLmxlZnR8fHAucmlnaHQpKXtVPXAudmFsLGY9ZitMKzE7YnJlYWt9Zj49MzImJihmLT0zMixsKyssQj13W2xdKSxJPVUtRCxPW2JdPUl9ZS5wdHI9ZS5wdHIrKGwrMSkqNCsoZj4wPzQ6MCksZS5waXhlbHMucmVzdWx0UGl4ZWxzPUgsbj4xJiYhcyYmKGUucGl4ZWxzLnJlc3VsdFBpeGVscz1kLnN3YXBEaW1lbnNpb25PcmRlcihILG8sbixyKSl9LGRlY29kZUJpdHM6ZnVuY3Rpb24oYSxlLHIscyx0KXt7dmFyIG49ZS5oZWFkZXJJbmZvLGg9bi5maWxlVmVyc2lvbixpPTAsbz1hLmJ5dGVMZW5ndGgtZS5wdHI+PTU/NTphLmJ5dGVMZW5ndGgtZS5wdHIsYz1uZXcgRGF0YVZpZXcoYSxlLnB0cixvKSx1PWMuZ2V0VWludDgoMCk7aSsrO3ZhciBtPXU+PjYsdz1tPT09MD80OjMtbSxsPSh1JjMyKT4wLGY9dSYzMSxnPTA7aWYodz09PTEpZz1jLmdldFVpbnQ4KGkpLGkrKztlbHNlIGlmKHc9PT0yKWc9Yy5nZXRVaW50MTYoaSwhMCksaSs9MjtlbHNlIGlmKHc9PT00KWc9Yy5nZXRVaW50MzIoaSwhMCksaSs9NDtlbHNlIHRocm93IkludmFsaWQgdmFsaWQgcGl4ZWwgY291bnQgdHlwZSI7dmFyIE09MipuLm1heFpFcnJvcixELHAsVSxJLHoseCx2LEEsVCxTPW4ubnVtRGltcz4xP24ubWF4VmFsdWVzW3RdOm4uek1heDtpZihsKXtmb3IoZS5jb3VudGVyLmx1dCsrLEE9Yy5nZXRVaW50OChpKSxpKyssST1NYXRoLmNlaWwoKEEtMSkqZi84KSx6PU1hdGguY2VpbChJLzQpLHA9bmV3IEFycmF5QnVmZmVyKHoqNCksVT1uZXcgVWludDhBcnJheShwKSxlLnB0cis9aSxVLnNldChuZXcgVWludDhBcnJheShhLGUucHRyLEkpKSx2PW5ldyBVaW50MzJBcnJheShwKSxlLnB0cis9SSxUPTA7QS0xPj4+VDspVCsrO0k9TWF0aC5jZWlsKGcqVC84KSx6PU1hdGguY2VpbChJLzQpLHA9bmV3IEFycmF5QnVmZmVyKHoqNCksVT1uZXcgVWludDhBcnJheShwKSxVLnNldChuZXcgVWludDhBcnJheShhLGUucHRyLEkpKSxEPW5ldyBVaW50MzJBcnJheShwKSxlLnB0cis9SSxoPj0zP3g9ay51bnN0dWZmTFVUMih2LGYsQS0xLHMsTSxTKTp4PWsudW5zdHVmZkxVVCh2LGYsQS0xLHMsTSxTKSxoPj0zP2sudW5zdHVmZjIoRCxyLFQsZyx4KTprLnVuc3R1ZmYoRCxyLFQsZyx4KX1lbHNlIGUuY291bnRlci5iaXRzdHVmZmVyKyssVD1mLGUucHRyKz1pLFQ+MCYmKEk9TWF0aC5jZWlsKGcqVC84KSx6PU1hdGguY2VpbChJLzQpLHA9bmV3IEFycmF5QnVmZmVyKHoqNCksVT1uZXcgVWludDhBcnJheShwKSxVLnNldChuZXcgVWludDhBcnJheShhLGUucHRyLEkpKSxEPW5ldyBVaW50MzJBcnJheShwKSxlLnB0cis9SSxoPj0zP3M9PW51bGw/ay5vcmlnaW5hbFVuc3R1ZmYyKEQscixULGcpOmsudW5zdHVmZjIoRCxyLFQsZywhMSxzLE0sUyk6cz09bnVsbD9rLm9yaWdpbmFsVW5zdHVmZihELHIsVCxnKTprLnVuc3R1ZmYoRCxyLFQsZywhMSxzLE0sUykpfX0scmVhZFRpbGVzOmZ1bmN0aW9uKGEsZSxyLHMpe3ZhciB0PWUuaGVhZGVySW5mbyxuPXQud2lkdGgsaD10LmhlaWdodCxpPW4qaCxvPXQubWljcm9CbG9ja1NpemUsYz10LmltYWdlVHlwZSx1PWQuZ2V0RGF0YVR5cGVTaXplKGMpLG09TWF0aC5jZWlsKG4vbyksdz1NYXRoLmNlaWwoaC9vKTtlLnBpeGVscy5udW1CbG9ja3NZPXcsZS5waXhlbHMubnVtQmxvY2tzWD1tLGUucGl4ZWxzLnB0cj0wO3ZhciBsPTAsZj0wLGc9MCxNPTAsRD0wLHA9MCxVPTAsST0wLHo9MCx4PTAsdj0wLEE9MCxUPTAsUz0wLGI9MCxMPTAsRixCLEMsSCxPLFgsJD1uZXcgcihvKm8pLGhlPWglb3x8byxjZT1uJW98fG8sUSxSLHE9dC5udW1EaW1zLGosRT1lLnBpeGVscy5yZXN1bHRNYXNrLFk9ZS5waXhlbHMucmVzdWx0UGl4ZWxzLG1lPXQuZmlsZVZlcnNpb24sSj1tZT49NT8xNDoxNSxaLEc9dC56TWF4LE47Zm9yKGc9MDtnPHc7ZysrKWZvcihEPWchPT13LTE/bzpoZSxNPTA7TTxtO00rKylmb3IocD1NIT09bS0xP286Y2Usdj1nKm4qbytNKm8sQT1uLXAsaj0wO2o8cTtqKyspe2lmKHE+MT8oTj1ZLHY9ZypuKm8rTSpvLFk9bmV3IHIoZS5waXhlbHMucmVzdWx0UGl4ZWxzLmJ1ZmZlcixpKmoqdSxpKSxHPXQubWF4VmFsdWVzW2pdKTpOPW51bGwsVT1hLmJ5dGVMZW5ndGgtZS5wdHIsRj1uZXcgRGF0YVZpZXcoYSxlLnB0cixNYXRoLm1pbigxMCxVKSksQj17fSxMPTAsST1GLmdldFVpbnQ4KDApLEwrKyxaPXQuZmlsZVZlcnNpb24+PTU/SSY0OjAsej1JPj42JjI1NSx4PUk+PjImSix4IT09KE0qbz4+MyZKKXx8WiYmaj09PTApdGhyb3ciaW50ZWdyaXR5IGlzc3VlIjtpZihYPUkmMyxYPjMpdGhyb3cgZS5wdHIrPUwsIkludmFsaWQgYmxvY2sgZW5jb2RpbmcgKCIrWCsiKSI7aWYoWD09PTIpe2lmKFopaWYoRSlmb3IobD0wO2w8RDtsKyspZm9yKGY9MDtmPHA7ZisrKUVbdl0mJihZW3ZdPU5bdl0pLHYrKztlbHNlIGZvcihsPTA7bDxEO2wrKylmb3IoZj0wO2Y8cDtmKyspWVt2XT1OW3ZdLHYrKztlLmNvdW50ZXIuY29uc3RhbnQrKyxlLnB0cis9TDtjb250aW51ZX1lbHNlIGlmKFg9PT0wKXtpZihaKXRocm93ImludGVncml0eSBpc3N1ZSI7aWYoZS5jb3VudGVyLnVuY29tcHJlc3NlZCsrLGUucHRyKz1MLFQ9RCpwKnUsUz1hLmJ5dGVMZW5ndGgtZS5wdHIsVD1UPFM/VDpTLEM9bmV3IEFycmF5QnVmZmVyKFQldT09PTA/VDpUK3UtVCV1KSxIPW5ldyBVaW50OEFycmF5KEMpLEguc2V0KG5ldyBVaW50OEFycmF5KGEsZS5wdHIsVCkpLE89bmV3IHIoQyksYj0wLEUpZm9yKGw9MDtsPEQ7bCsrKXtmb3IoZj0wO2Y8cDtmKyspRVt2XSYmKFlbdl09T1tiKytdKSx2Kys7dis9QX1lbHNlIGZvcihsPTA7bDxEO2wrKyl7Zm9yKGY9MDtmPHA7ZisrKVlbdisrXT1PW2IrK107dis9QX1lLnB0cis9Yip1fWVsc2UgaWYoUT1kLmdldERhdGFUeXBlVXNlZChaJiZjPDY/NDpjLHopLFI9ZC5nZXRPbmVQaXhlbChCLEwsUSxGKSxMKz1kLmdldERhdGFUeXBlU2l6ZShRKSxYPT09MylpZihlLnB0cis9TCxlLmNvdW50ZXIuY29uc3RhbnRvZmZzZXQrKyxFKWZvcihsPTA7bDxEO2wrKyl7Zm9yKGY9MDtmPHA7ZisrKUVbdl0mJihZW3ZdPVo/TWF0aC5taW4oRyxOW3ZdK1IpOlIpLHYrKzt2Kz1BfWVsc2UgZm9yKGw9MDtsPEQ7bCsrKXtmb3IoZj0wO2Y8cDtmKyspWVt2XT1aP01hdGgubWluKEcsTlt2XStSKTpSLHYrKzt2Kz1BfWVsc2UgaWYoZS5wdHIrPUwsZC5kZWNvZGVCaXRzKGEsZSwkLFIsaiksTD0wLFopaWYoRSlmb3IobD0wO2w8RDtsKyspe2ZvcihmPTA7ZjxwO2YrKylFW3ZdJiYoWVt2XT0kW0wrK10rTlt2XSksdisrO3YrPUF9ZWxzZSBmb3IobD0wO2w8RDtsKyspe2ZvcihmPTA7ZjxwO2YrKylZW3ZdPSRbTCsrXStOW3ZdLHYrKzt2Kz1BfWVsc2UgaWYoRSlmb3IobD0wO2w8RDtsKyspe2ZvcihmPTA7ZjxwO2YrKylFW3ZdJiYoWVt2XT0kW0wrK10pLHYrKzt2Kz1BfWVsc2UgZm9yKGw9MDtsPEQ7bCsrKXtmb3IoZj0wO2Y8cDtmKyspWVt2KytdPSRbTCsrXTt2Kz1BfX1xPjEmJiFzJiYoZS5waXhlbHMucmVzdWx0UGl4ZWxzPWQuc3dhcERpbWVuc2lvbk9yZGVyKGUucGl4ZWxzLnJlc3VsdFBpeGVscyxpLHEscikpfSxmb3JtYXRGaWxlSW5mbzpmdW5jdGlvbihhKXtyZXR1cm57ZmlsZUlkZW50aWZpZXJTdHJpbmc6YS5oZWFkZXJJbmZvLmZpbGVJZGVudGlmaWVyU3RyaW5nLGZpbGVWZXJzaW9uOmEuaGVhZGVySW5mby5maWxlVmVyc2lvbixpbWFnZVR5cGU6YS5oZWFkZXJJbmZvLmltYWdlVHlwZSxoZWlnaHQ6YS5oZWFkZXJJbmZvLmhlaWdodCx3aWR0aDphLmhlYWRlckluZm8ud2lkdGgsbnVtVmFsaWRQaXhlbDphLmhlYWRlckluZm8ubnVtVmFsaWRQaXhlbCxtaWNyb0Jsb2NrU2l6ZTphLmhlYWRlckluZm8ubWljcm9CbG9ja1NpemUsYmxvYlNpemU6YS5oZWFkZXJJbmZvLmJsb2JTaXplLG1heFpFcnJvcjphLmhlYWRlckluZm8ubWF4WkVycm9yLHBpeGVsVHlwZTpkLmdldFBpeGVsVHlwZShhLmhlYWRlckluZm8uaW1hZ2VUeXBlKSxlb2ZPZmZzZXQ6YS5lb2ZPZmZzZXQsbWFzazphLm1hc2s/e251bUJ5dGVzOmEubWFzay5udW1CeXRlc306bnVsbCxwaXhlbHM6e251bUJsb2Nrc1g6YS5waXhlbHMubnVtQmxvY2tzWCxudW1CbG9ja3NZOmEucGl4ZWxzLm51bUJsb2Nrc1ksbWF4VmFsdWU6YS5oZWFkZXJJbmZvLnpNYXgsbWluVmFsdWU6YS5oZWFkZXJJbmZvLnpNaW4sbm9EYXRhVmFsdWU6YS5ub0RhdGFWYWx1ZX19fSxjb25zdHJ1Y3RDb25zdGFudFN1cmZhY2U6ZnVuY3Rpb24oYSxlKXt2YXIgcj1hLmhlYWRlckluZm8uek1heCxzPWEuaGVhZGVySW5mby56TWluLHQ9YS5oZWFkZXJJbmZvLm1heFZhbHVlcyxuPWEuaGVhZGVySW5mby5udW1EaW1zLGg9YS5oZWFkZXJJbmZvLmhlaWdodCphLmhlYWRlckluZm8ud2lkdGgsaT0wLG89MCxjPTAsdT1hLnBpeGVscy5yZXN1bHRNYXNrLG09YS5waXhlbHMucmVzdWx0UGl4ZWxzO2lmKHUpaWYobj4xKXtpZihlKWZvcihpPTA7aTxuO2krKylmb3IoYz1pKmgscj10W2ldLG89MDtvPGg7bysrKXVbb10mJihtW2Mrb109cik7ZWxzZSBmb3Iobz0wO288aDtvKyspaWYodVtvXSlmb3IoYz1vKm4saT0wO2k8bjtpKyspbVtjK25dPXRbaV19ZWxzZSBmb3Iobz0wO288aDtvKyspdVtvXSYmKG1bb109cik7ZWxzZSBpZihuPjEmJnMhPT1yKWlmKGUpZm9yKGk9MDtpPG47aSsrKWZvcihjPWkqaCxyPXRbaV0sbz0wO288aDtvKyspbVtjK29dPXI7ZWxzZSBmb3Iobz0wO288aDtvKyspZm9yKGM9bypuLGk9MDtpPG47aSsrKW1bYytpXT10W2ldO2Vsc2UgZm9yKG89MDtvPGgqbjtvKyspbVtvXT1yfSxnZXREYXRhVHlwZUFycmF5OmZ1bmN0aW9uKGEpe3ZhciBlO3N3aXRjaChhKXtjYXNlIDA6ZT1JbnQ4QXJyYXk7YnJlYWs7Y2FzZSAxOmU9VWludDhBcnJheTticmVhaztjYXNlIDI6ZT1JbnQxNkFycmF5O2JyZWFrO2Nhc2UgMzplPVVpbnQxNkFycmF5O2JyZWFrO2Nhc2UgNDplPUludDMyQXJyYXk7YnJlYWs7Y2FzZSA1OmU9VWludDMyQXJyYXk7YnJlYWs7Y2FzZSA2OmU9RmxvYXQzMkFycmF5O2JyZWFrO2Nhc2UgNzplPUZsb2F0NjRBcnJheTticmVhaztkZWZhdWx0OmU9RmxvYXQzMkFycmF5fXJldHVybiBlfSxnZXRQaXhlbFR5cGU6ZnVuY3Rpb24oYSl7dmFyIGU7c3dpdGNoKGEpe2Nhc2UgMDplPSJTOCI7YnJlYWs7Y2FzZSAxOmU9IlU4IjticmVhaztjYXNlIDI6ZT0iUzE2IjticmVhaztjYXNlIDM6ZT0iVTE2IjticmVhaztjYXNlIDQ6ZT0iUzMyIjticmVhaztjYXNlIDU6ZT0iVTMyIjticmVhaztjYXNlIDY6ZT0iRjMyIjticmVhaztjYXNlIDc6ZT0iRjY0IjticmVhaztkZWZhdWx0OmU9IkYzMiJ9cmV0dXJuIGV9LGlzVmFsaWRQaXhlbFZhbHVlOmZ1bmN0aW9uKGEsZSl7aWYoZT09bnVsbClyZXR1cm4hMTt2YXIgcjtzd2l0Y2goYSl7Y2FzZSAwOnI9ZT49LTEyOCYmZTw9MTI3O2JyZWFrO2Nhc2UgMTpyPWU+PTAmJmU8PTI1NTticmVhaztjYXNlIDI6cj1lPj0tMzI3NjgmJmU8PTMyNzY3O2JyZWFrO2Nhc2UgMzpyPWU+PTAmJmU8PTY1NTM2O2JyZWFrO2Nhc2UgNDpyPWU+PS0yMTQ3NDgzNjQ4JiZlPD0yMTQ3NDgzNjQ3O2JyZWFrO2Nhc2UgNTpyPWU+PTAmJmU8PTQyOTQ5NjcyOTY7YnJlYWs7Y2FzZSA2OnI9ZT49LTM0MDI3OTk5Mzg3OTAxNDg0ZTIyJiZlPD0zNDAyNzk5OTM4NzkwMTQ4NGUyMjticmVhaztjYXNlIDc6cj1lPj0tMTc5NzY5MzEzNDg2MjMxNTdlMjkyJiZlPD0xNzk3NjkzMTM0ODYyMzE1N2UyOTI7YnJlYWs7ZGVmYXVsdDpyPSExfXJldHVybiByfSxnZXREYXRhVHlwZVNpemU6ZnVuY3Rpb24oYSl7dmFyIGU9MDtzd2l0Y2goYSl7Y2FzZSAwOmNhc2UgMTplPTE7YnJlYWs7Y2FzZSAyOmNhc2UgMzplPTI7YnJlYWs7Y2FzZSA0OmNhc2UgNTpjYXNlIDY6ZT00O2JyZWFrO2Nhc2UgNzplPTg7YnJlYWs7ZGVmYXVsdDplPWF9cmV0dXJuIGV9LGdldERhdGFUeXBlVXNlZDpmdW5jdGlvbihhLGUpe3ZhciByPWE7c3dpdGNoKGEpe2Nhc2UgMjpjYXNlIDQ6cj1hLWU7YnJlYWs7Y2FzZSAzOmNhc2UgNTpyPWEtMiplO2JyZWFrO2Nhc2UgNjplPT09MD9yPWE6ZT09PTE/cj0yOnI9MTticmVhaztjYXNlIDc6ZT09PTA/cj1hOnI9YS0yKmUrMTticmVhaztkZWZhdWx0OnI9YTticmVha31yZXR1cm4gcn0sZ2V0T25lUGl4ZWw6ZnVuY3Rpb24oYSxlLHIscyl7dmFyIHQ9MDtzd2l0Y2gocil7Y2FzZSAwOnQ9cy5nZXRJbnQ4KGUpO2JyZWFrO2Nhc2UgMTp0PXMuZ2V0VWludDgoZSk7YnJlYWs7Y2FzZSAyOnQ9cy5nZXRJbnQxNihlLCEwKTticmVhaztjYXNlIDM6dD1zLmdldFVpbnQxNihlLCEwKTticmVhaztjYXNlIDQ6dD1zLmdldEludDMyKGUsITApO2JyZWFrO2Nhc2UgNTp0PXMuZ2V0VUludDMyKGUsITApO2JyZWFrO2Nhc2UgNjp0PXMuZ2V0RmxvYXQzMihlLCEwKTticmVhaztjYXNlIDc6dD1zLmdldEZsb2F0NjQoZSwhMCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ0aGUgZGVjb2RlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoaXMgcGl4ZWwgdHlwZSJ9cmV0dXJuIHR9LHN3YXBEaW1lbnNpb25PcmRlcjpmdW5jdGlvbihhLGUscixzLHQpe3ZhciBuPTAsaD0wLGk9MCxvPTAsYz1hO2lmKHI+MSlpZihjPW5ldyBzKGUqciksdClmb3Iobj0wO248ZTtuKyspZm9yKG89bixpPTA7aTxyO2krKyxvKz1lKWNbb109YVtoKytdO2Vsc2UgZm9yKG49MDtuPGU7bisrKWZvcihvPW4saT0wO2k8cjtpKyssbys9ZSljW2grK109YVtvXTtyZXR1cm4gY319LHk9ZnVuY3Rpb24oYSxlLHIpe3RoaXMudmFsPWEsdGhpcy5sZWZ0PWUsdGhpcy5yaWdodD1yfSxWPXtkZWNvZGU6ZnVuY3Rpb24oYSxlKXtlPWV8fHt9O3ZhciByPWUubm9EYXRhVmFsdWUscz0wLHQ9e307aWYodC5wdHI9ZS5pbnB1dE9mZnNldHx8MCx0LnBpeGVscz17fSwhIWQucmVhZEhlYWRlckluZm8oYSx0KSl7dmFyIG49dC5oZWFkZXJJbmZvLGg9bi5maWxlVmVyc2lvbixpPWQuZ2V0RGF0YVR5cGVBcnJheShuLmltYWdlVHlwZSk7aWYoaD41KXRocm93InVuc3VwcG9ydGVkIGxlcmMgdmVyc2lvbiAyLiIraDtkLnJlYWRNYXNrKGEsdCksbi5udW1WYWxpZFBpeGVsIT09bi53aWR0aCpuLmhlaWdodCYmIXQucGl4ZWxzLnJlc3VsdE1hc2smJih0LnBpeGVscy5yZXN1bHRNYXNrPWUubWFza0RhdGEpO3ZhciBvPW4ud2lkdGgqbi5oZWlnaHQ7dC5waXhlbHMucmVzdWx0UGl4ZWxzPW5ldyBpKG8qbi5udW1EaW1zKSx0LmNvdW50ZXI9e29uZXN3ZWVwOjAsdW5jb21wcmVzc2VkOjAsbHV0OjAsYml0c3R1ZmZlcjowLGNvbnN0YW50OjAsY29uc3RhbnRvZmZzZXQ6MH07dmFyIGM9IWUucmV0dXJuUGl4ZWxJbnRlcmxlYXZlZERpbXM7aWYobi5udW1WYWxpZFBpeGVsIT09MClpZihuLnpNYXg9PT1uLnpNaW4pZC5jb25zdHJ1Y3RDb25zdGFudFN1cmZhY2UodCxjKTtlbHNlIGlmKGg+PTQmJmQuY2hlY2tNaW5NYXhSYW5nZXMoYSx0KSlkLmNvbnN0cnVjdENvbnN0YW50U3VyZmFjZSh0LGMpO2Vsc2V7dmFyIHU9bmV3IERhdGFWaWV3KGEsdC5wdHIsMiksbT11LmdldFVpbnQ4KDApO2lmKHQucHRyKyssbSlkLnJlYWREYXRhT25lU3dlZXAoYSx0LGksYyk7ZWxzZSBpZihoPjEmJm4uaW1hZ2VUeXBlPD0xJiZNYXRoLmFicyhuLm1heFpFcnJvci0uNSk8MWUtNSl7dmFyIHc9dS5nZXRVaW50OCgxKTtpZih0LnB0cisrLHQuZW5jb2RlTW9kZT13LHc+Mnx8aDw0JiZ3PjEpdGhyb3ciSW52YWxpZCBIdWZmbWFuIGZsYWcgIit3O3c/ZC5yZWFkSHVmZm1hbihhLHQsaSxjKTpkLnJlYWRUaWxlcyhhLHQsaSxjKX1lbHNlIGQucmVhZFRpbGVzKGEsdCxpLGMpfXQuZW9mT2Zmc2V0PXQucHRyO3ZhciBsO2UuaW5wdXRPZmZzZXQ/KGw9dC5oZWFkZXJJbmZvLmJsb2JTaXplK2UuaW5wdXRPZmZzZXQtdC5wdHIsTWF0aC5hYnMobCk+PTEmJih0LmVvZk9mZnNldD1lLmlucHV0T2Zmc2V0K3QuaGVhZGVySW5mby5ibG9iU2l6ZSkpOihsPXQuaGVhZGVySW5mby5ibG9iU2l6ZS10LnB0cixNYXRoLmFicyhsKT49MSYmKHQuZW9mT2Zmc2V0PXQuaGVhZGVySW5mby5ibG9iU2l6ZSkpO3ZhciBmPXt3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodCxwaXhlbERhdGE6dC5waXhlbHMucmVzdWx0UGl4ZWxzLG1pblZhbHVlOm4uek1pbixtYXhWYWx1ZTpuLnpNYXgsdmFsaWRQaXhlbENvdW50Om4ubnVtVmFsaWRQaXhlbCxkaW1Db3VudDpuLm51bURpbXMsZGltU3RhdHM6e21pblZhbHVlczpuLm1pblZhbHVlcyxtYXhWYWx1ZXM6bi5tYXhWYWx1ZXN9LG1hc2tEYXRhOnQucGl4ZWxzLnJlc3VsdE1hc2t9O2lmKHQucGl4ZWxzLnJlc3VsdE1hc2smJmQuaXNWYWxpZFBpeGVsVmFsdWUobi5pbWFnZVR5cGUscikpe3ZhciBnPXQucGl4ZWxzLnJlc3VsdE1hc2s7Zm9yKHM9MDtzPG87cysrKWdbc118fChmLnBpeGVsRGF0YVtzXT1yKTtmLm5vRGF0YVZhbHVlPXJ9cmV0dXJuIHQubm9EYXRhVmFsdWU9cixlLnJldHVybkZpbGVJbmZvJiYoZi5maWxlSW5mbz1kLmZvcm1hdEZpbGVJbmZvKHQpKSxmfX0sZ2V0QmFuZENvdW50OmZ1bmN0aW9uKGEpe3ZhciBlPTAscj0wLHM9e307Zm9yKHMucHRyPTAscy5waXhlbHM9e307cjxhLmJ5dGVMZW5ndGgtNTg7KWQucmVhZEhlYWRlckluZm8oYSxzKSxyKz1zLmhlYWRlckluZm8uYmxvYlNpemUsZSsrLHMucHRyPXI7cmV0dXJuIGV9fTtyZXR1cm4gVn0oKTt2YXIgdGU9ZnVuY3Rpb24oKXt2YXIgaz1uZXcgQXJyYXlCdWZmZXIoNCksZD1uZXcgVWludDhBcnJheShrKSx5PW5ldyBVaW50MzJBcnJheShrKTtyZXR1cm4geVswXT0xLGRbMF09PT0xfSgpLGFlPXtkZWNvZGU6ZnVuY3Rpb24oayxkKXtpZighdGUpdGhyb3ciQmlnIGVuZGlhbiBzeXN0ZW0gaXMgbm90IHN1cHBvcnRlZC4iO2Q9ZHx8e307dmFyIHk9ZC5pbnB1dE9mZnNldHx8MCxWPW5ldyBVaW50OEFycmF5KGsseSwxMCksYT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsViksZSxyO2lmKGEudHJpbSgpPT09IkNudFpJbWFnZSIpZT1uZSxyPTE7ZWxzZSBpZihhLnN1YnN0cmluZygwLDUpPT09IkxlcmMyIillPWllLHI9MjtlbHNlIHRocm93IlVuZXhwZWN0ZWQgZmlsZSBpZGVudGlmaWVyIHN0cmluZzogIithO2Zvcih2YXIgcz0wLHQ9ay5ieXRlTGVuZ3RoLTEwLG4saD1bXSxpLG8sYz17d2lkdGg6MCxoZWlnaHQ6MCxwaXhlbHM6W10scGl4ZWxUeXBlOmQucGl4ZWxUeXBlLG1hc2s6bnVsbCxzdGF0aXN0aWNzOltdfSx1PTA7eTx0Oyl7dmFyIG09ZS5kZWNvZGUoayx7aW5wdXRPZmZzZXQ6eSxlbmNvZGVkTWFza0RhdGE6bixtYXNrRGF0YTpvLHJldHVybk1hc2s6cz09PTAscmV0dXJuRW5jb2RlZE1hc2s6cz09PTAscmV0dXJuRmlsZUluZm86ITAscmV0dXJuUGl4ZWxJbnRlcmxlYXZlZERpbXM6ZC5yZXR1cm5QaXhlbEludGVybGVhdmVkRGltcyxwaXhlbFR5cGU6ZC5waXhlbFR5cGV8fG51bGwsbm9EYXRhVmFsdWU6ZC5ub0RhdGFWYWx1ZXx8bnVsbH0pO3k9bS5maWxlSW5mby5lb2ZPZmZzZXQsbz1tLm1hc2tEYXRhLHM9PT0wJiYobj1tLmVuY29kZWRNYXNrRGF0YSxjLndpZHRoPW0ud2lkdGgsYy5oZWlnaHQ9bS5oZWlnaHQsYy5kaW1Db3VudD1tLmRpbUNvdW50fHwxLGMucGl4ZWxUeXBlPW0ucGl4ZWxUeXBlfHxtLmZpbGVJbmZvLnBpeGVsVHlwZSxjLm1hc2s9bykscj4xJiYobyYmaC5wdXNoKG8pLG0uZmlsZUluZm8ubWFzayYmbS5maWxlSW5mby5tYXNrLm51bUJ5dGVzPjAmJnUrKykscysrLGMucGl4ZWxzLnB1c2gobS5waXhlbERhdGEpLGMuc3RhdGlzdGljcy5wdXNoKHttaW5WYWx1ZTptLm1pblZhbHVlLG1heFZhbHVlOm0ubWF4VmFsdWUsbm9EYXRhVmFsdWU6bS5ub0RhdGFWYWx1ZSxkaW1TdGF0czptLmRpbVN0YXRzfSl9dmFyIHcsbCxmO2lmKHI+MSYmdT4xKXtmb3IoZj1jLndpZHRoKmMuaGVpZ2h0LGMuYmFuZE1hc2tzPWgsbz1uZXcgVWludDhBcnJheShmKSxvLnNldChoWzBdKSx3PTE7dzxoLmxlbmd0aDt3KyspZm9yKGk9aFt3XSxsPTA7bDxmO2wrKylvW2xdPW9bbF0maVtsXTtjLm1hc2tEYXRhPW99cmV0dXJuIGN9fTtjb25zdCBzZT17MDo3ZTMsMTo2ZTMsMjo1ZTMsMzo0ZTMsNDozZTMsNToyNTAwLDY6MmUzLDc6MTUwMCw4OjgwMCw5OjUwMCwxMDoyMDAsMTE6MTAwLDEyOjQwLDEzOjEyLDE0OjUsMTU6MiwxNjoxLDE3Oi41LDE4Oi4yLDE5Oi4xLDIwOi4wMX07ZnVuY3Rpb24gZmUoayl7Y29uc3R7aGVpZ2h0OmQsd2lkdGg6eSxwaXhlbHM6Vn09YWUuZGVjb2RlKGspLGE9bmV3IEZsb2F0MzJBcnJheShkKnkpO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV09VlswXVtlXTtyZXR1cm57YXJyYXk6YSx3aWR0aDp5LGhlaWdodDpkfX1mdW5jdGlvbiBvZShrLGQseSl7bGV0IFY9ZmUoayk7eVsyXS15WzBdPDEmJihWPWxlKFYseSkpO2NvbnN0e2FycmF5OmEsd2lkdGg6ZX09VixzPW5ldyBlZShlKS5jcmVhdGVUaWxlKGEpLHQ9c2VbZF18fDA7cmV0dXJuIHMuZ2V0R2VvbWV0cnlEYXRhKHQpfWZ1bmN0aW9uIGxlKGssZCl7ZnVuY3Rpb24geShzLHQsbixoLGksbyxjLHUpe2NvbnN0IG09bmV3IEZsb2F0MzJBcnJheShpKm8pO2ZvcihsZXQgbD0wO2w8bztsKyspZm9yKGxldCBmPTA7ZjxpO2YrKyl7Y29uc3QgZz0obCtoKSp0KyhmK24pLE09bCppK2Y7bVtNXT1zW2ddfWNvbnN0IHc9bmV3IEZsb2F0MzJBcnJheSh1KmMpO2ZvcihsZXQgbD0wO2w8dTtsKyspZm9yKGxldCBmPTA7ZjxjO2YrKyl7Y29uc3QgZz1sKnUrZixNPU1hdGgucm91bmQoZipvL3UpLHA9TWF0aC5yb3VuZChsKmkvYykqaStNO3dbZ109bVtwXX1yZXR1cm4gd31jb25zdCBWPXVlKGQsay53aWR0aCksYT1WLnN3KzEsZT1WLnNoKzE7cmV0dXJue2FycmF5Onkoay5hcnJheSxrLndpZHRoLFYuc3gsVi5zeSxWLnN3LFYuc2gsYSxlKSx3aWR0aDphLGhlaWdodDplfX1mdW5jdGlvbiB1ZShrLGQpe2NvbnN0IHk9TWF0aC5mbG9vcihrWzBdKmQpLFY9TWF0aC5mbG9vcihrWzFdKmQpLGE9TWF0aC5mbG9vcigoa1syXS1rWzBdKSpkKSxlPU1hdGguZmxvb3IoKGtbM10ta1sxXSkqZCk7cmV0dXJue3N4Onksc3k6VixzdzphLHNoOmV9fXNlbGYub25tZXNzYWdlPWs9Pntjb25zdCBkPWsuZGF0YSx5PW9lKGQuZGVtRGF0YSxkLnosZC5jbGlwQm91bmRzKTtzZWxmLnBvc3RNZXNzYWdlKHkpfX0pKCk7Cg==",h_=r=>Uint8Array.from(atob(r),e=>e.charCodeAt(0)),xh=typeof self<"u"&&self.Blob&&new Blob([h_(bh)],{type:"text/javascript;charset=utf-8"});function u_(r){let e;try{if(e=xh&&(self.URL||self.webkitURL).createObjectURL(xh),!e)throw"";const t=new Worker(e,{name:r?.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;base64,"+bh,{name:r?.name})}finally{e&&(self.URL||self.webkitURL).revokeObjectURL(e)}}const d_=function(){var r={};r.defaultNoDataValue=-34027999387901484e22,r.decode=function(a,c){c=c||{};var h=c.encodedMaskData||c.encodedMaskData===null,d=n(a,c.inputOffset||0,h),m=c.noDataValue!==null?c.noDataValue:r.defaultNoDataValue,f=e(d,c.pixelType||Float32Array,c.encodedMaskData,m,c.returnMask),g={width:d.width,height:d.height,pixelData:f.resultPixels,minValue:f.minValue,maxValue:d.pixels.maxValue,noDataValue:m};return f.resultMask&&(g.maskData=f.resultMask),c.returnEncodedMask&&d.mask&&(g.encodedMaskData=d.mask.bitset?d.mask.bitset:null),c.returnFileInfo&&(g.fileInfo=t(d),c.computeUsedBitDepths&&(g.fileInfo.bitDepths=i(d))),g};var e=function(a,c,h,d,m){var f=0,g=a.pixels.numBlocksX,_=a.pixels.numBlocksY,w=Math.floor(a.width/g),b=Math.floor(a.height/_),x=2*a.maxZError,L=Number.MAX_VALUE,M;h=h||(a.mask?a.mask.bitset:null);var C,W;C=new c(a.width*a.height),m&&h&&(W=new Uint8Array(a.width*a.height));for(var D=new Float32Array(w*b),z,X,I=0;I<=_;I++){var U=I!==_?b:a.height%_;if(U!==0)for(var V=0;V<=g;V++){var G=V!==g?w:a.width%g;if(G!==0){var N=I*a.width*b+V*w,j=a.width-G,Y=a.pixels.blocks[f],H,Q,re;Y.encoding<2?(Y.encoding===0?H=Y.rawData:(s(Y.stuffedData,Y.bitsPerPixel,Y.numValidPixels,Y.offset,x,D,a.pixels.maxValue),H=D),Q=0):Y.encoding===2?re=0:re=Y.offset;var ne;if(h)for(X=0;X<U;X++){for(N&7&&(ne=h[N>>3],ne<<=N&7),z=0;z<G;z++)N&7||(ne=h[N>>3]),ne&128?(W&&(W[N]=1),M=Y.encoding<2?H[Q++]:re,L=L>M?M:L,C[N++]=M):(W&&(W[N]=0),C[N++]=d),ne<<=1;N+=j}else if(Y.encoding<2)for(X=0;X<U;X++){for(z=0;z<G;z++)M=H[Q++],L=L>M?M:L,C[N++]=M;N+=j}else for(L=L>re?re:L,X=0;X<U;X++){for(z=0;z<G;z++)C[N++]=re;N+=j}if(Y.encoding===1&&Q!==Y.numValidPixels)throw"Block and Mask do not match";f++}}}return{resultPixels:C,resultMask:W,minValue:L}},t=function(a){return{fileIdentifierString:a.fileIdentifierString,fileVersion:a.fileVersion,imageType:a.imageType,height:a.height,width:a.width,maxZError:a.maxZError,eofOffset:a.eofOffset,mask:a.mask?{numBlocksX:a.mask.numBlocksX,numBlocksY:a.mask.numBlocksY,numBytes:a.mask.numBytes,maxValue:a.mask.maxValue}:null,pixels:{numBlocksX:a.pixels.numBlocksX,numBlocksY:a.pixels.numBlocksY,numBytes:a.pixels.numBytes,maxValue:a.pixels.maxValue,noDataValue:a.noDataValue}}},i=function(a){for(var c=a.pixels.numBlocksX*a.pixels.numBlocksY,h={},d=0;d<c;d++){var m=a.pixels.blocks[d];m.encoding===0?h.float32=!0:m.encoding===1?h[m.bitsPerPixel]=!0:h[0]=!0}return Object.keys(h)},n=function(a,c,h){var d={},m=new Uint8Array(a,c,10);if(d.fileIdentifierString=String.fromCharCode.apply(null,m),d.fileIdentifierString.trim()!=="CntZImage")throw"Unexpected file identifier string: "+d.fileIdentifierString;c+=10;var f=new DataView(a,c,24);if(d.fileVersion=f.getInt32(0,!0),d.imageType=f.getInt32(4,!0),d.height=f.getUint32(8,!0),d.width=f.getUint32(12,!0),d.maxZError=f.getFloat64(16,!0),c+=24,!h)if(f=new DataView(a,c,16),d.mask={},d.mask.numBlocksY=f.getUint32(0,!0),d.mask.numBlocksX=f.getUint32(4,!0),d.mask.numBytes=f.getUint32(8,!0),d.mask.maxValue=f.getFloat32(12,!0),c+=16,d.mask.numBytes>0){var g=new Uint8Array(Math.ceil(d.width*d.height/8));f=new DataView(a,c,d.mask.numBytes);var _=f.getInt16(0,!0),w=2,b=0;do{if(_>0)for(;_--;)g[b++]=f.getUint8(w++);else{var x=f.getUint8(w++);for(_=-_;_--;)g[b++]=x}_=f.getInt16(w,!0),w+=2}while(w<d.mask.numBytes);if(_!==-32768||b<g.length)throw"Unexpected end of mask RLE encoding";d.mask.bitset=g,c+=d.mask.numBytes}else d.mask.numBytes|d.mask.numBlocksY|d.mask.maxValue||(d.mask.bitset=new Uint8Array(Math.ceil(d.width*d.height/8)));f=new DataView(a,c,16),d.pixels={},d.pixels.numBlocksY=f.getUint32(0,!0),d.pixels.numBlocksX=f.getUint32(4,!0),d.pixels.numBytes=f.getUint32(8,!0),d.pixels.maxValue=f.getFloat32(12,!0),c+=16;var L=d.pixels.numBlocksX,M=d.pixels.numBlocksY,C=L+(d.width%L>0?1:0),W=M+(d.height%M>0?1:0);d.pixels.blocks=new Array(C*W);for(var D=0,z=0;z<W;z++)for(var X=0;X<C;X++){var I=0,U=a.byteLength-c;f=new DataView(a,c,Math.min(10,U));var V={};d.pixels.blocks[D++]=V;var G=f.getUint8(0);if(I++,V.encoding=G&63,V.encoding>3)throw"Invalid block encoding ("+V.encoding+")";if(V.encoding===2){c++;continue}if(G!==0&&G!==2){if(G>>=6,V.offsetType=G,G===2)V.offset=f.getInt8(1),I++;else if(G===1)V.offset=f.getInt16(1,!0),I+=2;else if(G===0)V.offset=f.getFloat32(1,!0),I+=4;else throw"Invalid block offset type";if(V.encoding===1)if(G=f.getUint8(I),I++,V.bitsPerPixel=G&63,G>>=6,V.numValidPixelsType=G,G===2)V.numValidPixels=f.getUint8(I),I++;else if(G===1)V.numValidPixels=f.getUint16(I,!0),I+=2;else if(G===0)V.numValidPixels=f.getUint32(I,!0),I+=4;else throw"Invalid valid pixel count type"}if(c+=I,V.encoding!==3){var N,j;if(V.encoding===0){var Y=(d.pixels.numBytes-1)/4;if(Y!==Math.floor(Y))throw"uncompressed block has invalid length";N=new ArrayBuffer(Y*4),j=new Uint8Array(N),j.set(new Uint8Array(a,c,Y*4));var H=new Float32Array(N);V.rawData=H,c+=Y*4}else if(V.encoding===1){var Q=Math.ceil(V.numValidPixels*V.bitsPerPixel/8),re=Math.ceil(Q/4);N=new ArrayBuffer(re*4),j=new Uint8Array(N),j.set(new Uint8Array(a,c,Q)),V.stuffedData=new Uint32Array(N),c+=Q}}}return d.eofOffset=c,d},s=function(a,c,h,d,m,f,g){var _=(1<<c)-1,w=0,b,x=0,L,M,C=Math.ceil((g-d)/m),W=a.length*4-Math.ceil(c*h/8);for(a[a.length-1]<<=8*W,b=0;b<h;b++){if(x===0&&(M=a[w++],x=32),x>=c)L=M>>>x-c&_,x-=c;else{var D=c-x;L=(M&_)<<D&_,M=a[w++],x=32-D,L+=M>>>x}f[b]=L<C?d+L*m:g}return f};return r}(),f_=function(){var r={unstuff:function(n,s,a,c,h,d,m,f){var g=(1<<a)-1,_=0,w,b=0,x,L,M,C,W=n.length*4-Math.ceil(a*c/8);if(n[n.length-1]<<=8*W,h)for(w=0;w<c;w++)b===0&&(L=n[_++],b=32),b>=a?(x=L>>>b-a&g,b-=a):(M=a-b,x=(L&g)<<M&g,L=n[_++],b=32-M,x+=L>>>b),s[w]=h[x];else for(C=Math.ceil((f-d)/m),w=0;w<c;w++)b===0&&(L=n[_++],b=32),b>=a?(x=L>>>b-a&g,b-=a):(M=a-b,x=(L&g)<<M&g,L=n[_++],b=32-M,x+=L>>>b),s[w]=x<C?d+x*m:f},unstuffLUT:function(n,s,a,c,h,d){var m=(1<<s)-1,f=0,g=0,_=0,w=0,b=0,x,L=[],M=n.length*4-Math.ceil(s*a/8);n[n.length-1]<<=8*M;var C=Math.ceil((d-c)/h);for(g=0;g<a;g++)w===0&&(x=n[f++],w=32),w>=s?(b=x>>>w-s&m,w-=s):(_=s-w,b=(x&m)<<_&m,x=n[f++],w=32-_,b+=x>>>w),L[g]=b<C?c+b*h:d;return L.unshift(c),L},unstuff2:function(n,s,a,c,h,d,m,f){var g=(1<<a)-1,_=0,w,b=0,x=0,L,M,C;if(h)for(w=0;w<c;w++)b===0&&(M=n[_++],b=32,x=0),b>=a?(L=M>>>x&g,b-=a,x+=a):(C=a-b,L=M>>>x&g,M=n[_++],b=32-C,L|=(M&(1<<C)-1)<<a-C,x=C),s[w]=h[L];else{var W=Math.ceil((f-d)/m);for(w=0;w<c;w++)b===0&&(M=n[_++],b=32,x=0),b>=a?(L=M>>>x&g,b-=a,x+=a):(C=a-b,L=M>>>x&g,M=n[_++],b=32-C,L|=(M&(1<<C)-1)<<a-C,x=C),s[w]=L<W?d+L*m:f}return s},unstuffLUT2:function(n,s,a,c,h,d){var m=(1<<s)-1,f=0,g=0,_=0,w=0,b=0,x=0,L,M=[],C=Math.ceil((d-c)/h);for(g=0;g<a;g++)w===0&&(L=n[f++],w=32,x=0),w>=s?(b=L>>>x&m,w-=s,x+=s):(_=s-w,b=L>>>x&m,L=n[f++],w=32-_,b|=(L&(1<<_)-1)<<s-_,x=_),M[g]=b<C?c+b*h:d;return M.unshift(c),M},originalUnstuff:function(n,s,a,c){var h=(1<<a)-1,d=0,m,f=0,g,_,w,b=n.length*4-Math.ceil(a*c/8);for(n[n.length-1]<<=8*b,m=0;m<c;m++)f===0&&(_=n[d++],f=32),f>=a?(g=_>>>f-a&h,f-=a):(w=a-f,g=(_&h)<<w&h,_=n[d++],f=32-w,g+=_>>>f),s[m]=g;return s},originalUnstuff2:function(n,s,a,c){var h=(1<<a)-1,d=0,m,f=0,g=0,_,w,b;for(m=0;m<c;m++)f===0&&(w=n[d++],f=32,g=0),f>=a?(_=w>>>g&h,f-=a,g+=a):(b=a-f,_=w>>>g&h,w=n[d++],f=32-b,_|=(w&(1<<b)-1)<<a-b,g=b),s[m]=_;return s}},e={HUFFMAN_LUT_BITS_MAX:12,computeChecksumFletcher32:function(n){for(var s=65535,a=65535,c=n.length,h=Math.floor(c/2),d=0;h;){var m=h>=359?359:h;h-=m;do s+=n[d++]<<8,a+=s+=n[d++];while(--m);s=(s&65535)+(s>>>16),a=(a&65535)+(a>>>16)}return c&1&&(a+=s+=n[d]<<8),s=(s&65535)+(s>>>16),a=(a&65535)+(a>>>16),(a<<16|s)>>>0},readHeaderInfo:function(n,s){var a=s.ptr,c=new Uint8Array(n,a,6),h={};if(h.fileIdentifierString=String.fromCharCode.apply(null,c),h.fileIdentifierString.lastIndexOf("Lerc2",0)!==0)throw"Unexpected file identifier string (expect Lerc2 ): "+h.fileIdentifierString;a+=6;var d=new DataView(n,a,8),m=d.getInt32(0,!0);h.fileVersion=m,a+=4,m>=3&&(h.checksum=d.getUint32(4,!0),a+=4),d=new DataView(n,a,12),h.height=d.getUint32(0,!0),h.width=d.getUint32(4,!0),a+=8,m>=4?(h.numDims=d.getUint32(8,!0),a+=4):h.numDims=1,d=new DataView(n,a,40),h.numValidPixel=d.getUint32(0,!0),h.microBlockSize=d.getInt32(4,!0),h.blobSize=d.getInt32(8,!0),h.imageType=d.getInt32(12,!0),h.maxZError=d.getFloat64(16,!0),h.zMin=d.getFloat64(24,!0),h.zMax=d.getFloat64(32,!0),a+=40,s.headerInfo=h,s.ptr=a;var f,g;if(m>=3&&(g=m>=4?52:48,f=this.computeChecksumFletcher32(new Uint8Array(n,a-g,h.blobSize-14)),f!==h.checksum))throw"Checksum failed.";return!0},checkMinMaxRanges:function(n,s){var a=s.headerInfo,c=this.getDataTypeArray(a.imageType),h=a.numDims*this.getDataTypeSize(a.imageType),d=this.readSubArray(n,s.ptr,c,h),m=this.readSubArray(n,s.ptr+h,c,h);s.ptr+=2*h;var f,g=!0;for(f=0;f<a.numDims;f++)if(d[f]!==m[f]){g=!1;break}return a.minValues=d,a.maxValues=m,g},readSubArray:function(n,s,a,c){var h;if(a===Uint8Array)h=new Uint8Array(n,s,c);else{var d=new ArrayBuffer(c),m=new Uint8Array(d);m.set(new Uint8Array(n,s,c)),h=new a(d)}return h},readMask:function(n,s){var a=s.ptr,c=s.headerInfo,h=c.width*c.height,d=c.numValidPixel,m=new DataView(n,a,4),f={};if(f.numBytes=m.getUint32(0,!0),a+=4,(d===0||h===d)&&f.numBytes!==0)throw"invalid mask";var g,_;if(d===0)g=new Uint8Array(Math.ceil(h/8)),f.bitset=g,_=new Uint8Array(h),s.pixels.resultMask=_,a+=f.numBytes;else if(f.numBytes>0){g=new Uint8Array(Math.ceil(h/8)),m=new DataView(n,a,f.numBytes);var w=m.getInt16(0,!0),b=2,x=0,L=0;do{if(w>0)for(;w--;)g[x++]=m.getUint8(b++);else for(L=m.getUint8(b++),w=-w;w--;)g[x++]=L;w=m.getInt16(b,!0),b+=2}while(b<f.numBytes);if(w!==-32768||x<g.length)throw"Unexpected end of mask RLE encoding";_=new Uint8Array(h);var M=0,C=0;for(C=0;C<h;C++)C&7?(M=g[C>>3],M<<=C&7):M=g[C>>3],M&128&&(_[C]=1);s.pixels.resultMask=_,f.bitset=g,a+=f.numBytes}return s.ptr=a,s.mask=f,!0},readDataOneSweep:function(n,s,a,c){var h=s.ptr,d=s.headerInfo,m=d.numDims,f=d.width*d.height,g=d.imageType,_=d.numValidPixel*e.getDataTypeSize(g)*m,w,b=s.pixels.resultMask;if(a===Uint8Array)w=new Uint8Array(n,h,_);else{var x=new ArrayBuffer(_),L=new Uint8Array(x);L.set(new Uint8Array(n,h,_)),w=new a(x)}if(w.length===f*m)c?s.pixels.resultPixels=e.swapDimensionOrder(w,f,m,a,!0):s.pixels.resultPixels=w;else{s.pixels.resultPixels=new a(f*m);var M=0,C=0,W=0,D=0;if(m>1){if(c){for(C=0;C<f;C++)if(b[C])for(D=C,W=0;W<m;W++,D+=f)s.pixels.resultPixels[D]=w[M++]}else for(C=0;C<f;C++)if(b[C])for(D=C*m,W=0;W<m;W++)s.pixels.resultPixels[D+W]=w[M++]}else for(C=0;C<f;C++)b[C]&&(s.pixels.resultPixels[C]=w[M++])}return h+=_,s.ptr=h,!0},readHuffmanTree:function(n,s){var a=this.HUFFMAN_LUT_BITS_MAX,c=new DataView(n,s.ptr,16);s.ptr+=16;var h=c.getInt32(0,!0);if(h<2)throw"unsupported Huffman version";var d=c.getInt32(4,!0),m=c.getInt32(8,!0),f=c.getInt32(12,!0);if(m>=f)return!1;var g=new Uint32Array(f-m);e.decodeBits(n,s,g);var _=[],w,b,x,L;for(w=m;w<f;w++)b=w-(w<d?0:d),_[b]={first:g[w-m],second:null};var M=n.byteLength-s.ptr,C=Math.ceil(M/4),W=new ArrayBuffer(C*4),D=new Uint8Array(W);D.set(new Uint8Array(n,s.ptr,M));var z=new Uint32Array(W),X=0,I,U=0;for(I=z[0],w=m;w<f;w++)b=w-(w<d?0:d),L=_[b].first,L>0&&(_[b].second=I<<X>>>32-L,32-X>=L?(X+=L,X===32&&(X=0,U++,I=z[U])):(X+=L-32,U++,I=z[U],_[b].second|=I>>>32-X));var V=0,G=0,N=new t;for(w=0;w<_.length;w++)_[w]!==void 0&&(V=Math.max(V,_[w].first));V>=a?G=a:G=V;var j=[],Y,H,Q,re,ne,le;for(w=m;w<f;w++)if(b=w-(w<d?0:d),L=_[b].first,L>0)if(Y=[L,b],L<=G)for(H=_[b].second<<G-L,Q=1<<G-L,x=0;x<Q;x++)j[H|x]=Y;else for(H=_[b].second,le=N,re=L-1;re>=0;re--)ne=H>>>re&1,ne?(le.right||(le.right=new t),le=le.right):(le.left||(le.left=new t),le=le.left),re===0&&!le.val&&(le.val=Y[1]);return{decodeLut:j,numBitsLUTQick:G,numBitsLUT:V,tree:N,stuffedData:z,srcPtr:U,bitPos:X}},readHuffman:function(n,s,a,c){var h=s.headerInfo,d=h.numDims,m=s.headerInfo.height,f=s.headerInfo.width,g=f*m,_=this.readHuffmanTree(n,s),w=_.decodeLut,b=_.tree,x=_.stuffedData,L=_.srcPtr,M=_.bitPos,C=_.numBitsLUTQick,W=_.numBitsLUT,D=s.headerInfo.imageType===0?128:0,z,X,I,U=s.pixels.resultMask,V,G,N,j,Y,H,Q,re=0;M>0&&(L++,M=0);var ne=x[L],le=s.encodeMode===1,de=new a(g*d),ge=de,fe;if(d<2||le){for(fe=0;fe<d;fe++)if(d>1&&(ge=new a(de.buffer,g*fe,g),re=0),s.headerInfo.numValidPixel===f*m)for(H=0,j=0;j<m;j++)for(Y=0;Y<f;Y++,H++){if(X=0,V=ne<<M>>>32-C,G=V,32-M<C&&(V|=x[L+1]>>>64-M-C,G=V),w[G])X=w[G][1],M+=w[G][0];else for(V=ne<<M>>>32-W,G=V,32-M<W&&(V|=x[L+1]>>>64-M-W,G=V),z=b,Q=0;Q<W;Q++)if(N=V>>>W-Q-1&1,z=N?z.right:z.left,!(z.left||z.right)){X=z.val,M=M+Q+1;break}M>=32&&(M-=32,L++,ne=x[L]),I=X-D,le?(Y>0?I+=re:j>0?I+=ge[H-f]:I+=re,I&=255,ge[H]=I,re=I):ge[H]=I}else for(H=0,j=0;j<m;j++)for(Y=0;Y<f;Y++,H++)if(U[H]){if(X=0,V=ne<<M>>>32-C,G=V,32-M<C&&(V|=x[L+1]>>>64-M-C,G=V),w[G])X=w[G][1],M+=w[G][0];else for(V=ne<<M>>>32-W,G=V,32-M<W&&(V|=x[L+1]>>>64-M-W,G=V),z=b,Q=0;Q<W;Q++)if(N=V>>>W-Q-1&1,z=N?z.right:z.left,!(z.left||z.right)){X=z.val,M=M+Q+1;break}M>=32&&(M-=32,L++,ne=x[L]),I=X-D,le?(Y>0&&U[H-1]?I+=re:j>0&&U[H-f]?I+=ge[H-f]:I+=re,I&=255,ge[H]=I,re=I):ge[H]=I}}else for(H=0,j=0;j<m;j++)for(Y=0;Y<f;Y++)if(H=j*f+Y,!U||U[H])for(fe=0;fe<d;fe++,H+=g){if(X=0,V=ne<<M>>>32-C,G=V,32-M<C&&(V|=x[L+1]>>>64-M-C,G=V),w[G])X=w[G][1],M+=w[G][0];else for(V=ne<<M>>>32-W,G=V,32-M<W&&(V|=x[L+1]>>>64-M-W,G=V),z=b,Q=0;Q<W;Q++)if(N=V>>>W-Q-1&1,z=N?z.right:z.left,!(z.left||z.right)){X=z.val,M=M+Q+1;break}M>=32&&(M-=32,L++,ne=x[L]),I=X-D,ge[H]=I}s.ptr=s.ptr+(L+1)*4+(M>0?4:0),s.pixels.resultPixels=de,d>1&&!c&&(s.pixels.resultPixels=e.swapDimensionOrder(de,g,d,a))},decodeBits:function(n,s,a,c,h){{var d=s.headerInfo,m=d.fileVersion,f=0,g=n.byteLength-s.ptr>=5?5:n.byteLength-s.ptr,_=new DataView(n,s.ptr,g),w=_.getUint8(0);f++;var b=w>>6,x=b===0?4:3-b,L=(w&32)>0,M=w&31,C=0;if(x===1)C=_.getUint8(f),f++;else if(x===2)C=_.getUint16(f,!0),f+=2;else if(x===4)C=_.getUint32(f,!0),f+=4;else throw"Invalid valid pixel count type";var W=2*d.maxZError,D,z,X,I,U,V,G,N,j,Y=d.numDims>1?d.maxValues[h]:d.zMax;if(L){for(s.counter.lut++,N=_.getUint8(f),f++,I=Math.ceil((N-1)*M/8),U=Math.ceil(I/4),z=new ArrayBuffer(U*4),X=new Uint8Array(z),s.ptr+=f,X.set(new Uint8Array(n,s.ptr,I)),G=new Uint32Array(z),s.ptr+=I,j=0;N-1>>>j;)j++;I=Math.ceil(C*j/8),U=Math.ceil(I/4),z=new ArrayBuffer(U*4),X=new Uint8Array(z),X.set(new Uint8Array(n,s.ptr,I)),D=new Uint32Array(z),s.ptr+=I,m>=3?V=r.unstuffLUT2(G,M,N-1,c,W,Y):V=r.unstuffLUT(G,M,N-1,c,W,Y),m>=3?r.unstuff2(D,a,j,C,V):r.unstuff(D,a,j,C,V)}else s.counter.bitstuffer++,j=M,s.ptr+=f,j>0&&(I=Math.ceil(C*j/8),U=Math.ceil(I/4),z=new ArrayBuffer(U*4),X=new Uint8Array(z),X.set(new Uint8Array(n,s.ptr,I)),D=new Uint32Array(z),s.ptr+=I,m>=3?c==null?r.originalUnstuff2(D,a,j,C):r.unstuff2(D,a,j,C,!1,c,W,Y):c==null?r.originalUnstuff(D,a,j,C):r.unstuff(D,a,j,C,!1,c,W,Y))}},readTiles:function(n,s,a,c){var h=s.headerInfo,d=h.width,m=h.height,f=d*m,g=h.microBlockSize,_=h.imageType,w=e.getDataTypeSize(_),b=Math.ceil(d/g),x=Math.ceil(m/g);s.pixels.numBlocksY=x,s.pixels.numBlocksX=b,s.pixels.ptr=0;var L=0,M=0,C=0,W=0,D=0,z=0,X=0,I=0,U=0,V=0,G=0,N=0,j=0,Y=0,H=0,Q=0,re,ne,le,de,ge,fe,Se=new a(g*g),st=m%g||g,ot=d%g||g,pt,$e,Re=h.numDims,je,at=s.pixels.resultMask,Xe=s.pixels.resultPixels,Ft=h.fileVersion,Rt=Ft>=5?14:15,Ce,lt=h.zMax,mt;for(C=0;C<x;C++)for(D=C!==x-1?g:st,W=0;W<b;W++)for(z=W!==b-1?g:ot,G=C*d*g+W*g,N=d-z,je=0;je<Re;je++){if(Re>1?(mt=Xe,G=C*d*g+W*g,Xe=new a(s.pixels.resultPixels.buffer,f*je*w,f),lt=h.maxValues[je]):mt=null,X=n.byteLength-s.ptr,re=new DataView(n,s.ptr,Math.min(10,X)),ne={},Q=0,I=re.getUint8(0),Q++,Ce=h.fileVersion>=5?I&4:0,U=I>>6&255,V=I>>2&Rt,V!==(W*g>>3&Rt)||Ce&&je===0)throw"integrity issue";if(fe=I&3,fe>3)throw s.ptr+=Q,"Invalid block encoding ("+fe+")";if(fe===2){if(Ce)if(at)for(L=0;L<D;L++)for(M=0;M<z;M++)at[G]&&(Xe[G]=mt[G]),G++;else for(L=0;L<D;L++)for(M=0;M<z;M++)Xe[G]=mt[G],G++;s.counter.constant++,s.ptr+=Q;continue}else if(fe===0){if(Ce)throw"integrity issue";if(s.counter.uncompressed++,s.ptr+=Q,j=D*z*w,Y=n.byteLength-s.ptr,j=j<Y?j:Y,le=new ArrayBuffer(j%w===0?j:j+w-j%w),de=new Uint8Array(le),de.set(new Uint8Array(n,s.ptr,j)),ge=new a(le),H=0,at)for(L=0;L<D;L++){for(M=0;M<z;M++)at[G]&&(Xe[G]=ge[H++]),G++;G+=N}else for(L=0;L<D;L++){for(M=0;M<z;M++)Xe[G++]=ge[H++];G+=N}s.ptr+=H*w}else if(pt=e.getDataTypeUsed(Ce&&_<6?4:_,U),$e=e.getOnePixel(ne,Q,pt,re),Q+=e.getDataTypeSize(pt),fe===3)if(s.ptr+=Q,s.counter.constantoffset++,at)for(L=0;L<D;L++){for(M=0;M<z;M++)at[G]&&(Xe[G]=Ce?Math.min(lt,mt[G]+$e):$e),G++;G+=N}else for(L=0;L<D;L++){for(M=0;M<z;M++)Xe[G]=Ce?Math.min(lt,mt[G]+$e):$e,G++;G+=N}else if(s.ptr+=Q,e.decodeBits(n,s,Se,$e,je),Q=0,Ce)if(at)for(L=0;L<D;L++){for(M=0;M<z;M++)at[G]&&(Xe[G]=Se[Q++]+mt[G]),G++;G+=N}else for(L=0;L<D;L++){for(M=0;M<z;M++)Xe[G]=Se[Q++]+mt[G],G++;G+=N}else if(at)for(L=0;L<D;L++){for(M=0;M<z;M++)at[G]&&(Xe[G]=Se[Q++]),G++;G+=N}else for(L=0;L<D;L++){for(M=0;M<z;M++)Xe[G++]=Se[Q++];G+=N}}Re>1&&!c&&(s.pixels.resultPixels=e.swapDimensionOrder(s.pixels.resultPixels,f,Re,a))},formatFileInfo:function(n){return{fileIdentifierString:n.headerInfo.fileIdentifierString,fileVersion:n.headerInfo.fileVersion,imageType:n.headerInfo.imageType,height:n.headerInfo.height,width:n.headerInfo.width,numValidPixel:n.headerInfo.numValidPixel,microBlockSize:n.headerInfo.microBlockSize,blobSize:n.headerInfo.blobSize,maxZError:n.headerInfo.maxZError,pixelType:e.getPixelType(n.headerInfo.imageType),eofOffset:n.eofOffset,mask:n.mask?{numBytes:n.mask.numBytes}:null,pixels:{numBlocksX:n.pixels.numBlocksX,numBlocksY:n.pixels.numBlocksY,maxValue:n.headerInfo.zMax,minValue:n.headerInfo.zMin,noDataValue:n.noDataValue}}},constructConstantSurface:function(n,s){var a=n.headerInfo.zMax,c=n.headerInfo.zMin,h=n.headerInfo.maxValues,d=n.headerInfo.numDims,m=n.headerInfo.height*n.headerInfo.width,f=0,g=0,_=0,w=n.pixels.resultMask,b=n.pixels.resultPixels;if(w)if(d>1){if(s)for(f=0;f<d;f++)for(_=f*m,a=h[f],g=0;g<m;g++)w[g]&&(b[_+g]=a);else for(g=0;g<m;g++)if(w[g])for(_=g*d,f=0;f<d;f++)b[_+d]=h[f]}else for(g=0;g<m;g++)w[g]&&(b[g]=a);else if(d>1&&c!==a)if(s)for(f=0;f<d;f++)for(_=f*m,a=h[f],g=0;g<m;g++)b[_+g]=a;else for(g=0;g<m;g++)for(_=g*d,f=0;f<d;f++)b[_+f]=h[f];else for(g=0;g<m*d;g++)b[g]=a},getDataTypeArray:function(n){var s;switch(n){case 0:s=Int8Array;break;case 1:s=Uint8Array;break;case 2:s=Int16Array;break;case 3:s=Uint16Array;break;case 4:s=Int32Array;break;case 5:s=Uint32Array;break;case 6:s=Float32Array;break;case 7:s=Float64Array;break;default:s=Float32Array}return s},getPixelType:function(n){var s;switch(n){case 0:s="S8";break;case 1:s="U8";break;case 2:s="S16";break;case 3:s="U16";break;case 4:s="S32";break;case 5:s="U32";break;case 6:s="F32";break;case 7:s="F64";break;default:s="F32"}return s},isValidPixelValue:function(n,s){if(s==null)return!1;var a;switch(n){case 0:a=s>=-128&&s<=127;break;case 1:a=s>=0&&s<=255;break;case 2:a=s>=-32768&&s<=32767;break;case 3:a=s>=0&&s<=65536;break;case 4:a=s>=-2147483648&&s<=2147483647;break;case 5:a=s>=0&&s<=4294967296;break;case 6:a=s>=-34027999387901484e22&&s<=34027999387901484e22;break;case 7:a=s>=-17976931348623157e292&&s<=17976931348623157e292;break;default:a=!1}return a},getDataTypeSize:function(n){var s=0;switch(n){case 0:case 1:s=1;break;case 2:case 3:s=2;break;case 4:case 5:case 6:s=4;break;case 7:s=8;break;default:s=n}return s},getDataTypeUsed:function(n,s){var a=n;switch(n){case 2:case 4:a=n-s;break;case 3:case 5:a=n-2*s;break;case 6:s===0?a=n:s===1?a=2:a=1;break;case 7:s===0?a=n:a=n-2*s+1;break;default:a=n;break}return a},getOnePixel:function(n,s,a,c){var h=0;switch(a){case 0:h=c.getInt8(s);break;case 1:h=c.getUint8(s);break;case 2:h=c.getInt16(s,!0);break;case 3:h=c.getUint16(s,!0);break;case 4:h=c.getInt32(s,!0);break;case 5:h=c.getUInt32(s,!0);break;case 6:h=c.getFloat32(s,!0);break;case 7:h=c.getFloat64(s,!0);break;default:throw"the decoder does not understand this pixel type"}return h},swapDimensionOrder:function(n,s,a,c,h){var d=0,m=0,f=0,g=0,_=n;if(a>1)if(_=new c(s*a),h)for(d=0;d<s;d++)for(g=d,f=0;f<a;f++,g+=s)_[g]=n[m++];else for(d=0;d<s;d++)for(g=d,f=0;f<a;f++,g+=s)_[m++]=n[g];return _}},t=function(n,s,a){this.val=n,this.left=s,this.right=a},i={decode:function(n,s){s=s||{};var a=s.noDataValue,c=0,h={};if(h.ptr=s.inputOffset||0,h.pixels={},!!e.readHeaderInfo(n,h)){var d=h.headerInfo,m=d.fileVersion,f=e.getDataTypeArray(d.imageType);if(m>5)throw"unsupported lerc version 2."+m;e.readMask(n,h),d.numValidPixel!==d.width*d.height&&!h.pixels.resultMask&&(h.pixels.resultMask=s.maskData);var g=d.width*d.height;h.pixels.resultPixels=new f(g*d.numDims),h.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0};var _=!s.returnPixelInterleavedDims;if(d.numValidPixel!==0)if(d.zMax===d.zMin)e.constructConstantSurface(h,_);else if(m>=4&&e.checkMinMaxRanges(n,h))e.constructConstantSurface(h,_);else{var w=new DataView(n,h.ptr,2),b=w.getUint8(0);if(h.ptr++,b)e.readDataOneSweep(n,h,f,_);else if(m>1&&d.imageType<=1&&Math.abs(d.maxZError-.5)<1e-5){var x=w.getUint8(1);if(h.ptr++,h.encodeMode=x,x>2||m<4&&x>1)throw"Invalid Huffman flag "+x;x?e.readHuffman(n,h,f,_):e.readTiles(n,h,f,_)}else e.readTiles(n,h,f,_)}h.eofOffset=h.ptr;var L;s.inputOffset?(L=h.headerInfo.blobSize+s.inputOffset-h.ptr,Math.abs(L)>=1&&(h.eofOffset=s.inputOffset+h.headerInfo.blobSize)):(L=h.headerInfo.blobSize-h.ptr,Math.abs(L)>=1&&(h.eofOffset=h.headerInfo.blobSize));var M={width:d.width,height:d.height,pixelData:h.pixels.resultPixels,minValue:d.zMin,maxValue:d.zMax,validPixelCount:d.numValidPixel,dimCount:d.numDims,dimStats:{minValues:d.minValues,maxValues:d.maxValues},maskData:h.pixels.resultMask};if(h.pixels.resultMask&&e.isValidPixelValue(d.imageType,a)){var C=h.pixels.resultMask;for(c=0;c<g;c++)C[c]||(M.pixelData[c]=a);M.noDataValue=a}return h.noDataValue=a,s.returnFileInfo&&(M.fileInfo=e.formatFileInfo(h)),M}},getBandCount:function(n){var s=0,a=0,c={};for(c.ptr=0,c.pixels={};a<n.byteLength-58;)e.readHeaderInfo(n,c),a+=c.headerInfo.blobSize,s++,c.ptr=a;return s}};return i}();var p_=function(){var r=new ArrayBuffer(4),e=new Uint8Array(r),t=new Uint32Array(r);return t[0]=1,e[0]===1}(),m_={decode:function(r,e){if(!p_)throw"Big endian system is not supported.";e=e||{};var t=e.inputOffset||0,i=new Uint8Array(r,t,10),n=String.fromCharCode.apply(null,i),s,a;if(n.trim()==="CntZImage")s=d_,a=1;else if(n.substring(0,5)==="Lerc2")s=f_,a=2;else throw"Unexpected file identifier string: "+n;for(var c=0,h=r.byteLength-10,d,m=[],f,g,_={width:0,height:0,pixels:[],pixelType:e.pixelType,mask:null,statistics:[]},w=0;t<h;){var b=s.decode(r,{inputOffset:t,encodedMaskData:d,maskData:g,returnMask:c===0,returnEncodedMask:c===0,returnFileInfo:!0,returnPixelInterleavedDims:e.returnPixelInterleavedDims,pixelType:e.pixelType||null,noDataValue:e.noDataValue||null});t=b.fileInfo.eofOffset,g=b.maskData,c===0&&(d=b.encodedMaskData,_.width=b.width,_.height=b.height,_.dimCount=b.dimCount||1,_.pixelType=b.pixelType||b.fileInfo.pixelType,_.mask=g),a>1&&(g&&m.push(g),b.fileInfo.mask&&b.fileInfo.mask.numBytes>0&&w++),c++,_.pixels.push(b.pixelData),_.statistics.push({minValue:b.minValue,maxValue:b.maxValue,noDataValue:b.noDataValue,dimStats:b.dimStats})}var x,L,M;if(a>1&&w>1){for(M=_.width*_.height,_.bandMasks=m,g=new Uint8Array(M),g.set(m[0]),x=1;x<m.length;x++)for(f=m[x],L=0;L<M;L++)g[L]=g[L]&f[L];_.maskData=g}return _}};const g_={0:7e3,1:6e3,2:5e3,3:4e3,4:3e3,5:2500,6:2e3,7:1500,8:800,9:500,10:200,11:100,12:40,13:12,14:5,15:2,16:1,17:.5,18:.2,19:.1,20:.01};function y_(r){const{height:e,width:t,pixels:i}=m_.decode(r),n=new Float32Array(e*t);for(let s=0;s<n.length;s++)n[s]=i[0][s];return{array:n,width:t,height:e}}function __(r,e,t){let i=y_(r);t[2]-t[0]<1&&(i=v_(i,t));const{array:n,width:s}=i,c=new mh(s).createTile(n),h=g_[e]||0;return c.getGeometryData(h)}function v_(r,e){function t(c,h,d,m,f,g,_,w){const b=new Float32Array(f*g);for(let L=0;L<g;L++)for(let M=0;M<f;M++){const C=(L+m)*h+(M+d),W=L*f+M;b[W]=c[C]}const x=new Float32Array(w*_);for(let L=0;L<w;L++)for(let M=0;M<_;M++){const C=L*w+M,W=Math.round(M*g/w),z=Math.round(L*f/_)*f+W;x[C]=b[z]}return x}const i=w_(e,r.width),n=i.sw+1,s=i.sh+1;return{array:t(r.array,r.width,i.sx,i.sy,i.sw,i.sh,n,s),width:n,height:s}}function w_(r,e){const t=Math.floor(r[0]*e),i=Math.floor(r[1]*e),n=Math.floor((r[2]-r[0])*e),s=Math.floor((r[3]-r[1])*e);return{sx:t,sy:i,sw:n,sh:s}}var b_=Object.defineProperty,x_=(r,e,t)=>e in r?b_(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Ps=(r,e,t)=>x_(r,typeof e!="symbol"?e+"":e,t);const M_=10;class S_ extends ua{constructor(){super(),Ps(this,"info",{version:"0.10.0",description:"Tile LERC terrain loader. It can load ArcGis-lerc format terrain data."}),Ps(this,"dataType","lerc"),Ps(this,"fileLoader",new p.FileLoader(De.manager)),Ps(this,"_workerPool",new $o(0)),this.fileLoader.setResponseType("arraybuffer"),this._workerPool.setWorkerCreator(()=>new u_)}async doLoad(e,t){this._workerPool.pool===0&&this._workerPool.setWorkerLimit(M_);const{z:i,bounds:n}=t,s=await this.fileLoader.loadAsync(e).catch(()=>new Float32Array(256*256)),a=__(s,i,n);return new jn().setData(a)}}ga(new S_);const Mh="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGModCl7cmV0dXJuIGEodC5kYXRhKX1mdW5jdGlvbiBhKHQpe2Z1bmN0aW9uIG4oZSx1KXtjb25zdCByPXUqNCxbaSxmLGcsbF09ZS5zbGljZShyLHIrNCk7cmV0dXJuIGw9PT0wPzA6LTFlNCsoaTw8MTZ8Zjw8OHxnKSouMX1jb25zdCBvPXQubGVuZ3RoPj4+MixzPW5ldyBGbG9hdDMyQXJyYXkobyk7Zm9yKGxldCBlPTA7ZTxvO2UrKylzW2VdPW4odCxlKTtyZXR1cm4gc31zZWxmLm9ubWVzc2FnZT10PT57Y29uc3Qgbj1jKHQuZGF0YS5pbWdEYXRhKTtzZWxmLnBvc3RNZXNzYWdlKG4pfX0pKCk7Cg==",L_=r=>Uint8Array.from(atob(r),e=>e.charCodeAt(0)),Sh=typeof self<"u"&&self.Blob&&new Blob([L_(Mh)],{type:"text/javascript;charset=utf-8"});function P_(r){let e;try{if(e=Sh&&(self.URL||self.webkitURL).createObjectURL(Sh),!e)throw"";const t=new Worker(e,{name:r?.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;base64,"+Mh,{name:r?.name})}finally{e&&(self.URL||self.webkitURL).revokeObjectURL(e)}}var C_=Object.defineProperty,T_=(r,e,t)=>e in r?C_(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Cs=(r,e,t)=>T_(r,typeof e!="symbol"?e+"":e,t);const G_=10;class W_ extends ua{constructor(){super(),Cs(this,"info",{version:"0.10.0",description:"Mapbox-RGB terrain loader, It can load Mapbox-RGB terrain data."}),Cs(this,"dataType","terrain-rgb"),Cs(this,"imageLoader",new p.ImageLoader(De.manager)),Cs(this,"_workerPool",new $o(0)),this._workerPool.setWorkerCreator(()=>new P_)}async doLoad(e,t){const i=await this.imageLoader.loadAsync(e).catch(h=>new Image),n=p.MathUtils.clamp((t.z+2)*3,2,64),s=Z_(i,t.bounds,n);let a;this._workerPool.pool===0&&this._workerPool.setWorkerLimit(G_),a=(await this._workerPool.postMessage({imgData:s},[s.data.buffer])).data;const c=new jn;return c.setData(a),c}}function Z_(r,e,t){const i=oa(e,r.width);t=Math.min(t,i.sw);const s=new OffscreenCanvas(t,t).getContext("2d");return s.imageSmoothingEnabled=!1,s.drawImage(r,i.sx,i.sy,i.sw,i.sh,0,0,t,t),s.getImageData(0,0,t,t)}ga(new W_);function Ei(r,e){this.x=r,this.y=e}Ei.prototype={clone(){return new Ei(this.x,this.y)},add(r){return this.clone()._add(r)},sub(r){return this.clone()._sub(r)},multByPoint(r){return this.clone()._multByPoint(r)},divByPoint(r){return this.clone()._divByPoint(r)},mult(r){return this.clone()._mult(r)},div(r){return this.clone()._div(r)},rotate(r){return this.clone()._rotate(r)},rotateAround(r,e){return this.clone()._rotateAround(r,e)},matMult(r){return this.clone()._matMult(r)},unit(){return this.clone()._unit()},perp(){return this.clone()._perp()},round(){return this.clone()._round()},mag(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals(r){return this.x===r.x&&this.y===r.y},dist(r){return Math.sqrt(this.distSqr(r))},distSqr(r){const e=r.x-this.x,t=r.y-this.y;return e*e+t*t},angle(){return Math.atan2(this.y,this.x)},angleTo(r){return Math.atan2(this.y-r.y,this.x-r.x)},angleWith(r){return this.angleWithSep(r.x,r.y)},angleWithSep(r,e){return Math.atan2(this.x*e-this.y*r,this.x*r+this.y*e)},_matMult(r){const e=r[0]*this.x+r[1]*this.y,t=r[2]*this.x+r[3]*this.y;return this.x=e,this.y=t,this},_add(r){return this.x+=r.x,this.y+=r.y,this},_sub(r){return this.x-=r.x,this.y-=r.y,this},_mult(r){return this.x*=r,this.y*=r,this},_div(r){return this.x/=r,this.y/=r,this},_multByPoint(r){return this.x*=r.x,this.y*=r.y,this},_divByPoint(r){return this.x/=r.x,this.y/=r.y,this},_unit(){return this._div(this.mag()),this},_perp(){const r=this.y;return this.y=this.x,this.x=-r,this},_rotate(r){const e=Math.cos(r),t=Math.sin(r),i=e*this.x-t*this.y,n=t*this.x+e*this.y;return this.x=i,this.y=n,this},_rotateAround(r,e){const t=Math.cos(r),i=Math.sin(r),n=e.x+t*(this.x-e.x)-i*(this.y-e.y),s=e.y+i*(this.x-e.x)+t*(this.y-e.y);return this.x=n,this.y=s,this},_round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},constructor:Ei},Ei.convert=function(r){if(r instanceof Ei)return r;if(Array.isArray(r))return new Ei(+r[0],+r[1]);if(r.x!==void 0&&r.y!==void 0)return new Ei(+r.x,+r.y);throw new Error("Expected [x, y] or {x, y} point format")};class Lh{constructor(e,t,i,n,s){this.properties={},this.extent=i,this.type=0,this.id=void 0,this._pbf=e,this._geometry=-1,this._keys=n,this._values=s,e.readFields(V_,this,t)}loadGeometry(){const e=this._pbf;e.pos=this._geometry;const t=e.readVarint()+e.pos,i=[];let n,s=1,a=0,c=0,h=0;for(;e.pos<t;){if(a<=0){const d=e.readVarint();s=d&7,a=d>>3}if(a--,s===1||s===2)c+=e.readSVarint(),h+=e.readSVarint(),s===1&&(n&&i.push(n),n=[]),n&&n.push(new Ei(c,h));else if(s===7)n&&n.push(n[0].clone());else throw new Error(`unknown command ${s}`)}return n&&i.push(n),i}bbox(){const e=this._pbf;e.pos=this._geometry;const t=e.readVarint()+e.pos;let i=1,n=0,s=0,a=0,c=1/0,h=-1/0,d=1/0,m=-1/0;for(;e.pos<t;){if(n<=0){const f=e.readVarint();i=f&7,n=f>>3}if(n--,i===1||i===2)s+=e.readSVarint(),a+=e.readSVarint(),s<c&&(c=s),s>h&&(h=s),a<d&&(d=a),a>m&&(m=a);else if(i!==7)throw new Error(`unknown command ${i}`)}return[c,d,h,m]}toGeoJSON(e,t,i){const n=this.extent*Math.pow(2,i),s=this.extent*e,a=this.extent*t,c=this.loadGeometry();function h(g){return[(g.x+s)*360/n-180,360/Math.PI*Math.atan(Math.exp((1-(g.y+a)*2/n)*Math.PI))-90]}function d(g){return g.map(h)}let m;if(this.type===1){const g=[];for(const w of c)g.push(w[0]);const _=d(g);m=g.length===1?{type:"Point",coordinates:_[0]}:{type:"MultiPoint",coordinates:_}}else if(this.type===2){const g=c.map(d);m=g.length===1?{type:"LineString",coordinates:g[0]}:{type:"MultiLineString",coordinates:g}}else if(this.type===3){const g=A_(c),_=[];for(const w of g)_.push(w.map(d));m=_.length===1?{type:"Polygon",coordinates:_[0]}:{type:"MultiPolygon",coordinates:_}}else throw new Error("unknown feature type");const f={type:"Feature",geometry:m,properties:this.properties};return this.id!=null&&(f.id=this.id),f}}Lh.types=["Unknown","Point","LineString","Polygon"];function V_(r,e,t){r===1?e.id=t.readVarint():r===2?I_(t,e):r===3?e.type=t.readVarint():r===4&&(e._geometry=t.pos)}function I_(r,e){const t=r.readVarint()+r.pos;for(;r.pos<t;){const i=e._keys[r.readVarint()],n=e._values[r.readVarint()];e.properties[i]=n}}function A_(r){const e=r.length;if(e<=1)return[r];const t=[];let i,n;for(let s=0;s<e;s++){const a=F_(r[s]);a!==0&&(n===void 0&&(n=a<0),n===a<0?(i&&t.push(i),i=[r[s]]):i&&i.push(r[s]))}return i&&t.push(i),t}function F_(r){let e=0;for(let t=0,i=r.length,n=i-1,s,a;t<i;n=t++)s=r[t],a=r[n],e+=(a.x-s.x)*(s.y+a.y);return e}let O_=class{constructor(e,t){this.version=1,this.name="",this.extent=4096,this.length=0,this._pbf=e,this._keys=[],this._values=[],this._features=[],e.readFields(z_,this,t),this.length=this._features.length}feature(e){if(e<0||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];const t=this._pbf.readVarint()+this._pbf.pos;return new Lh(this._pbf,t,this.extent,this._keys,this._values)}};function z_(r,e,t){r===15?e.version=t.readVarint():r===1?e.name=t.readString():r===5?e.extent=t.readVarint():r===2?e._features.push(t.pos):r===3?e._keys.push(t.readString()):r===4&&e._values.push(D_(t))}function D_(r){let e=null;const t=r.readVarint()+r.pos;for(;r.pos<t;){const i=r.readVarint()>>3;e=i===1?r.readString():i===2?r.readFloat():i===3?r.readDouble():i===4?r.readVarint64():i===5?r.readVarint():i===6?r.readSVarint():i===7?r.readBoolean():null}if(e==null)throw new Error("unknown feature value");return e}class X_{constructor(e,t){this.layers=e.readFields(k_,{},t)}}function k_(r,e,t){if(r===3){const i=new O_(t,t.readVarint()+t.pos);i.length&&(e[i.name]=i)}}const ya=65536*65536,Ph=1/ya,U_=12,Ch=typeof TextDecoder>"u"?null:new TextDecoder("utf-8"),_a=0,Ts=1,Ar=2,Gs=5;class N_{constructor(e=new Uint8Array(16)){this.buf=ArrayBuffer.isView(e)?e:new Uint8Array(e),this.dataView=new DataView(this.buf.buffer),this.pos=0,this.type=0,this.length=this.buf.length}readFields(e,t,i=this.length){for(;this.pos<i;){const n=this.readVarint(),s=n>>3,a=this.pos;this.type=n&7,e(s,t,this),this.pos===a&&this.skip(n)}return t}readMessage(e,t){return this.readFields(e,t,this.readVarint()+this.pos)}readFixed32(){const e=this.dataView.getUint32(this.pos,!0);return this.pos+=4,e}readSFixed32(){const e=this.dataView.getInt32(this.pos,!0);return this.pos+=4,e}readFixed64(){const e=this.dataView.getUint32(this.pos,!0)+this.dataView.getUint32(this.pos+4,!0)*ya;return this.pos+=8,e}readSFixed64(){const e=this.dataView.getUint32(this.pos,!0)+this.dataView.getInt32(this.pos+4,!0)*ya;return this.pos+=8,e}readFloat(){const e=this.dataView.getFloat32(this.pos,!0);return this.pos+=4,e}readDouble(){const e=this.dataView.getFloat64(this.pos,!0);return this.pos+=8,e}readVarint(e){const t=this.buf;let i,n;return n=t[this.pos++],i=n&127,n<128||(n=t[this.pos++],i|=(n&127)<<7,n<128)||(n=t[this.pos++],i|=(n&127)<<14,n<128)||(n=t[this.pos++],i|=(n&127)<<21,n<128)?i:(n=t[this.pos],i|=(n&15)<<28,K_(i,e,this))}readVarint64(){return this.readVarint(!0)}readSVarint(){const e=this.readVarint();return e%2===1?(e+1)/-2:e/2}readBoolean(){return!!this.readVarint()}readString(){const e=this.readVarint()+this.pos,t=this.pos;return this.pos=e,e-t>=U_&&Ch?Ch.decode(this.buf.subarray(t,e)):iv(this.buf,t,e)}readBytes(){const e=this.readVarint()+this.pos,t=this.buf.subarray(this.pos,e);return this.pos=e,t}readPackedVarint(e=[],t){const i=this.readPackedEnd();for(;this.pos<i;)e.push(this.readVarint(t));return e}readPackedSVarint(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readSVarint());return e}readPackedBoolean(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readBoolean());return e}readPackedFloat(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readFloat());return e}readPackedDouble(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readDouble());return e}readPackedFixed32(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readFixed32());return e}readPackedSFixed32(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readSFixed32());return e}readPackedFixed64(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readFixed64());return e}readPackedSFixed64(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readSFixed64());return e}readPackedEnd(){return this.type===Ar?this.readVarint()+this.pos:this.pos+1}skip(e){const t=e&7;if(t===_a)for(;this.buf[this.pos++]>127;);else if(t===Ar)this.pos=this.readVarint()+this.pos;else if(t===Gs)this.pos+=4;else if(t===Ts)this.pos+=8;else throw new Error(`Unimplemented type: ${t}`)}writeTag(e,t){this.writeVarint(e<<3|t)}realloc(e){let t=this.length||16;for(;t<this.pos+e;)t*=2;if(t!==this.length){const i=new Uint8Array(t);i.set(this.buf),this.buf=i,this.dataView=new DataView(i.buffer),this.length=t}}finish(){return this.length=this.pos,this.pos=0,this.buf.subarray(0,this.length)}writeFixed32(e){this.realloc(4),this.dataView.setInt32(this.pos,e,!0),this.pos+=4}writeSFixed32(e){this.realloc(4),this.dataView.setInt32(this.pos,e,!0),this.pos+=4}writeFixed64(e){this.realloc(8),this.dataView.setInt32(this.pos,e&-1,!0),this.dataView.setInt32(this.pos+4,Math.floor(e*Ph),!0),this.pos+=8}writeSFixed64(e){this.realloc(8),this.dataView.setInt32(this.pos,e&-1,!0),this.dataView.setInt32(this.pos+4,Math.floor(e*Ph),!0),this.pos+=8}writeVarint(e){if(e=+e||0,e>268435455||e<0){B_(e,this);return}this.realloc(4),this.buf[this.pos++]=e&127|(e>127?128:0),!(e<=127)&&(this.buf[this.pos++]=(e>>>=7)&127|(e>127?128:0),!(e<=127)&&(this.buf[this.pos++]=(e>>>=7)&127|(e>127?128:0),!(e<=127)&&(this.buf[this.pos++]=e>>>7&127)))}writeSVarint(e){this.writeVarint(e<0?-e*2-1:e*2)}writeBoolean(e){this.writeVarint(+e)}writeString(e){e=String(e),this.realloc(e.length*4),this.pos++;const t=this.pos;this.pos=nv(this.buf,e,this.pos);const i=this.pos-t;i>=128&&Th(t,i,this),this.pos=t-1,this.writeVarint(i),this.pos+=i}writeFloat(e){this.realloc(4),this.dataView.setFloat32(this.pos,e,!0),this.pos+=4}writeDouble(e){this.realloc(8),this.dataView.setFloat64(this.pos,e,!0),this.pos+=8}writeBytes(e){const t=e.length;this.writeVarint(t),this.realloc(t);for(let i=0;i<t;i++)this.buf[this.pos++]=e[i]}writeRawMessage(e,t){this.pos++;const i=this.pos;e(t,this);const n=this.pos-i;n>=128&&Th(i,n,this),this.pos=i-1,this.writeVarint(n),this.pos+=n}writeMessage(e,t,i){this.writeTag(e,Ar),this.writeRawMessage(t,i)}writePackedVarint(e,t){t.length&&this.writeMessage(e,j_,t)}writePackedSVarint(e,t){t.length&&this.writeMessage(e,J_,t)}writePackedBoolean(e,t){t.length&&this.writeMessage(e,$_,t)}writePackedFloat(e,t){t.length&&this.writeMessage(e,Q_,t)}writePackedDouble(e,t){t.length&&this.writeMessage(e,H_,t)}writePackedFixed32(e,t){t.length&&this.writeMessage(e,E_,t)}writePackedSFixed32(e,t){t.length&&this.writeMessage(e,q_,t)}writePackedFixed64(e,t){t.length&&this.writeMessage(e,ev,t)}writePackedSFixed64(e,t){t.length&&this.writeMessage(e,tv,t)}writeBytesField(e,t){this.writeTag(e,Ar),this.writeBytes(t)}writeFixed32Field(e,t){this.writeTag(e,Gs),this.writeFixed32(t)}writeSFixed32Field(e,t){this.writeTag(e,Gs),this.writeSFixed32(t)}writeFixed64Field(e,t){this.writeTag(e,Ts),this.writeFixed64(t)}writeSFixed64Field(e,t){this.writeTag(e,Ts),this.writeSFixed64(t)}writeVarintField(e,t){this.writeTag(e,_a),this.writeVarint(t)}writeSVarintField(e,t){this.writeTag(e,_a),this.writeSVarint(t)}writeStringField(e,t){this.writeTag(e,Ar),this.writeString(t)}writeFloatField(e,t){this.writeTag(e,Gs),this.writeFloat(t)}writeDoubleField(e,t){this.writeTag(e,Ts),this.writeDouble(t)}writeBooleanField(e,t){this.writeVarintField(e,+t)}}function K_(r,e,t){const i=t.buf;let n,s;if(s=i[t.pos++],n=(s&112)>>4,s<128||(s=i[t.pos++],n|=(s&127)<<3,s<128)||(s=i[t.pos++],n|=(s&127)<<10,s<128)||(s=i[t.pos++],n|=(s&127)<<17,s<128)||(s=i[t.pos++],n|=(s&127)<<24,s<128)||(s=i[t.pos++],n|=(s&1)<<31,s<128))return Jn(r,n,e);throw new Error("Expected varint not more than 10 bytes")}function Jn(r,e,t){return t?e*4294967296+(r>>>0):(e>>>0)*4294967296+(r>>>0)}function B_(r,e){let t,i;if(r>=0?(t=r%4294967296|0,i=r/4294967296|0):(t=~(-r%4294967296),i=~(-r/4294967296),t^4294967295?t=t+1|0:(t=0,i=i+1|0)),r>=18446744073709552e3||r<-18446744073709552e3)throw new Error("Given varint doesn't fit into 10 bytes");e.realloc(10),Y_(t,i,e),R_(i,e)}function Y_(r,e,t){t.buf[t.pos++]=r&127|128,r>>>=7,t.buf[t.pos++]=r&127|128,r>>>=7,t.buf[t.pos++]=r&127|128,r>>>=7,t.buf[t.pos++]=r&127|128,r>>>=7,t.buf[t.pos]=r&127}function R_(r,e){const t=(r&7)<<4;e.buf[e.pos++]|=t|((r>>>=3)?128:0),r&&(e.buf[e.pos++]=r&127|((r>>>=7)?128:0),r&&(e.buf[e.pos++]=r&127|((r>>>=7)?128:0),r&&(e.buf[e.pos++]=r&127|((r>>>=7)?128:0),r&&(e.buf[e.pos++]=r&127|((r>>>=7)?128:0),r&&(e.buf[e.pos++]=r&127)))))}function Th(r,e,t){const i=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(Math.LN2*7));t.realloc(i);for(let n=t.pos-1;n>=r;n--)t.buf[n+i]=t.buf[n]}function j_(r,e){for(let t=0;t<r.length;t++)e.writeVarint(r[t])}function J_(r,e){for(let t=0;t<r.length;t++)e.writeSVarint(r[t])}function Q_(r,e){for(let t=0;t<r.length;t++)e.writeFloat(r[t])}function H_(r,e){for(let t=0;t<r.length;t++)e.writeDouble(r[t])}function $_(r,e){for(let t=0;t<r.length;t++)e.writeBoolean(r[t])}function E_(r,e){for(let t=0;t<r.length;t++)e.writeFixed32(r[t])}function q_(r,e){for(let t=0;t<r.length;t++)e.writeSFixed32(r[t])}function ev(r,e){for(let t=0;t<r.length;t++)e.writeFixed64(r[t])}function tv(r,e){for(let t=0;t<r.length;t++)e.writeSFixed64(r[t])}function iv(r,e,t){let i="",n=e;for(;n<t;){const s=r[n];let a=null,c=s>239?4:s>223?3:s>191?2:1;if(n+c>t)break;let h,d,m;c===1?s<128&&(a=s):c===2?(h=r[n+1],(h&192)===128&&(a=(s&31)<<6|h&63,a<=127&&(a=null))):c===3?(h=r[n+1],d=r[n+2],(h&192)===128&&(d&192)===128&&(a=(s&15)<<12|(h&63)<<6|d&63,(a<=2047||a>=55296&&a<=57343)&&(a=null))):c===4&&(h=r[n+1],d=r[n+2],m=r[n+3],(h&192)===128&&(d&192)===128&&(m&192)===128&&(a=(s&15)<<18|(h&63)<<12|(d&63)<<6|m&63,(a<=65535||a>=1114112)&&(a=null))),a===null?(a=65533,c=1):a>65535&&(a-=65536,i+=String.fromCharCode(a>>>10&1023|55296),a=56320|a&1023),i+=String.fromCharCode(a),n+=c}return i}function nv(r,e,t){for(let i=0,n,s;i<e.length;i++){if(n=e.charCodeAt(i),n>55295&&n<57344)if(s)if(n<56320){r[t++]=239,r[t++]=191,r[t++]=189,s=n;continue}else n=s-55296<<10|n-56320|65536,s=null;else{n>56319||i+1===e.length?(r[t++]=239,r[t++]=191,r[t++]=189):s=n;continue}else s&&(r[t++]=239,r[t++]=191,r[t++]=189,s=null);n<128?r[t++]=n:(n<2048?r[t++]=n>>6|192:(n<65536?r[t++]=n>>12|224:(r[t++]=n>>18|240,r[t++]=n>>12&63|128),r[t++]=n>>6&63|128),r[t++]=n&63|128)}return t}var rv=Object.defineProperty,sv=(r,e,t)=>e in r?rv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,va=(r,e,t)=>sv(r,typeof e!="symbol"?e+"":e,t);class ov extends fa{constructor(){super(),va(this,"dataType","mvt"),va(this,"_loader",new p.FileLoader(De.manager)),va(this,"_render",new yh),this._loader.setResponseType("arraybuffer")}async doLoad(e,t){const i=await this._loader.loadAsync(e),n=new X_(new N_(i)),s=this.drawTile(n,t.source.style,t.z);return new p.CanvasTexture(s)}drawTile(e,t,i){const c=new OffscreenCanvas(256,256).getContext("2d");if(c){if(t)for(const h in t.layer){const d=t.layer[h];if(t&&(i<(d.minLevel??1)||i>(d.maxLevel??20)))continue;const m=e.layers[h];if(m){const f=256/m.extent;this._renderLayer(c,m,d,f)}}else for(const h in e.layers){const d=e.layers[h],m=256/d.extent;this._renderLayer(c,d,void 0,m)}return c.canvas}else throw new Error("Canvas context is not available")}_renderLayer(e,t,i,n=1){e.save();for(let s=0;s<t.length;s++){const a=t.feature(s);this._renderFeature(e,a,i,n)}return e.restore(),this}_renderFeature(e,t,i={},n=1){const s=[rt.Unknown,rt.Point,rt.Linestring,rt.Polygon][t.type],a={geometry:t.loadGeometry(),properties:t.properties};this._render.render(e,s,a,i,n)}_convertToGeoJSONFeature(e,t){const i=this._convertGeometryToGeoJSON(e.geometry,t);return i?{type:"Feature",geometry:i,properties:e.properties||{},id:e.id}:null}_convertGeometryToGeoJSON(e,t){switch(t){case rt.Point:return this._convertPointGeometry(e);case rt.Linestring:return this._convertLineGeometry(e);case rt.Polygon:return this._convertPolygonGeometry(e);default:return console.warn("未知的几何类型:",t),null}}_convertPointGeometry(e){const t=[];for(const i of e)for(const n of i)t.push([n.x,n.y]);return t.length===0?null:t.length===1?{type:"Point",coordinates:t[0]}:{type:"MultiPoint",coordinates:t}}_convertLineGeometry(e){const t=[];for(const i of e){const n=[];for(const s of i)n.push([s.x,s.y]);n.length>=2&&t.push(n)}return t.length===0?null:t.length===1?{type:"LineString",coordinates:t[0]}:{type:"MultiLineString",coordinates:t}}_convertPolygonGeometry(e){const t=[];let i=[];for(const n of e){const s=[];for(const a of n)s.push([a.x,a.y]);s.length>=4&&(this._isRingClockwise(s)||i.length===0?(i.length>0&&t.push(i),i=[s]):i.push(s))}return i.length>0&&t.push(i),t.length===0?null:t.length===1?{type:"Polygon",coordinates:t[0]}:{type:"MultiPolygon",coordinates:t}}_isRingClockwise(e){let t=0;for(let i=0;i<e.length-1;i++){const[n,s]=e[i],[a,c]=e[i+1];t+=(a-n)*(c+s)}return t>0}convertVectorTileToGeoJSON(e){const t=[];for(const i in e.layers){const n=e.layers[i];for(let s=0;s<n.length;s++){const a=n.feature(s),c=[rt.Unknown,rt.Point,rt.Linestring,rt.Polygon][a.type],h={geometry:a.loadGeometry(),properties:a.properties},d=this._convertToGeoJSONFeature(h,c);d&&(d.properties._layer=i,t.push(d))}}return{type:"FeatureCollection",features:t}}}ma(new ov);const Gh="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IF89MjMyODMwNjQzNjUzODY5NjNlLTI2LG09MTIsUD10eXBlb2YgVGV4dERlY29kZXI+InUiP251bGw6bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpLGc9MCx5PTEsRj0yLHA9NTtjbGFzcyBNe2NvbnN0cnVjdG9yKHQ9bmV3IFVpbnQ4QXJyYXkoMTYpKXt0aGlzLmJ1Zj1BcnJheUJ1ZmZlci5pc1ZpZXcodCk/dDpuZXcgVWludDhBcnJheSh0KSx0aGlzLmRhdGFWaWV3PW5ldyBEYXRhVmlldyh0aGlzLmJ1Zi5idWZmZXIpLHRoaXMucG9zPTAsdGhpcy50eXBlPTAsdGhpcy5sZW5ndGg9dGhpcy5idWYubGVuZ3RofXJlYWRGaWVsZHModCxlLHI9dGhpcy5sZW5ndGgpe2Zvcig7dGhpcy5wb3M8cjspe2NvbnN0IHM9dGhpcy5yZWFkVmFyaW50KCksbj1zPj4zLG89dGhpcy5wb3M7dGhpcy50eXBlPXMmNyx0KG4sZSx0aGlzKSx0aGlzLnBvcz09PW8mJnRoaXMuc2tpcChzKX1yZXR1cm4gZX1yZWFkTWVzc2FnZSh0LGUpe3JldHVybiB0aGlzLnJlYWRGaWVsZHModCxlLHRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zKX1yZWFkRml4ZWQzMigpe2NvbnN0IHQ9dGhpcy5kYXRhVmlldy5nZXRVaW50MzIodGhpcy5wb3MsITApO3JldHVybiB0aGlzLnBvcys9NCx0fXJlYWRTRml4ZWQzMigpe2NvbnN0IHQ9dGhpcy5kYXRhVmlldy5nZXRJbnQzMih0aGlzLnBvcywhMCk7cmV0dXJuIHRoaXMucG9zKz00LHR9cmVhZEZpeGVkNjQoKXtjb25zdCB0PXRoaXMuZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMucG9zLCEwKSt0aGlzLmRhdGFWaWV3LmdldFVpbnQzMih0aGlzLnBvcys0LCEwKSo0Mjk0OTY3Mjk2O3JldHVybiB0aGlzLnBvcys9OCx0fXJlYWRTRml4ZWQ2NCgpe2NvbnN0IHQ9dGhpcy5kYXRhVmlldy5nZXRVaW50MzIodGhpcy5wb3MsITApK3RoaXMuZGF0YVZpZXcuZ2V0SW50MzIodGhpcy5wb3MrNCwhMCkqNDI5NDk2NzI5NjtyZXR1cm4gdGhpcy5wb3MrPTgsdH1yZWFkRmxvYXQoKXtjb25zdCB0PXRoaXMuZGF0YVZpZXcuZ2V0RmxvYXQzMih0aGlzLnBvcywhMCk7cmV0dXJuIHRoaXMucG9zKz00LHR9cmVhZERvdWJsZSgpe2NvbnN0IHQ9dGhpcy5kYXRhVmlldy5nZXRGbG9hdDY0KHRoaXMucG9zLCEwKTtyZXR1cm4gdGhpcy5wb3MrPTgsdH1yZWFkVmFyaW50KHQpe2NvbnN0IGU9dGhpcy5idWY7bGV0IHIscztyZXR1cm4gcz1lW3RoaXMucG9zKytdLHI9cyYxMjcsczwxMjh8fChzPWVbdGhpcy5wb3MrK10scnw9KHMmMTI3KTw8NyxzPDEyOCl8fChzPWVbdGhpcy5wb3MrK10scnw9KHMmMTI3KTw8MTQsczwxMjgpfHwocz1lW3RoaXMucG9zKytdLHJ8PShzJjEyNyk8PDIxLHM8MTI4KT9yOihzPWVbdGhpcy5wb3NdLHJ8PShzJjE1KTw8MjgsRShyLHQsdGhpcykpfXJlYWRWYXJpbnQ2NCgpe3JldHVybiB0aGlzLnJlYWRWYXJpbnQoITApfXJlYWRTVmFyaW50KCl7Y29uc3QgdD10aGlzLnJlYWRWYXJpbnQoKTtyZXR1cm4gdCUyPT09MT8odCsxKS8tMjp0LzJ9cmVhZEJvb2xlYW4oKXtyZXR1cm4hIXRoaXMucmVhZFZhcmludCgpfXJlYWRTdHJpbmcoKXtjb25zdCB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5wb3M7cmV0dXJuIHRoaXMucG9zPXQsdC1lPj1tJiZQP1AuZGVjb2RlKHRoaXMuYnVmLnN1YmFycmF5KGUsdCkpOlIodGhpcy5idWYsZSx0KX1yZWFkQnl0ZXMoKXtjb25zdCB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5idWYuc3ViYXJyYXkodGhpcy5wb3MsdCk7cmV0dXJuIHRoaXMucG9zPXQsZX1yZWFkUGFja2VkVmFyaW50KHQ9W10sZSl7Y29uc3Qgcj10aGlzLnJlYWRQYWNrZWRFbmQoKTtmb3IoO3RoaXMucG9zPHI7KXQucHVzaCh0aGlzLnJlYWRWYXJpbnQoZSkpO3JldHVybiB0fXJlYWRQYWNrZWRTVmFyaW50KHQ9W10pe2NvbnN0IGU9dGhpcy5yZWFkUGFja2VkRW5kKCk7Zm9yKDt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtyZXR1cm4gdH1yZWFkUGFja2VkQm9vbGVhbih0PVtdKXtjb25zdCBlPXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7cmV0dXJuIHR9cmVhZFBhY2tlZEZsb2F0KHQ9W10pe2NvbnN0IGU9dGhpcy5yZWFkUGFja2VkRW5kKCk7Zm9yKDt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRmxvYXQoKSk7cmV0dXJuIHR9cmVhZFBhY2tlZERvdWJsZSh0PVtdKXtjb25zdCBlPXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtyZXR1cm4gdH1yZWFkUGFja2VkRml4ZWQzMih0PVtdKXtjb25zdCBlPXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7cmV0dXJuIHR9cmVhZFBhY2tlZFNGaXhlZDMyKHQ9W10pe2NvbnN0IGU9dGhpcy5yZWFkUGFja2VkRW5kKCk7Zm9yKDt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7cmV0dXJuIHR9cmVhZFBhY2tlZEZpeGVkNjQodD1bXSl7Y29uc3QgZT10aGlzLnJlYWRQYWNrZWRFbmQoKTtmb3IoO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO3JldHVybiB0fXJlYWRQYWNrZWRTRml4ZWQ2NCh0PVtdKXtjb25zdCBlPXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiB0fXJlYWRQYWNrZWRFbmQoKXtyZXR1cm4gdGhpcy50eXBlPT09Rj90aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvczp0aGlzLnBvcysxfXNraXAodCl7Y29uc3QgZT10Jjc7aWYoZT09PWcpZm9yKDt0aGlzLmJ1Zlt0aGlzLnBvcysrXT4xMjc7KTtlbHNlIGlmKGU9PT1GKXRoaXMucG9zPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zO2Vsc2UgaWYoZT09PXApdGhpcy5wb3MrPTQ7ZWxzZSBpZihlPT09eSl0aGlzLnBvcys9ODtlbHNlIHRocm93IG5ldyBFcnJvcihgVW5pbXBsZW1lbnRlZCB0eXBlOiAke2V9YCl9d3JpdGVUYWcodCxlKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8ZSl9cmVhbGxvYyh0KXtsZXQgZT10aGlzLmxlbmd0aHx8MTY7Zm9yKDtlPHRoaXMucG9zK3Q7KWUqPTI7aWYoZSE9PXRoaXMubGVuZ3RoKXtjb25zdCByPW5ldyBVaW50OEFycmF5KGUpO3Iuc2V0KHRoaXMuYnVmKSx0aGlzLmJ1Zj1yLHRoaXMuZGF0YVZpZXc9bmV3IERhdGFWaWV3KHIuYnVmZmVyKSx0aGlzLmxlbmd0aD1lfX1maW5pc2goKXtyZXR1cm4gdGhpcy5sZW5ndGg9dGhpcy5wb3MsdGhpcy5wb3M9MCx0aGlzLmJ1Zi5zdWJhcnJheSgwLHRoaXMubGVuZ3RoKX13cml0ZUZpeGVkMzIodCl7dGhpcy5yZWFsbG9jKDQpLHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5wb3MsdCwhMCksdGhpcy5wb3MrPTR9d3JpdGVTRml4ZWQzMih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLnBvcyx0LCEwKSx0aGlzLnBvcys9NH13cml0ZUZpeGVkNjQodCl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5wb3MsdCYtMSwhMCksdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLnBvcys0LE1hdGguZmxvb3IodCpfKSwhMCksdGhpcy5wb3MrPTh9d3JpdGVTRml4ZWQ2NCh0KXt0aGlzLnJlYWxsb2MoOCksdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLnBvcyx0Ji0xLCEwKSx0aGlzLmRhdGFWaWV3LnNldEludDMyKHRoaXMucG9zKzQsTWF0aC5mbG9vcih0Kl8pLCEwKSx0aGlzLnBvcys9OH13cml0ZVZhcmludCh0KXtpZih0PSt0fHwwLHQ+MjY4NDM1NDU1fHx0PDApe0IodCx0aGlzKTtyZXR1cm59dGhpcy5yZWFsbG9jKDQpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjcmMTI3KSkpfXdyaXRlU1ZhcmludCh0KXt0aGlzLndyaXRlVmFyaW50KHQ8MD8tdCoyLTE6dCoyKX13cml0ZUJvb2xlYW4odCl7dGhpcy53cml0ZVZhcmludCgrdCl9d3JpdGVTdHJpbmcodCl7dD1TdHJpbmcodCksdGhpcy5yZWFsbG9jKHQubGVuZ3RoKjQpLHRoaXMucG9zKys7Y29uc3QgZT10aGlzLnBvczt0aGlzLnBvcz1xKHRoaXMuYnVmLHQsdGhpcy5wb3MpO2NvbnN0IHI9dGhpcy5wb3MtZTtyPj0xMjgmJlMoZSxyLHRoaXMpLHRoaXMucG9zPWUtMSx0aGlzLndyaXRlVmFyaW50KHIpLHRoaXMucG9zKz1yfXdyaXRlRmxvYXQodCl7dGhpcy5yZWFsbG9jKDQpLHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQzMih0aGlzLnBvcyx0LCEwKSx0aGlzLnBvcys9NH13cml0ZURvdWJsZSh0KXt0aGlzLnJlYWxsb2MoOCksdGhpcy5kYXRhVmlldy5zZXRGbG9hdDY0KHRoaXMucG9zLHQsITApLHRoaXMucG9zKz04fXdyaXRlQnl0ZXModCl7Y29uc3QgZT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGUpLHRoaXMucmVhbGxvYyhlKTtmb3IobGV0IHI9MDtyPGU7cisrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbcl19d3JpdGVSYXdNZXNzYWdlKHQsZSl7dGhpcy5wb3MrKztjb25zdCByPXRoaXMucG9zO3QoZSx0aGlzKTtjb25zdCBzPXRoaXMucG9zLXI7cz49MTI4JiZTKHIscyx0aGlzKSx0aGlzLnBvcz1yLTEsdGhpcy53cml0ZVZhcmludChzKSx0aGlzLnBvcys9c313cml0ZU1lc3NhZ2UodCxlLHIpe3RoaXMud3JpdGVUYWcodCxGKSx0aGlzLndyaXRlUmF3TWVzc2FnZShlLHIpfXdyaXRlUGFja2VkVmFyaW50KHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsSSxlKX13cml0ZVBhY2tlZFNWYXJpbnQodCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxDLGUpfXdyaXRlUGFja2VkQm9vbGVhbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LFUsZSl9d3JpdGVQYWNrZWRGbG9hdCh0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LEwsZSl9d3JpdGVQYWNrZWREb3VibGUodCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxBLGUpfXdyaXRlUGFja2VkRml4ZWQzMih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHYsZSl9d3JpdGVQYWNrZWRTRml4ZWQzMih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LE4sZSl9d3JpdGVQYWNrZWRGaXhlZDY0KHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsRyxlKX13cml0ZVBhY2tlZFNGaXhlZDY0KHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsSCxlKX13cml0ZUJ5dGVzRmllbGQodCxlKXt0aGlzLndyaXRlVGFnKHQsRiksdGhpcy53cml0ZUJ5dGVzKGUpfXdyaXRlRml4ZWQzMkZpZWxkKHQsZSl7dGhpcy53cml0ZVRhZyh0LHApLHRoaXMud3JpdGVGaXhlZDMyKGUpfXdyaXRlU0ZpeGVkMzJGaWVsZCh0LGUpe3RoaXMud3JpdGVUYWcodCxwKSx0aGlzLndyaXRlU0ZpeGVkMzIoZSl9d3JpdGVGaXhlZDY0RmllbGQodCxlKXt0aGlzLndyaXRlVGFnKHQseSksdGhpcy53cml0ZUZpeGVkNjQoZSl9d3JpdGVTRml4ZWQ2NEZpZWxkKHQsZSl7dGhpcy53cml0ZVRhZyh0LHkpLHRoaXMud3JpdGVTRml4ZWQ2NChlKX13cml0ZVZhcmludEZpZWxkKHQsZSl7dGhpcy53cml0ZVRhZyh0LGcpLHRoaXMud3JpdGVWYXJpbnQoZSl9d3JpdGVTVmFyaW50RmllbGQodCxlKXt0aGlzLndyaXRlVGFnKHQsZyksdGhpcy53cml0ZVNWYXJpbnQoZSl9d3JpdGVTdHJpbmdGaWVsZCh0LGUpe3RoaXMud3JpdGVUYWcodCxGKSx0aGlzLndyaXRlU3RyaW5nKGUpfXdyaXRlRmxvYXRGaWVsZCh0LGUpe3RoaXMud3JpdGVUYWcodCxwKSx0aGlzLndyaXRlRmxvYXQoZSl9d3JpdGVEb3VibGVGaWVsZCh0LGUpe3RoaXMud3JpdGVUYWcodCx5KSx0aGlzLndyaXRlRG91YmxlKGUpfXdyaXRlQm9vbGVhbkZpZWxkKHQsZSl7dGhpcy53cml0ZVZhcmludEZpZWxkKHQsK2UpfX1mdW5jdGlvbiBFKGksdCxlKXtjb25zdCByPWUuYnVmO2xldCBzLG47aWYobj1yW2UucG9zKytdLHM9KG4mMTEyKT4+NCxuPDEyOHx8KG49cltlLnBvcysrXSxzfD0obiYxMjcpPDwzLG48MTI4KXx8KG49cltlLnBvcysrXSxzfD0obiYxMjcpPDwxMCxuPDEyOCl8fChuPXJbZS5wb3MrK10sc3w9KG4mMTI3KTw8MTcsbjwxMjgpfHwobj1yW2UucG9zKytdLHN8PShuJjEyNyk8PDI0LG48MTI4KXx8KG49cltlLnBvcysrXSxzfD0obiYxKTw8MzEsbjwxMjgpKXJldHVybiBmKGkscyx0KTt0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzIil9ZnVuY3Rpb24gZihpLHQsZSl7cmV0dXJuIGU/dCo0Mjk0OTY3Mjk2KyhpPj4+MCk6KHQ+Pj4wKSo0Mjk0OTY3Mjk2KyhpPj4+MCl9ZnVuY3Rpb24gQihpLHQpe2xldCBlLHI7aWYoaT49MD8oZT1pJTQyOTQ5NjcyOTZ8MCxyPWkvNDI5NDk2NzI5NnwwKTooZT1+KC1pJTQyOTQ5NjcyOTYpLHI9figtaS80Mjk0OTY3Mjk2KSxlXjQyOTQ5NjcyOTU/ZT1lKzF8MDooZT0wLHI9cisxfDApKSxpPj0xODQ0Njc0NDA3MzcwOTU1MmUzfHxpPC0xODQ0Njc0NDA3MzcwOTU1MmUzKXRocm93IG5ldyBFcnJvcigiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXMiKTt0LnJlYWxsb2MoMTApLFQoZSxyLHQpLEQocix0KX1mdW5jdGlvbiBUKGksdCxlKXtlLmJ1ZltlLnBvcysrXT1pJjEyN3wxMjgsaT4+Pj03LGUuYnVmW2UucG9zKytdPWkmMTI3fDEyOCxpPj4+PTcsZS5idWZbZS5wb3MrK109aSYxMjd8MTI4LGk+Pj49NyxlLmJ1ZltlLnBvcysrXT1pJjEyN3wxMjgsaT4+Pj03LGUuYnVmW2UucG9zXT1pJjEyN31mdW5jdGlvbiBEKGksdCl7Y29uc3QgZT0oaSY3KTw8NDt0LmJ1Zlt0LnBvcysrXXw9ZXwoKGk+Pj49Myk/MTI4OjApLGkmJih0LmJ1Zlt0LnBvcysrXT1pJjEyN3woKGk+Pj49Nyk/MTI4OjApLGkmJih0LmJ1Zlt0LnBvcysrXT1pJjEyN3woKGk+Pj49Nyk/MTI4OjApLGkmJih0LmJ1Zlt0LnBvcysrXT1pJjEyN3woKGk+Pj49Nyk/MTI4OjApLGkmJih0LmJ1Zlt0LnBvcysrXT1pJjEyN3woKGk+Pj49Nyk/MTI4OjApLGkmJih0LmJ1Zlt0LnBvcysrXT1pJjEyNykpKSkpfWZ1bmN0aW9uIFMoaSx0LGUpe2NvbnN0IHI9dDw9MTYzODM/MTp0PD0yMDk3MTUxPzI6dDw9MjY4NDM1NDU1PzM6TWF0aC5mbG9vcihNYXRoLmxvZyh0KS8oTWF0aC5MTjIqNykpO2UucmVhbGxvYyhyKTtmb3IobGV0IHM9ZS5wb3MtMTtzPj1pO3MtLSllLmJ1ZltzK3JdPWUuYnVmW3NdfWZ1bmN0aW9uIEkoaSx0KXtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl0LndyaXRlVmFyaW50KGlbZV0pfWZ1bmN0aW9uIEMoaSx0KXtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl0LndyaXRlU1ZhcmludChpW2VdKX1mdW5jdGlvbiBMKGksdCl7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspdC53cml0ZUZsb2F0KGlbZV0pfWZ1bmN0aW9uIEEoaSx0KXtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl0LndyaXRlRG91YmxlKGlbZV0pfWZ1bmN0aW9uIFUoaSx0KXtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl0LndyaXRlQm9vbGVhbihpW2VdKX1mdW5jdGlvbiB2KGksdCl7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspdC53cml0ZUZpeGVkMzIoaVtlXSl9ZnVuY3Rpb24gTihpLHQpe2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXQud3JpdGVTRml4ZWQzMihpW2VdKX1mdW5jdGlvbiBHKGksdCl7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspdC53cml0ZUZpeGVkNjQoaVtlXSl9ZnVuY3Rpb24gSChpLHQpe2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXQud3JpdGVTRml4ZWQ2NChpW2VdKX1mdW5jdGlvbiBSKGksdCxlKXtsZXQgcj0iIixzPXQ7Zm9yKDtzPGU7KXtjb25zdCBuPWlbc107bGV0IG89bnVsbCxoPW4+MjM5PzQ6bj4yMjM/MzpuPjE5MT8yOjE7aWYocytoPmUpYnJlYWs7bGV0IGEsZCx1O2g9PT0xP248MTI4JiYobz1uKTpoPT09Mj8oYT1pW3MrMV0sKGEmMTkyKT09PTEyOCYmKG89KG4mMzEpPDw2fGEmNjMsbzw9MTI3JiYobz1udWxsKSkpOmg9PT0zPyhhPWlbcysxXSxkPWlbcysyXSwoYSYxOTIpPT09MTI4JiYoZCYxOTIpPT09MTI4JiYobz0obiYxNSk8PDEyfChhJjYzKTw8NnxkJjYzLChvPD0yMDQ3fHxvPj01NTI5NiYmbzw9NTczNDMpJiYobz1udWxsKSkpOmg9PT00JiYoYT1pW3MrMV0sZD1pW3MrMl0sdT1pW3MrM10sKGEmMTkyKT09PTEyOCYmKGQmMTkyKT09PTEyOCYmKHUmMTkyKT09PTEyOCYmKG89KG4mMTUpPDwxOHwoYSY2Myk8PDEyfChkJjYzKTw8Nnx1JjYzLChvPD02NTUzNXx8bz49MTExNDExMikmJihvPW51bGwpKSksbz09PW51bGw/KG89NjU1MzMsaD0xKTpvPjY1NTM1JiYoby09NjU1MzYscis9U3RyaW5nLmZyb21DaGFyQ29kZShvPj4+MTAmMTAyM3w1NTI5Niksbz01NjMyMHxvJjEwMjMpLHIrPVN0cmluZy5mcm9tQ2hhckNvZGUobykscys9aH1yZXR1cm4gcn1mdW5jdGlvbiBxKGksdCxlKXtmb3IobGV0IHI9MCxzLG47cjx0Lmxlbmd0aDtyKyspe2lmKHM9dC5jaGFyQ29kZUF0KHIpLHM+NTUyOTUmJnM8NTczNDQpaWYobilpZihzPDU2MzIwKXtpW2UrK109MjM5LGlbZSsrXT0xOTEsaVtlKytdPTE4OSxuPXM7Y29udGludWV9ZWxzZSBzPW4tNTUyOTY8PDEwfHMtNTYzMjB8NjU1MzYsbj1udWxsO2Vsc2V7cz41NjMxOXx8cisxPT09dC5sZW5ndGg/KGlbZSsrXT0yMzksaVtlKytdPTE5MSxpW2UrK109MTg5KTpuPXM7Y29udGludWV9ZWxzZSBuJiYoaVtlKytdPTIzOSxpW2UrK109MTkxLGlbZSsrXT0xODksbj1udWxsKTtzPDEyOD9pW2UrK109czooczwyMDQ4P2lbZSsrXT1zPj42fDE5Mjooczw2NTUzNj9pW2UrK109cz4+MTJ8MjI0OihpW2UrK109cz4+MTh8MjQwLGlbZSsrXT1zPj4xMiY2M3wxMjgpLGlbZSsrXT1zPj42JjYzfDEyOCksaVtlKytdPXMmNjN8MTI4KX1yZXR1cm4gZX1mdW5jdGlvbiB4KGksdCl7dGhpcy54PWksdGhpcy55PXR9eC5wcm90b3R5cGU9e2Nsb25lKCl7cmV0dXJuIG5ldyB4KHRoaXMueCx0aGlzLnkpfSxhZGQoaSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKGkpfSxzdWIoaSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKGkpfSxtdWx0QnlQb2ludChpKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludChpKX0sZGl2QnlQb2ludChpKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KGkpfSxtdWx0KGkpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQoaSl9LGRpdihpKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoaSl9LHJvdGF0ZShpKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUoaSl9LHJvdGF0ZUFyb3VuZChpLHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZUFyb3VuZChpLHQpfSxtYXRNdWx0KGkpe3JldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQoaSl9LHVuaXQoKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCl9LHBlcnAoKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCl9LHJvdW5kKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sbWFnKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfSxlcXVhbHMoaSl7cmV0dXJuIHRoaXMueD09PWkueCYmdGhpcy55PT09aS55fSxkaXN0KGkpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKGkpKX0sZGlzdFNxcihpKXtjb25zdCB0PWkueC10aGlzLngsZT1pLnktdGhpcy55O3JldHVybiB0KnQrZSplfSxhbmdsZSgpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueSx0aGlzLngpfSxhbmdsZVRvKGkpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueS1pLnksdGhpcy54LWkueCl9LGFuZ2xlV2l0aChpKXtyZXR1cm4gdGhpcy5hbmdsZVdpdGhTZXAoaS54LGkueSl9LGFuZ2xlV2l0aFNlcChpLHQpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueCp0LXRoaXMueSppLHRoaXMueCppK3RoaXMueSp0KX0sX21hdE11bHQoaSl7Y29uc3QgdD1pWzBdKnRoaXMueCtpWzFdKnRoaXMueSxlPWlbMl0qdGhpcy54K2lbM10qdGhpcy55O3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfSxfYWRkKGkpe3JldHVybiB0aGlzLngrPWkueCx0aGlzLnkrPWkueSx0aGlzfSxfc3ViKGkpe3JldHVybiB0aGlzLngtPWkueCx0aGlzLnktPWkueSx0aGlzfSxfbXVsdChpKXtyZXR1cm4gdGhpcy54Kj1pLHRoaXMueSo9aSx0aGlzfSxfZGl2KGkpe3JldHVybiB0aGlzLngvPWksdGhpcy55Lz1pLHRoaXN9LF9tdWx0QnlQb2ludChpKXtyZXR1cm4gdGhpcy54Kj1pLngsdGhpcy55Kj1pLnksdGhpc30sX2RpdkJ5UG9pbnQoaSl7cmV0dXJuIHRoaXMueC89aS54LHRoaXMueS89aS55LHRoaXN9LF91bml0KCl7cmV0dXJuIHRoaXMuX2Rpdih0aGlzLm1hZygpKSx0aGlzfSxfcGVycCgpe2NvbnN0IGk9dGhpcy55O3JldHVybiB0aGlzLnk9dGhpcy54LHRoaXMueD0taSx0aGlzfSxfcm90YXRlKGkpe2NvbnN0IHQ9TWF0aC5jb3MoaSksZT1NYXRoLnNpbihpKSxyPXQqdGhpcy54LWUqdGhpcy55LHM9ZSp0aGlzLngrdCp0aGlzLnk7cmV0dXJuIHRoaXMueD1yLHRoaXMueT1zLHRoaXN9LF9yb3RhdGVBcm91bmQoaSx0KXtjb25zdCBlPU1hdGguY29zKGkpLHI9TWF0aC5zaW4oaSkscz10LngrZSoodGhpcy54LXQueCktcioodGhpcy55LXQueSksbj10LnkrcioodGhpcy54LXQueCkrZSoodGhpcy55LXQueSk7cmV0dXJuIHRoaXMueD1zLHRoaXMueT1uLHRoaXN9LF9yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc30sY29uc3RydWN0b3I6eH0seC5jb252ZXJ0PWZ1bmN0aW9uKGkpe2lmKGkgaW5zdGFuY2VvZiB4KXJldHVybiBpO2lmKEFycmF5LmlzQXJyYXkoaSkpcmV0dXJuIG5ldyB4KCtpWzBdLCtpWzFdKTtpZihpLnghPT12b2lkIDAmJmkueSE9PXZvaWQgMClyZXR1cm4gbmV3IHgoK2kueCwraS55KTt0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIFt4LCB5XSBvciB7eCwgeX0gcG9pbnQgZm9ybWF0Iil9O2NsYXNzIGt7Y29uc3RydWN0b3IodCxlLHIscyxuKXt0aGlzLnByb3BlcnRpZXM9e30sdGhpcy5leHRlbnQ9cix0aGlzLnR5cGU9MCx0aGlzLmlkPXZvaWQgMCx0aGlzLl9wYmY9dCx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPXMsdGhpcy5fdmFsdWVzPW4sdC5yZWFkRmllbGRzKGosdGhpcyxlKX1sb2FkR2VvbWV0cnkoKXtjb25zdCB0PXRoaXMuX3BiZjt0LnBvcz10aGlzLl9nZW9tZXRyeTtjb25zdCBlPXQucmVhZFZhcmludCgpK3QucG9zLHI9W107bGV0IHMsbj0xLG89MCxoPTAsYT0wO2Zvcig7dC5wb3M8ZTspe2lmKG88PTApe2NvbnN0IGQ9dC5yZWFkVmFyaW50KCk7bj1kJjcsbz1kPj4zfWlmKG8tLSxuPT09MXx8bj09PTIpaCs9dC5yZWFkU1ZhcmludCgpLGErPXQucmVhZFNWYXJpbnQoKSxuPT09MSYmKHMmJnIucHVzaChzKSxzPVtdKSxzJiZzLnB1c2gobmV3IHgoaCxhKSk7ZWxzZSBpZihuPT09NylzJiZzLnB1c2goc1swXS5jbG9uZSgpKTtlbHNlIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBjb21tYW5kICR7bn1gKX1yZXR1cm4gcyYmci5wdXNoKHMpLHJ9YmJveCgpe2NvbnN0IHQ9dGhpcy5fcGJmO3QucG9zPXRoaXMuX2dlb21ldHJ5O2NvbnN0IGU9dC5yZWFkVmFyaW50KCkrdC5wb3M7bGV0IHI9MSxzPTAsbj0wLG89MCxoPTEvMCxhPS0xLzAsZD0xLzAsdT0tMS8wO2Zvcig7dC5wb3M8ZTspe2lmKHM8PTApe2NvbnN0IHc9dC5yZWFkVmFyaW50KCk7cj13Jjcscz13Pj4zfWlmKHMtLSxyPT09MXx8cj09PTIpbis9dC5yZWFkU1ZhcmludCgpLG8rPXQucmVhZFNWYXJpbnQoKSxuPGgmJihoPW4pLG4+YSYmKGE9biksbzxkJiYoZD1vKSxvPnUmJih1PW8pO2Vsc2UgaWYociE9PTcpdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIGNvbW1hbmQgJHtyfWApfXJldHVybltoLGQsYSx1XX10b0dlb0pTT04odCxlLHIpe2NvbnN0IHM9dGhpcy5leHRlbnQqTWF0aC5wb3coMixyKSxuPXRoaXMuZXh0ZW50KnQsbz10aGlzLmV4dGVudCplLGg9dGhpcy5sb2FkR2VvbWV0cnkoKTtmdW5jdGlvbiBhKGwpe3JldHVyblsobC54K24pKjM2MC9zLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoKDEtKGwueStvKSoyL3MpKk1hdGguUEkpKS05MF19ZnVuY3Rpb24gZChsKXtyZXR1cm4gbC5tYXAoYSl9bGV0IHU7aWYodGhpcy50eXBlPT09MSl7Y29uc3QgbD1bXTtmb3IoY29uc3QgViBvZiBoKWwucHVzaChWWzBdKTtjb25zdCBjPWQobCk7dT1sLmxlbmd0aD09PTE/e3R5cGU6IlBvaW50Iixjb29yZGluYXRlczpjWzBdfTp7dHlwZToiTXVsdGlQb2ludCIsY29vcmRpbmF0ZXM6Y319ZWxzZSBpZih0aGlzLnR5cGU9PT0yKXtjb25zdCBsPWgubWFwKGQpO3U9bC5sZW5ndGg9PT0xP3t0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpsWzBdfTp7dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpsfX1lbHNlIGlmKHRoaXMudHlwZT09PTMpe2NvbnN0IGw9VyhoKSxjPVtdO2Zvcihjb25zdCBWIG9mIGwpYy5wdXNoKFYubWFwKGQpKTt1PWMubGVuZ3RoPT09MT97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6Y1swXX06e3R5cGU6Ik11bHRpUG9seWdvbiIsY29vcmRpbmF0ZXM6Y319ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gZmVhdHVyZSB0eXBlIik7Y29uc3Qgdz17dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6dSxwcm9wZXJ0aWVzOnRoaXMucHJvcGVydGllc307cmV0dXJuIHRoaXMuaWQhPW51bGwmJih3LmlkPXRoaXMuaWQpLHd9fWsudHlwZXM9WyJVbmtub3duIiwiUG9pbnQiLCJMaW5lU3RyaW5nIiwiUG9seWdvbiJdO2Z1bmN0aW9uIGooaSx0LGUpe2k9PT0xP3QuaWQ9ZS5yZWFkVmFyaW50KCk6aT09PTI/TyhlLHQpOmk9PT0zP3QudHlwZT1lLnJlYWRWYXJpbnQoKTppPT09NCYmKHQuX2dlb21ldHJ5PWUucG9zKX1mdW5jdGlvbiBPKGksdCl7Y29uc3QgZT1pLnJlYWRWYXJpbnQoKStpLnBvcztmb3IoO2kucG9zPGU7KXtjb25zdCByPXQuX2tleXNbaS5yZWFkVmFyaW50KCldLHM9dC5fdmFsdWVzW2kucmVhZFZhcmludCgpXTt0LnByb3BlcnRpZXNbcl09c319ZnVuY3Rpb24gVyhpKXtjb25zdCB0PWkubGVuZ3RoO2lmKHQ8PTEpcmV0dXJuW2ldO2NvbnN0IGU9W107bGV0IHIscztmb3IobGV0IG49MDtuPHQ7bisrKXtjb25zdCBvPUooaVtuXSk7byE9PTAmJihzPT09dm9pZCAwJiYocz1vPDApLHM9PT1vPDA/KHImJmUucHVzaChyKSxyPVtpW25dXSk6ciYmci5wdXNoKGlbbl0pKX1yZXR1cm4gciYmZS5wdXNoKHIpLGV9ZnVuY3Rpb24gSihpKXtsZXQgdD0wO2ZvcihsZXQgZT0wLHI9aS5sZW5ndGgscz1yLTEsbixvO2U8cjtzPWUrKyluPWlbZV0sbz1pW3NdLHQrPShvLngtbi54KSoobi55K28ueSk7cmV0dXJuIHR9Y2xhc3MgWHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudmVyc2lvbj0xLHRoaXMubmFtZT0iIix0aGlzLmV4dGVudD00MDk2LHRoaXMubGVuZ3RoPTAsdGhpcy5fcGJmPXQsdGhpcy5fa2V5cz1bXSx0aGlzLl92YWx1ZXM9W10sdGhpcy5fZmVhdHVyZXM9W10sdC5yZWFkRmllbGRzKCQsdGhpcyxlKSx0aGlzLmxlbmd0aD10aGlzLl9mZWF0dXJlcy5sZW5ndGh9ZmVhdHVyZSh0KXtpZih0PDB8fHQ+PXRoaXMuX2ZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcyIpO3RoaXMuX3BiZi5wb3M9dGhpcy5fZmVhdHVyZXNbdF07Y29uc3QgZT10aGlzLl9wYmYucmVhZFZhcmludCgpK3RoaXMuX3BiZi5wb3M7cmV0dXJuIG5ldyBrKHRoaXMuX3BiZixlLHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX19ZnVuY3Rpb24gJChpLHQsZSl7aT09PTE1P3QudmVyc2lvbj1lLnJlYWRWYXJpbnQoKTppPT09MT90Lm5hbWU9ZS5yZWFkU3RyaW5nKCk6aT09PTU/dC5leHRlbnQ9ZS5yZWFkVmFyaW50KCk6aT09PTI/dC5fZmVhdHVyZXMucHVzaChlLnBvcyk6aT09PTM/dC5fa2V5cy5wdXNoKGUucmVhZFN0cmluZygpKTppPT09NCYmdC5fdmFsdWVzLnB1c2goYihlKSl9ZnVuY3Rpb24gYihpKXtsZXQgdD1udWxsO2NvbnN0IGU9aS5yZWFkVmFyaW50KCkraS5wb3M7Zm9yKDtpLnBvczxlOyl7Y29uc3Qgcj1pLnJlYWRWYXJpbnQoKT4+Mzt0PXI9PT0xP2kucmVhZFN0cmluZygpOnI9PT0yP2kucmVhZEZsb2F0KCk6cj09PTM/aS5yZWFkRG91YmxlKCk6cj09PTQ/aS5yZWFkVmFyaW50NjQoKTpyPT09NT9pLnJlYWRWYXJpbnQoKTpyPT09Nj9pLnJlYWRTVmFyaW50KCk6cj09PTc/aS5yZWFkQm9vbGVhbigpOm51bGx9aWYodD09bnVsbCl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gZmVhdHVyZSB2YWx1ZSIpO3JldHVybiB0fWNsYXNzIHp7Y29uc3RydWN0b3IodCxlKXt0aGlzLmxheWVycz10LnJlYWRGaWVsZHMoWSx7fSxlKX19ZnVuY3Rpb24gWShpLHQsZSl7aWYoaT09PTMpe2NvbnN0IHI9bmV3IFgoZSxlLnJlYWRWYXJpbnQoKStlLnBvcyk7ci5sZW5ndGgmJih0W3IubmFtZV09cil9fWFzeW5jIGZ1bmN0aW9uIEsoaSx0LGUscil7dHJ5e2NvbnN0IHM9UShpLHQsZSxyKTtyZXR1cm57eDp0LHk6ZSx6OnIsbGF5ZXJzOnMsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YUZvcm1hdDoibXZ0In19Y2F0Y2gocyl7dGhyb3cgY29uc29sZS5lcnJvcigi6Kej5p6Q55+i6YeP55Om54mH5pWw5o2u5pe25Ye66ZSZOiIscyksc319ZnVuY3Rpb24gUShpLHQsZSxyKXtjb25zdCBzPW5ldyBNKGkpLG49bmV3IHoocyksbz17fTtmb3IoY29uc3QgaCBpbiBuLmxheWVycyl7Y29uc3QgYT1uLmxheWVyc1toXSxkPVtdO2ZvcihsZXQgdT0wO3U8YS5sZW5ndGg7dSsrKXtjb25zdCBsPWEuZmVhdHVyZSh1KS50b0dlb0pTT04odCxlLHIpO2QucHVzaChsKX1vW2hdPWR9cmV0dXJuIG99c2VsZi5vbm1lc3NhZ2U9YXN5bmMgaT0+e2NvbnN0IHQ9aS5kYXRhO3RyeXtjb25zdCBlPWF3YWl0IEsodC5hcnJheUJ1ZmZlcix0LngsdC55LHQueik7c2VsZi5wb3N0TWVzc2FnZShlKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKCJXb3JrZXIgTVZUIOino+aekOWksei0pToiLGUpLHNlbGYucG9zdE1lc3NhZ2Uoe2Vycm9yOmUubWVzc2FnZX0pfX19KSgpOwo=",av=r=>Uint8Array.from(atob(r),e=>e.charCodeAt(0)),Wh=typeof self<"u"&&self.Blob&&new Blob([av(Gh)],{type:"text/javascript;charset=utf-8"});function lv(r){let e;try{if(e=Wh&&(self.URL||self.webkitURL).createObjectURL(Wh),!e)throw"";const t=new Worker(e,{name:r?.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;base64,"+Gh,{name:r?.name})}finally{e&&(self.URL||self.webkitURL).revokeObjectURL(e)}}var cv=Object.defineProperty,hv=(r,e,t)=>e in r?cv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Ws=(r,e,t)=>hv(r,typeof e!="symbol"?e+"":e,t);const uv=10;class dv{constructor(){Ws(this,"info",{version:"1.0.0",description:"Vector Tile loader for Mapbox Vector Tile format. It can load and parse MVT data."}),Ws(this,"dataType","VectorTile"),Ws(this,"fileLoader",new p.FileLoader(De.manager)),Ws(this,"_workerPool",new $o(0)),this.fileLoader.setResponseType("arraybuffer"),this._workerPool.setWorkerCreator(()=>new lv)}async load(e){const{source:t,x:i,y:n,z:s}=e,a=typeof t._getUrl=="function"?t._getUrl(i,n,s):this.buildTileUrl(t.url,i,n,s);if(!a)return this.createErrorGeometry(i,n,s,new Error("VectorTileLoader: source._getUrl 返回空 URL"));this._workerPool.pool===0&&this._workerPool.setWorkerLimit(uv);try{const c=await this.fetchVectorData(a),h={arrayBuffer:c,x:i,y:n,z:s},m=(await this._workerPool.postMessage(h,[c])).data;if(m.error)throw new Error(m.error);const f=this.createGeometryWithVectorData(m,e);return De.manager.parseEnd(a),f}catch(c){return this.createErrorGeometry(i,n,s,c)}}async fetchVectorData(e){try{const t=await this.fileLoader.loadAsync(e);if(!t||t.byteLength===0)throw new Error("Empty response");return t}catch(t){throw new Error(`Failed to fetch vector tile: ${t.message}`)}}calculateTileBounds(e,t,i){const n=4007501668557849e-8/Math.pow(2,i),s=-20037508342789244e-9+e*n,a=s+n,c=20037508342789244e-9-(t+1)*n,h=c+n;return{min:new p.Vector2(s,c),max:new p.Vector2(a,h),world:new p.Vector2(n,n)}}buildTileUrl(e,t,i,n){return e.replace("{x}",t.toString()).replace("{y}",i.toString()).replace("{z}",n.toString()).replace("{-y}",(Math.pow(2,n)-1-i).toString())}createGeometryWithVectorData(e,t){const i=new jn;return i.userData={vectorData:e,tileInfo:{x:t.x,y:t.y,z:t.z,bounds:t.bounds},metadata:{dataType:"vector-tile",version:"1.0.0",loadedAt:Date.now()}},i}createErrorGeometry(e,t,i,n){const s=new jn;return s.userData={vectorData:{x:e,y:t,z:i,layers:{},totalFeatures:0,bounds:this.calculateTileBounds(e,t,i),error:n.message,timestamp:Date.now(),dataFormat:"error"},tileInfo:{x:e,y:t,z:i,bounds:[0,0,0,0]},metadata:{dataType:"vector-tile-error",error:!0,errorMessage:n.message}},s}unload(e){e.userData?.vectorData&&(e.userData.vectorData=null),e.dispose&&e.dispose()}static getVectorData(e){return e.userData?.vectorData||null}static hasValidVectorData(e){const t=this.getVectorData(e);return t&&!t.error&&t.totalFeatures>0}static getLayerNames(e){const t=this.getVectorData(e);return t?Object.keys(t.layers||{}):[]}static getFeaturesByLayer(e,t){return this.getVectorData(e)?.layers?.[t]?.convertedFeatures||[]}}wh(new dv);var fv=Object.defineProperty,pv=(r,e,t)=>e in r?fv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,qi=(r,e,t)=>pv(r,typeof e!="symbol"?e+"":e,t);class wa extends hh{constructor(e,t){if(super(e,t),qi(this,"layerType","vector"),qi(this,"_tileDataMap",new Map),qi(this,"_renderer"),qi(this,"_style"),qi(this,"_feaList",[]),qi(this,"_collision",!1),qi(this,"_renderAltitude",0),qi(this,"_eventsBound",!1),!t.style)throw new Error("VectorTileLayer must provide style configuration! VectorTileLayer 必须提供样式配置");this._style=t.style,this._collision=t.collision||!1,this._featureFilter=t.featureFilter,this._renderAltitude=t.altitude||0,this._rootTile.setDataOnlyMode(!0),this._setupDataModeAndListenersForChildren(),this._setupLifeCycleListeners()}_setupDataModeAndListenersForChildren(){const e=t=>{t!==this._rootTile&&t.setDataOnlyMode(!0),this._addShownListenerToTile(t),this._addUnloadListenerToTile(t)};this._rootTile.addEventListener("tile-created",t=>{const i=t.tile;e(i)}),this._rootTile.traverse(t=>{t.isTile&&e(t)})}_addShownListenerToTile(e){const t=i=>{const n=i.tile,s=`${n.z}-${n.x}-${n.y}`,a=!!this._renderer,c=this._tileDataMap.get(s);a&&c&&this._renderer.processTileData(n,c.data)};e.addEventListener("tile-shown",t)}_addUnloadListenerToTile(e){const t=i=>{const n=i.tile||i.target,s=`${n.z}-${n.x}-${n.y}`;if(this._renderer)try{this._renderer.removeFeaturesByTileKey(s)}catch{}this._tileDataMap.delete(s)};e.addEventListener("unload",t)}setAltitude(e){return super.setAltitude(0),this._renderAltitude=e,this._renderer&&this._renderer.setAltitude(e),this}getAltitude(){return this._renderAltitude}_addHiddenListenerToTile(e){const t=i=>{const n=i.tile,s=`${n.z}-${n.x}-${n.y}`;if(this._renderer)try{this._renderer.hideFeaturesByTileKey(s)}catch{}};e.addEventListener("tile-hidden",t)}_setupLifeCycleListeners(){this._rootTile.addEventListener("tile-loaded",e=>{const t=e.tile,i=`${t.z}-${t.x}-${t.y}`,n=this.getVectorDataFromTile(t);if(!n){console.warn(`[VectorTileLayer] Tile ${i} loaded but has no vector data.`);return}if(n.vectorData?.dataFormat==="mvt"&&this._tileDataMap.set(i,{data:n,tile:t,timestamp:Date.now(),pending:!1}),t.showing&&this._renderer&&n.vectorData?.dataFormat==="mvt")try{this._renderer.processTileData(t,n)}catch{}})}getVectorDataFromTile(e){return!e.geometry||!e.getVectorData()?null:e.getVectorData()}createLoader(){const e=new Ls;return e.vtSource=this.source,e}getVisibleVectorTiles(){const e=[];return this._rootTile.traverse(t=>{if(t.isTile&&t.loaded&&t.inFrustum){const i=`${t.z}-${t.x}-${t.y}`,n=this._tileDataMap.get(i);n&&e.push({tileKey:i,data:n.data,tile:n.tile})}}),e}getAllVectorData(){return new Map(this._tileDataMap)}getVectorData(e,t,i){const n=`${i}-${e}-${t}`,s=this._tileDataMap.get(n);return s?s.data:null}setFeatureFilter(e){this._featureFilter=e,this._renderer&&this._renderer.setFeatureFilter(e)}clearFeatureFilter(){this._featureFilter=void 0,this._renderer&&this._renderer.clearFeatureFilter()}setOpacity(e){this.opacity=e,this._renderer&&this._renderer.setOpacity(e)}hide(){return super.hide(),this._renderer&&this._renderer.hide(),this}show(){return super.show(),this._renderer&&this._renderer.show(),this}update(e){!this.enabled||!this.visible||super.update(e)}dispose(){this._renderer&&this._renderer.dispose(),super.dispose()}setFeaturePickingEnabled(e){this.options.enableFeaturePicking=e,this._renderer&&(this._renderer.interactive=e,e&&!this._eventsBound&&this._bindRendererEvents(this._renderer))}_bindRendererEvents(e){if(this._eventsBound)return;["click","dblclick","mousedown","mouseup","mousemove","mouseenter","mouseleave","mouseover","mouseout","contextmenu"].forEach(i=>{const n="feature"+i;e.on(n,s=>{this.trigger(n,s)})}),this._eventsBound=!0}_setRenderer(e){this._renderer=e,this._eventsBound=!1,this.options.enableFeaturePicking&&this._bindRendererEvents(e)}_getRenderer(){return this._renderer||null}getProcessStats(){return this._renderer?this._renderer.getProcessStats():null}resetProcessStats(){this._renderer?.resetProcessStats()}getStyle(){return this._style}setStyle(e){if(this._style=e,this._renderer){this._renderer.style=e;const t=performance.now();let i=0;this._tileDataMap.forEach((a,c)=>{this._renderer.removeFeaturesByTileKey(c)}),this.getVisibleVectorTiles().forEach(({tile:a,data:c})=>{this._renderer.processTileData(a,c),i++});const s=performance.now()-t;console.log(`[setStyle] 重新处理 ${i} 个瓦片 耗时: ${s.toFixed(2)}ms`)}return this}setSymbol(e){return this.setStyle(e)}}var mv=Object.defineProperty,gv=(r,e,t)=>e in r?mv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Be=(r,e,t)=>gv(r,typeof e!="symbol"?e+"":e,t);class yv{constructor(...e){}}const _v={};let Pn=class ff extends Qo(Yi(xn(yv))){constructor(e,t){Ko(e,"container","Map container element must be specified");const i=["center","basemap"];for(const W of i)wc(t,W);const s={...t,viewer:{...{viewer:{antialias:!0,stencil:!0,logarithmicDepthBuffer:!0}}.viewer,...t.viewer}};super(s),Be(this,"viewer"),Be(this,"tilemap"),Be(this,"center"),Be(this,"prjcenter"),Be(this,"_layerContainer"),Be(this,"_EventMap",{loaded:{listened:!1}}),Be(this,"_canvasManager",new $g),Be(this,"collisionEngine"),Be(this,"_onLoadHooks"),Be(this,"_minZoom",0),Be(this,"_maxZoom",22),Be(this,"_ZOOM_MIN_CONST",0),Be(this,"_ZOOM_MAX_CONST",22),Be(this,"_minZoomDistance",500),Be(this,"_maxZoomDistance",8e4),Be(this,"_isZooming",!1),Be(this,"_zoomStartValue",0),Be(this,"_lastZoomForControls",0),Be(this,"_overZoom",0),Be(this,"_lastCameraDistance",0),this.tilemap=this.initTileMap(s.basemap),this.center=this.options.center,this.viewer=new Cc(e,{...s.viewer,map:this}),this.tilemap.receiveShadow=!0,this.viewer.scene.add(this.tilemap);const a=this.tilemap.geo2world(new p.Vector3(this.center[0],this.center[1],0));this.prjcenter=a;const c=this.options.viewer??{};this.viewer.flyToPoint({center:this.center,distance:typeof this.center[2]=="number"?this.center[2]:void 0,polarDeg:typeof c.polarDeg=="number"?c.polarDeg:void 0,azimuthDeg:typeof c.azimuthDeg=="number"?c.azimuthDeg:void 0,polarAngle:c.polarAngle,azimuthAngle:c.azimuthAngle,duration:0,curvePath:!1}),this._minZoomDistance=this.viewer.controls.minDistance,this._maxZoomDistance=this.viewer.controls.maxDistance;const h=this._getCameraDistance();this._lastCameraDistance=h,this._layerContainer=new jg,this.viewer.scene.add(this._layerContainer);const d=this.viewer.controls;this._minZoomDistance=typeof d?.minDistance=="number"?d.minDistance:500,this._maxZoomDistance=typeof d?.maxDistance=="number"?d.maxDistance:8e4;const f=this.tilemap.getLayers().find(W=>W.isBaseLayer===!0)?.minLevel??this.tilemap.minLevel;this._minZoom=Math.max(this._ZOOM_MIN_CONST,Math.min(this._ZOOM_MAX_CONST,f)),this._maxZoom=this._ZOOM_MAX_CONST;const g=this.prjcenter,w=this.viewer.camera.position.clone().clone().sub(g).normalize(),x=us(t.zoom)?13:t.zoom,L=Math.max(this._minZoom,Math.min(this._maxZoom,x)),M=this._computeDistanceFromZoom(L);a.clone().addScaledVector(w,M);const C=this.getZoom();this._lastZoomForControls=C,this._zoomStartValue=C,this.collisionEngine=new C0(this.viewer.renderer,{padding:8,updateInterval:16,animationDuration:200,maxFeaturesPerFrame:2e4,strategies:{priority:!0,grouping:!0,proximity:!0}}),this.on("control-change",T0.debounce(W=>{if(!this.tilemap||!this.collisionEngine)return;const D=this.tilemap,z=D.getDataZoom(),I=D.getLayers().find(H=>H.isBaseLayer===!0)?.maxLevel??D.maxLevel,U=this._getCameraDistance(),V=U-this._lastCameraDistance;this._lastCameraDistance=U;const{max:G}=this._getViewZoomRange(),N=Math.max(0,G-I);z<I?this._overZoom=0:V<-.001?this._overZoom=Math.min(this._overZoom+1,N):V>.001&&(this._overZoom=Math.max(this._overZoom-1,0));const j=this.getZoom();Math.abs(j-this._lastZoomForControls)>.001&&(this._isZooming?this.trigger("zooming",{from:this._zoomStartValue,to:j}):(this._isZooming=!0,this._zoomStartValue=this._lastZoomForControls,this.trigger("zoomstart",{from:this._zoomStartValue,to:j})),this._lastZoomForControls=j),this.collisionEngine.update(W.camera)},10,{leading:!1,trailing:!0})),this.on("control-end",()=>{this._isZooming&&(this._isZooming=!1,this.trigger("zoomend",{from:this._zoomStartValue,to:this.getZoom()}))}),this._callOnLoadHooks()}static addOnLoadHook(e,...t){const i=typeof e=="function"?e:function(){this[e].apply(this,t)},n=this.prototype;return n._onLoadHooks=n._onLoadHooks||[],n._onLoadHooks.push(i),this}_callOnLoadHooks(){const e=ff.prototype;if(e._onLoadHooks)for(let t=0,i=e._onLoadHooks.length;t<i;t++)e._onLoadHooks[t].call(this)}getZoom(){const e=this.tilemap,t=e.getDataZoom(),n=e.getLayers().find(s=>s.isBaseLayer===!0)?.maxLevel??e.maxLevel;return t<n?t:n+this._overZoom}getDataZoom(){return this.tilemap.getDataZoom()}getMinZoom(){return this._minZoom}getMaxZoom(){return this._maxZoom}setZoomRange(e,t){if(e>t){const n=e;e=t,t=n}this._minZoom=e,this._maxZoom=t;const i=this.viewer.controls;if(i){const n=this._computeDistanceFromZoom(this._maxZoom),s=this._computeDistanceFromZoom(this._minZoom);i.minDistance=n,i.maxDistance=s}return this}setMinZoom(e){return this.setZoomRange(e,this._maxZoom)}setMaxZoom(e){return this.setZoomRange(this._minZoom,e)}setZoom(e){const t=this.getMinZoom(),i=this.getMaxZoom(),n=Math.max(t,Math.min(i,e)),s=this.getZoom(),a=this._computeDistanceFromZoom(n),c=this.viewer.controls,h=c?.target??this.prjcenter,d=this.viewer.camera,m=d.position.clone().sub(h).normalize();return d.position.copy(h).addScaledVector(m,a),d.updateProjectionMatrix(),typeof c?.update=="function"&&c.update(),this._lastZoomForControls=n,this.trigger("zoomend",{from:s,to:this.getZoom()}),this}zoomIn(e=1){return this.setZoom(this.getZoom()+e)}zoomOut(e=1){return this.setZoom(this.getZoom()-e)}_computeDistanceFromZoom(e){const t=this._ZOOM_MIN_CONST,i=this._ZOOM_MAX_CONST,n=this._minZoomDistance,s=this._maxZoomDistance;if(n<=0||n>=s){const m=Math.max(t,Math.min(i,e)),f=(i-m)/(i-t);return n+f*(s-n)}const c=(Math.max(t,Math.min(i,e))-t)/(i-t),h=n/s;return s*Math.pow(h,c)}initTileMap(e){const t=new gs({...e});try{if(e.Baselayers?.length)for(const i of e.Baselayers)i.isBaseLayer=!0,t.addLayer(i)}catch(i){console.error("💥 Diagnostic failed 诊断失败:",i)}return t.rotateX(-Math.PI/2),t.receiveShadow=!0,setTimeout(()=>{const i={timestamp:xc(),targrt:this};this._EventMap.loaded={listened:!0},this.trigger("loaded",i)},0),t}addLayer(e,...t){if(!e)return this;Array.isArray(e)||(e=[e]),t?.length&&(e=e.concat(t)),t?.length&&(e=e.concat(t));for(let i=0,n=e.length;i<n;i++){const s=e[i],a=s.getId();if(us(a))throw new Error("Invalid id for the layer: "+a);s.isTileLayer?this.addTileLayer(s):this.addRegularLayer(s)}return this}removeLayer(e){const t=typeof e=="string"?e:e.getId(),i=this.tilemap.getLayer(t);if(i){if(i instanceof wa){const s=i._getRenderer();s&&this._layerContainer.remove(s)}return this.tilemap.removeLayer(t),!0}const n=this._layerContainer.getLayerById(t);return n?(this._layerContainer.remove(n),n instanceof ji&&n?._collision,!0):(console.warn(`⚠️ Layer does not exist 图层不存在: ${t}`),!1)}addRegularLayer(e){this._layerContainer.add(e),e._bindMap(this),e instanceof ji&&e?._collision&&(this.collisionEngine.registerLayer(e),e.setCollisionEngine(this.collisionEngine))}addTileLayer(e){if(this.tilemap.addLayer(e),e._bindMap(this),e instanceof wa){const t=e.options||{},i=new Ms(e.getId()+"-vtrender",{altitude:e.getAltitude(),style:e.getStyle(),collision:e._collision,zIndex:typeof t.zIndex=="number"?t.zIndex:void 0,depthOffset:typeof t.depthOffset=="number"?t.depthOffset:void 0});t.enableFeaturePicking&&(i.interactive=!0),e._setRenderer(i),this.addRegularLayer(i)}return this}clearLayers(){return this._layerContainer.clear(),this.tilemap.clearLayers(),this}getLayers(){const e=this._layerContainer.getLayers().filter(i=>!(i instanceof Ms)),t=this.tilemap.getLayers();return[...e,...t]}getLayerById(e){const t=this._layerContainer.getLayerById(e);return t?t instanceof Ms?void 0:t:this.tilemap.getLayer(e)}geo2world(e){return this.tilemap.geo2world(e)}world2geo(e){return this.tilemap.world2geo(e)}geo2map(e){return this.tilemap.geo2map(e)}_getCanvas(e=40,t=30,i){return this._canvasManager.getCanvas(e,t,1,i)}getContainer(){return this.viewer.container}getRenderer(){return this.viewer.renderer}getCamera(){return this.viewer.camera}_findFeaturesAt(e){const t=this,i=t.getRenderer(),n=t.getCamera(),s=i.domElement.getBoundingClientRect(),a=e.x/s.width*2-1,c=-(e.y/s.height)*2+1,h=new p.Raycaster;h.setFromCamera(new p.Vector2(a,c),n);const d=[...t.getLayers(),...t._layerContainer.getLayers().filter(g=>g instanceof Ms&&g.interactive)].filter(g=>!g?.isSceneLayer&&g?.visible===!0),f=h.intersectObjects(d,!0).map(g=>{let _=g.object,w=null;for(;_;){if(_ instanceof dt){w=_;break}_=_.parent}if(!w||w.visible===!1)return null;const b=t.world2geo(g.point);return{feature:w,distance:g.distance,object:g.object,intersectcoordinate:[b.x,b.y,b.z]}}).filter(g=>!!g);return f.length?f.sort((g,_)=>(g?.distance??0)-(_?.distance??0)):[]}getCenter(){const e=this.viewer.controls.target.clone(),t=this.world2geo(e);return[t.x,t.y,t.z]}_getEventPosition(e){let t,i;if("touches"in e){if(e.touches.length===0)return null;t=e.touches[0].clientX,i=e.touches[0].clientY}else t=e.clientX,i=e.clientY;const n=this.getContainer();if(!n)return null;const s=n.getBoundingClientRect();return{x:t-s.left,y:i-s.top}}get isInteracting(){return this.viewer?this.viewer.isInteracting:!1}_getCameraDistance(){const e=this.viewer.controls,t=this.viewer.camera,i=e?.target??this.prjcenter;return e&&typeof e.getDistance=="function"?e.getDistance():t.position.distanceTo(i)}_getViewZoomRange(){const e=this.viewer.controls,t=typeof e?.minDistance=="number"?e.minDistance:this._minZoomDistance,i=typeof e?.maxDistance=="number"?e.maxDistance:this._maxZoomDistance;if(t<=0||t>=i){const f=this.tilemap.getDataZoom();return{min:f,max:f}}const n=i/t,s=Math.log2(n),a=this.tilemap.getLayers().find(f=>f.isBaseLayer===!0),c=a?.minLevel??this.tilemap.minLevel,h=a?.maxLevel??this.tilemap.maxLevel,d=c,m=h+s;return{min:d,max:m}}flyTo(e){this.viewer.flyToAdvanced(e)}flyToPoint(e){this.viewer.flyToPoint(e)}destroy(){try{this._clearHandlers(),["control-change","control-start","control-end","zoomstart","zooming","zoomend","loaded"].forEach(t=>{const i=this._listenerMap?.get(t);i&&i.forEach((n,s)=>{this.off(t,s)})}),this.clearLayers(),Ac.clearCache(),this.collisionEngine&&(this.collisionEngine=null),this._layerContainer&&(this._layerContainer.clear(),this._layerContainer=null),this.tilemap&&(this.tilemap.dispose(),this.tilemap=null),this._canvasManager&&(this._canvasManager=null),this.viewer&&(this.viewer.destroy(),this.viewer=null),this._EventMap={loaded:{listened:!1}}}catch(e){console.error("Error destroying map 销毁地图时出错:",e)}}};Pn.mergeOptions(_v);const vv=["click","dblclick","mousedown","mouseup","mousemove","mouseenter","mouseleave","mouseover","mouseout"];Pn.prototype._removeDomEvents=function(){},Pn.prototype._registerDomEvents=function(){const r=this.viewer.container;if(r){let t=null;vv.forEach(i=>{r.addEventListener(i,n=>{if(!this.viewer||!this.tilemap)return;if(i==="mousedown"&&(t={x:n.clientX,y:n.clientY}),i==="click"&&t){const c=n.clientX-t.x,h=n.clientY-t.y;if(Math.sqrt(c*c+h*h)>5)return}let s=sa(n,this.tilemap,this.viewer.camera),a={target:this,originEvent:n,eventName:i,screenXY:{X:n.screenX,Y:n.screenY}};if(s){let c=[s.x,s.y,s.z];a={target:this,originEvent:n,coordinate:c,eventName:i,screenXY:{X:n.screenX,Y:n.screenY}}}this.trigger(i,a)})})}},Pn.addOnLoadHook("_registerDomEvents");var wv=Object.defineProperty,bv=(r,e,t)=>e in r?wv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,ba=(r,e,t)=>bv(r,typeof e!="symbol"?e+"":e,t);const xv=["click","dblclick","mousedown","mouseup","mousemove","mouseenter","mouseleave","mouseover","mouseout","contextmenu","touchstart","touchmove","touchend"];class Mv extends ds{constructor(){super(...arguments),ba(this,"_registeredEvents",[]),ba(this,"_mouseDownTime",0),ba(this,"_eventCommon",e=>{(e.type==="mousedown"||e.type==="touchstart")&&(this._mouseDownTime=Date.now()),!(e.type==="click"&&Date.now()-this._mouseDownTime>300)&&this._handleEvent(e,e.type)})}addHooks(){const t=this.target.getContainer();t&&xv.forEach(i=>{t.addEventListener(i,this._eventCommon),this._registeredEvents.push(i)})}removeHooks(){const t=this.target.getContainer();t&&this._registeredEvents.length>0&&(this._registeredEvents.forEach(i=>{const n=i;t.removeEventListener(n,this._eventCommon)}),this._registeredEvents=[])}_handleEvent(e,t){const i=this.target;if(!i||!i.viewer||this._shouldIgnoreEvent(t)||(t==="mousemove"||t==="mouseenter"||t==="mouseleave"||t==="mouseover"||t==="mouseout"||t==="touchmove")&&!i.getLayers().some(h=>!h.isSceneLayer&&h._feaList?.length>0))return;const n=i._getEventPosition(e);if(!n)return;const s=i._findFeaturesAt(n);if(s.length===0)return;const a=s[0].feature;switch(t){case"click":this._handleClickEvent(a,e);break;case"mousemove":case"mouseenter":case"mouseleave":case"mouseover":case"mouseout":case"touchmove":this.handleMoveEvent(a,e);break;default:if(a){this._fireFeatureEvent(a,t,e);const c=a.getLayer();c&&c.trigger("feature"+t,{feature:a,domEvent:e,type:"feature"+t})}}}_handleClickEvent(e,t){if(!e)return;this._fireFeatureEvent(e,"click",t);const i=e.getLayer();i&&i.trigger("featureclick",{feature:e,domEvent:t,type:"featureclick"})}handleMoveEvent(e,t){if(!e)return;this._fireFeatureEvent(e,t.type,t);const i=e.getLayer();i&&i.trigger("feature"+t.type,{feature:e,domEvent:t,type:"feature"+t.type})}_fireFeatureEvent(e,t,i){const n=this.target;if(!n||!n.tilemap||!n.viewer)return;let s=i,a,c;if("touches"in i){const f=i.touches[0]||i.changedTouches[0];if(!f)return;s={currentTarget:i.currentTarget,clientX:f.clientX,clientY:f.clientY},a=f.screenX,c=f.screenY}else{const f=i;s=f,a=f.screenX,c=f.screenY}const h=sa(s,n.tilemap,n.viewer.camera);if(!h)return;const d=[h.x,h.y,h.z],m={target:e,originEvent:i,coordinate:d,eventName:t,screenXY:{X:a,Y:c}};e.trigger(t,m)}_shouldIgnoreEvent(e){const t=this.target;return t.viewer?e==="mousedown"||e==="touchstart"?!1:!!t.isInteracting:!0}}Pn.mergeOptions({FeatureEvents:!0,onlyVisibleFeatureEvents:!0}),Pn.addOnLoadHook("addHandler","FeatureEvents",Mv);var Sv=Object.defineProperty,Lv=(r,e,t)=>e in r?Sv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,bi=(r,e,t)=>Lv(r,typeof e!="symbol"?e+"":e,t);let Pv=class{constructor(...e){}};const Zh=class mr extends Yi(xn(Pv)){constructor(e={}){super(e),bi(this,"_owner"),bi(this,"_map"),bi(this,"_worldPosition"),bi(this,"_coordinate"),bi(this,"_dom"),bi(this,"_visible",!1),bi(this,"_boundMapHandlers",new Map),bi(this,"_viewerUpdateHandler"),bi(this,"_positionedOnce",!1)}_getClassName(){return"UIComponent"}getOffset(){return{x:this.options.dx??0,y:this.options.dy??0}}addTo(e){if(!e)return this;this._owner=e;const t=typeof e.getMap=="function"?e.getMap():e;return t?(this._map=t,this._bindMapEvents(!0),this.options.single&&(mr._singletons.forEach(i=>{i!==this&&i.options.single&&i._map===t&&i.hide()}),mr._singletons.add(this)),this.onAdd&&this.onAdd(),this.trigger("add",{owner:e,map:t}),this):this}remove(){const e=this._map;return this.hideDom(),this._bindMapEvents(!1),this.options.single&&mr._singletons.delete(this),this.onRemove&&this.onRemove(),this.trigger("remove",{owner:this._owner,map:e}),this._owner=void 0,this._map=void 0,this}show(e){const t=this._map??(this._owner&&typeof this._owner.getMap=="function"?this._owner.getMap():void 0);if(!t)return this;if(this._map=t,this.options.single&&(mr._singletons.forEach(i=>{i!==this&&i.options.single&&i._map===t&&i.isVisible()&&i.hide()}),mr._singletons.add(this)),!this._dom){const i=this.buildOn();this._dom=i,i.style.position="absolute",typeof this.options.zIndex=="number"&&(i.style.zIndex=String(this.options.zIndex));const n=t.getContainer();if(!n)return this;n.appendChild(i)}return this._coordinate=e?[...e]:void 0,this._visible=!0,this._positionedOnce=!1,this._dom&&(this._dom.style.display="none"),this.trigger("show",{owner:this._owner,map:t}),this}hide(){return this._visible=!1,this._dom&&(this._dom.style.display="none"),this._coordinate=void 0,this.trigger("hide",{owner:this._owner,map:this._map}),this}hideDom(){return this._dom&&this._dom.parentElement&&(this._dom.parentElement.removeChild(this._dom),this.onDomRemove&&this.onDomRemove()),this._dom=void 0,this._visible=!1,this._coordinate=void 0,this}getMap(){return this._map}isVisible(){return this._visible}_bindMapEvents(e){const t=this._map;if(!t)return;const i=t,n=e?"on":"off",s=(a,c)=>{e?this._boundMapHandlers.set(a,c):this._boundMapHandlers.delete(a)};if(e){const a=()=>{this._visible&&this._updatePosition()};i[n]("control-change",a),s("control-change",a);const c=t.viewer;if(c&&!this._viewerUpdateHandler){const h=()=>{this._visible&&this._updatePosition()};this._viewerUpdateHandler=h,c.addEventListener("update",h)}}else{this._boundMapHandlers.forEach((c,h)=>{i[n](h,c)}),this._boundMapHandlers.clear();const a=t.viewer;a&&this._viewerUpdateHandler&&(a.removeEventListener("update",this._viewerUpdateHandler),this._viewerUpdateHandler=void 0)}}_resolveWorldPosition(){const e=this._map;if(!e)return;if(this._coordinate){const[i,n,s=0]=this._coordinate,a=new p.Vector3(i,n,s);return e.geo2world(a)}const t=this._owner;if(t&&t._geometry){const i=t._geometry;if(i&&(i.type==="Point"||i.type==="MultiPoint")){let n;if(i.type==="Point"?n=i.coordinates:i.type==="MultiPoint"&&Array.isArray(i.coordinates)&&i.coordinates.length>0&&(n=i.coordinates[0]),n&&n.length>=2){const s=new p.Vector3(n[0],n[1],n[2]??0);return e.geo2world(s)}}if(t._threeGeometry&&typeof t._threeGeometry.getWorldPosition=="function"){const n=new p.Vector3;if(t._threeGeometry.getWorldPosition(n),!(n.x===0&&n.y===0&&n.z===0))return n}if(t._position instanceof p.Vector3){const n=t._position;if(!(n.x===0&&n.y===0&&n.z===0))return n.clone()}}if(t&&typeof t.getWorldPosition=="function"){const i=new p.Vector3;return t.getWorldPosition(i),i}return e.prjcenter?.clone?.()??void 0}_updatePosition(){if(!this._dom||!this._map)return;if(this._visible){const h=this._resolveWorldPosition();if(!h){this._dom.style.display="none";return}this._worldPosition=h}if(!this._worldPosition)return;const e=this._map.viewer,t=e.camera,i=this._dom.style.display==="none";i&&(this._dom.style.visibility="hidden",this._dom.style.display=""),t.updateMatrixWorld();const n=this._worldPosition.clone().project(t);if(n.x<-1.1||n.x>1.1||n.y<-1.1||n.y>1.1||n.z<-1||n.z>1){this._dom.style.display="none",i&&(this._dom.style.visibility="");return}const s=(n.x*.5+.5)*e.width,a=(-n.y*.5+.5)*e.height,c=this.getOffset();if(this._dom.style.left=`${s+c.x}px`,this._dom.style.top=`${a+c.y}px`,i&&(this._dom.style.visibility=""),!this._positionedOnce){this._positionedOnce=!0,this._dom.style.display="none";return}this._dom.style.display=""}};bi(Zh,"_singletons",new Set);let xa=Zh;var Cv=Object.defineProperty,Tv=(r,e,t)=>e in r?Cv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Vh=(r,e,t)=>Tv(r,typeof e!="symbol"?e+"":e,t);class Ma extends xa{constructor(e){super({single:!0,...e}),Vh(this,"_titleEl"),Vh(this,"_contentEl")}_getClassName(){return"InfoWindow"}buildOn(){if(this.options.custom){let c;this.options.content instanceof HTMLElement?c=this.options.content:(c=document.createElement("div"),typeof this.options.content=="string"&&(c.innerHTML=this.options.content));const h=this.options.containerClass;return h&&(Array.isArray(h)?h:[h]).forEach(m=>{c.classList.add(m)}),this.options.minWidth&&(c.style.minWidth=`${this.options.minWidth}px`),this.options.minHeight&&(c.style.minHeight=`${this.options.minHeight}px`),this._titleEl=void 0,this._contentEl=c,c}const e=document.createElement("div");e.className="terra-infowindow";const t=this.options.containerClass;t&&(Array.isArray(t)?t:[t]).forEach(h=>{e.classList.add(h)}),typeof this.options.zIndex=="number"&&(e.style.zIndex=String(this.options.zIndex)),this.options.minWidth&&(e.style.minWidth=`${this.options.minWidth}px`),this.options.minHeight&&(e.style.minHeight=`${this.options.minHeight}px`);const i=document.createElement("div");i.className="terra-infowindow-header";const n=document.createElement("div");n.className="terra-infowindow-title",this.options.title&&(n.innerText=this.options.title);const s=document.createElement("span");s.className="terra-infowindow-close",s.innerHTML="×",s.title="关闭",s.addEventListener("click",c=>{c.stopPropagation(),c.preventDefault(),this.close()}),s.addEventListener("mousedown",c=>{c.preventDefault()}),s.style.cursor="pointer",s.style.userSelect="none",i.appendChild(n),i.appendChild(s);const a=document.createElement("div");return a.className="terra-infowindow-content",this.options.content instanceof HTMLElement?a.appendChild(this.options.content):typeof this.options.content=="string"&&(a.innerHTML=this.options.content),e.appendChild(i),e.appendChild(a),this._titleEl=n,this._contentEl=a,e}getOffset(){const e=super.getOffset(),t=this._dom;if(!t)return e;const i=t.offsetWidth,n=t.offsetHeight,s=10;let a=e.x-i/2,c=e.y-n-s;const h=this._owner,d=this.getMap();if(h&&typeof h.getStyle=="function"&&d?.viewer){const f=h.getStyle?.()?.config,g=f?.type;if(f&&(g==="icon-point"||g==="icon-label-point")){const _=Array.isArray(f.anchor)?f.anchor:[.5,.5],w=typeof _[1]=="number"?_[1]:.5;let b=0;const x=h._threeGeometry;if(x&&x instanceof p.Sprite&&(b=this._getSpriteScreenHeight(x,d.viewer)),b<=0){let L=0;if(g==="icon-point"){const M=f.size;Array.isArray(M)?L=M[1]:typeof M=="number"&&(L=M)}else if(g==="icon-label-point"){const M=f.size??f.iconSize;Array.isArray(M)?L=M[1]:typeof M=="number"&&(L=M)}b=L*(1-w)}else b=b*(1-w);b>0&&(c-=b)}}return{x:a,y:c}}_getSpriteScreenHeight(e,t){try{const i=t.camera,n=t.renderer;if(!i||!n)return 0;const s=t.height||n.domElement.clientHeight;if(!(e.material.sizeAttenuation!==!1)){const D=i.projectionMatrix.elements[5];return e.scale.y*D*s/2}const h=new p.Vector3;e.getWorldPosition(h);const d=i.position.clone(),m=h.clone().sub(d).normalize(),f=new p.Vector3;f.crossVectors(i.up,m).normalize();const g=new p.Vector3;g.crossVectors(m,f).normalize();const _=e.scale.y*(1-e.center.y),w=e.scale.y*e.center.y,b=h.clone().add(g.clone().multiplyScalar(_)),x=h.clone().sub(g.clone().multiplyScalar(w)),L=b.clone().project(i),M=x.clone().project(i),C=(-L.y*.5+.5)*s,W=(-M.y*.5+.5)*s;return Math.abs(W-C)}catch(i){return console.warn("Failed to calculate sprite screen height: // 计算 sprite 屏幕高度失败:",i),0}}setTitle(e){return this.options.title=e,this._titleEl&&(this._titleEl.innerText=e??""),this}setContent(e){return this.options.content=e,this._contentEl?(this._contentEl.innerHTML="",e instanceof HTMLElement?this._contentEl.appendChild(e):this._contentEl.innerHTML=e,this):this}open(e){super.show(e);const t=this,i=()=>{!t._dom||!t._map||!t._visible||(t._positionedOnce=!0,t._updatePosition())},s=this.getMap()?.viewer;if(s&&typeof s.addEventListener=="function"){const a=()=>{s.removeEventListener("update",a),i()};s.addEventListener("update",a)}else requestAnimationFrame(i);return this}close(){return this.hide()}}dt.include({setInfoWindow(r){this.removeInfoWindow();let e;return r instanceof Ma?e=r:e=new Ma(r),this._infoWindow=e,this.getMap()&&e.addTo(this),this},getInfoWindow(){return this._infoWindow},openInfoWindow(r){const e=this._infoWindow;return e?(e.getMap()||this.getMap()&&e.addTo(this),requestAnimationFrame(()=>{e.open(r)}),this):this},closeInfoWindow(){return this._infoWindow&&this._infoWindow.close(),this},removeInfoWindow(){return this._infoWindow&&(this._infoWindow.remove(),this._infoWindow=void 0),this}});var Gv=Object.defineProperty,Wv=(r,e,t)=>e in r?Gv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Sa=(r,e,t)=>Wv(r,typeof e!="symbol"?e+"":e,t);class Zv{constructor(...e){}}class Ih extends Yi(xn(Zv)){constructor(e={}){super(e),Sa(this,"_map"),Sa(this,"_enabled",!1),Sa(this,"_boundHandlers",new Map)}addTo(e){if(!e)return this;const t=e;return t._activeMapTool&&t._activeMapTool!==this&&t._activeMapTool.disable(),t._activeMapTool=this,this._map=e,this.onAdd&&this.onAdd(),this.enable(),this.trigger("add",{map:e}),this}getMap(){return this._map}enable(){return!this._map||this._enabled?this:(this._enabled=!0,this._bindEvents(),this.onEnable&&this.onEnable(),this.trigger("enable",{map:this._map}),this)}disable(){return!this._map||!this._enabled?this:(this._enabled=!1,this._unbindEvents(),this.onDisable&&this.onDisable(),this.trigger("disable",{map:this._map}),this)}isEnabled(){return!!this._enabled}remove(){if(!this._map)return this;this.disable();const e=this._map;return e._activeMapTool===this&&delete e._activeMapTool,this._map=void 0,this.trigger("remove"),this}_bindEvents(){const e=this._map;if(!e)return;const t=this.getEvents()||{};Object.keys(t).forEach(i=>{const n=t[i];if(!n)return;const s=a=>n.call(this,a);this._boundHandlers.set(i,s),e.on(i,s)})}_unbindEvents(){const e=this._map;e&&(this._boundHandlers.forEach((t,i)=>{e.off(i,t)}),this._boundHandlers.clear())}}var Vv=Object.defineProperty,Iv=(r,e,t)=>e in r?Vv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Fr=(r,e,t)=>Iv(r,typeof e!="symbol"?e+"":e,t);class Av extends ji{constructor(e){super(e,{altitude:1})}validateFeature(e){return!!e}}const Ah={};class Qn extends Ih{constructor(e){super(e),Fr(this,"_modeDef"),Fr(this,"_clickCoords",[]),Fr(this,"_isDrawing",!1),Fr(this,"_geometry"),Fr(this,"_draftLayer"),this.options.once=this.options.once??!1,this._ensureMode()}static registerMode(e,t){Ah[e.toLowerCase()]=t}static getModeDefinition(e){return Ah[e.toLowerCase()]}getMode(){return(this.options.mode||"").toLowerCase()}setMode(e){return this._finishDrawingSilently(),this.options.mode=e,this._ensureMode(),this}setStyle(e){return e.geometryStyle!==void 0&&(this.options.geometryStyle=e.geometryStyle),Object.prototype.hasOwnProperty.call(e,"vertexStyle")&&(this.options.vertexStyle=e.vertexStyle??null),this}getEvents(){return{click:this._handleClick.bind(this),mousemove:this._handleMouseMove.bind(this),dblclick:this._handleDblClick.bind(this)}}onEnable(){this._ensureMode()}onDisable(){this._finishDrawingSilently(),this._destroyDraftLayer()}_ensureMode(){const e=this.getMode(),t=Qn.getModeDefinition(e);if(!t)throw new Error(`DrawTool: mode "${e}" 未注册,请先调用 DrawTool.registerMode`);this._modeDef=t}_handleClick(e){if(!this._modeDef||!e.coordinate)return;const t=e.coordinate,i=this._modeDef,n={...e,drawTool:this};this._isDrawing?(this._clickCoords.push(t),i.update(this._clickCoords,this._geometry,n),this.trigger("drawvertex",{coordinate:t,geometry:this._geometry,coords:[...this._clickCoords],originEvent:n})):(this._isDrawing=!0,this._clickCoords=[t],this._geometry=i.create(t,n),this.trigger("drawstart",{coordinate:t,geometry:this._geometry,coords:[...this._clickCoords],originEvent:n})),i.clickLimit&&this._clickCoords.length>=i.clickLimit&&this._finishDrawing(n)}_handleMouseMove(e){if(!this._modeDef||!this._isDrawing||!e.coordinate)return;const t=this._modeDef,i=[...this._clickCoords,e.coordinate],n={...e,drawTool:this};t.update(i,this._geometry,n),this.trigger("drawing",{coordinate:e.coordinate,geometry:this._geometry,coords:i,originEvent:n})}_handleDblClick(e){if(!this._modeDef||!this._isDrawing)return;const t={...e,drawTool:this};this._finishDrawing(t)}_finishDrawing(e){if(!this._modeDef||!this._isDrawing)return;const i=this._modeDef.generate(this._geometry,[...this._clickCoords]);this.trigger("drawend",{geometry:i,coords:[...this._clickCoords],originEvent:e}),this._isDrawing=!1,this._clickCoords=[],this._geometry=void 0,this.options.once&&this.disable()}_finishDrawingSilently(){this._isDrawing=!1,this._clickCoords=[],this._geometry=void 0}_getOrCreateDraftLayer(){if(this._draftLayer)return this._draftLayer;const e=this.getMap();if(!e)throw new Error("DrawTool: 尚未绑定地图,请先调用 addTo(map)");const t=`__draw_draft_${Date.now().toString(36)}`,i=new Av(t);return e.addLayer(i),this._draftLayer=i,i}_destroyDraftLayer(){const e=this.getMap();e&&this._draftLayer&&e.removeLayer(this._draftLayer.getId()),this._draftLayer=void 0}}const Fv={actions:["click","mousemove"],create(r,e){const t=e.drawTool,i=t._getOrCreateDraftLayer(),n=en(t.options.geometryStyle,{type:"basic-point",size:10,color:"#00ffff"}),s={type:"Point",coordinates:r},a=new Ti({geometry:s,style:n});return a.addTo(i),a.initializeGeometry(),{tool:t,draftLayer:i,draftMarker:a}},update(r,e,t){const i=e?.draftMarker;if(!i)return;const n=r[r.length-1];i._geometry={type:"Point",coordinates:n},i._position=i._coordsTransform(),i._toThreeJSGeometry&&i._toThreeJSGeometry()},generate(r,e){const t=r.tool;if(!e.length)return null;r.draftMarker&&(r.draftMarker._remove(),r.draftMarker=null);const i=en(t.options.geometryStyle,{type:"basic-point",size:10,color:"#00ffff"}),n=e[e.length-1];return new Ti({geometry:{type:"Point",coordinates:n},style:i})},clickLimit:1},Ov={actions:["click","mousemove","dblclick"],create(r,e){const t=e.drawTool,i=t._getOrCreateDraftLayer(),n=en(t.options.geometryStyle,{type:"basic-line",color:"#ff0000",width:2}),s=t.options.vertexStyle===null?void 0:en(t.options.vertexStyle,{type:"basic-point",size:8,color:"#00ffff"}),a={type:"LineString",coordinates:[r]},c=new Lt({geometry:a,style:n});c.addTo(i);const h=[];if(s){const d={type:"Point",coordinates:r},m=new Ti({geometry:d,style:s});m.addTo(i),h.push(m)}return{tool:t,draftLayer:i,draftLine:c,draftAnchors:h,lineStyle:n,vertexStyle:s}},update(r,e,t){if(!e)return;const i=e.draftLayer;if(!r||r.length<2)return;e.draftLine&&(e.draftLine._remove(),e.draftLine=null);const n={type:"LineString",coordinates:r},s=new Lt({geometry:n,style:e.lineStyle});if(s.addTo(i),e.draftLine=s,t.eventName==="click"&&e.vertexStyle){const c={type:"Point",coordinates:r[r.length-1]},h=new Ti({geometry:c,style:e.vertexStyle});h.addTo(i),e.draftAnchors.push(h)}},generate(r,e){const t=r.tool;if(!e.length)return null;if(r.draftLine&&(r.draftLine._remove(),r.draftLine=null),Array.isArray(r.draftAnchors)){for(const s of r.draftAnchors)s?._remove();r.draftAnchors=[]}const i=en(t.options.geometryStyle,{type:"basic-line",color:"#ff0000",width:2});return new Lt({geometry:{type:"LineString",coordinates:e},style:i})}},zv={actions:["click","mousemove","dblclick"],create(r,e){const t=e.drawTool,i=t._getOrCreateDraftLayer(),n=en(t.options.geometryStyle,{type:"basic-polygon",color:"#00ff00",opacity:.5}),s=t.options.vertexStyle===null?void 0:en(t.options.vertexStyle,{type:"basic-point",size:8,color:"#00ffff"}),a=[];if(s){const c={type:"Point",coordinates:r},h=new Ti({geometry:c,style:s});h.addTo(i),h.initializeGeometry(),a.push(h)}return{tool:t,draftLayer:i,draftPolygon:null,draftEdgeLine:null,draftAnchors:a,polygonStyle:n,vertexStyle:s}},update(r,e,t){if(!e)return;const i=e.draftLayer;if(t.eventName==="click"&&e.vertexStyle){const m={type:"Point",coordinates:r[r.length-1]},f=new Ti({geometry:m,style:e.vertexStyle});f.addTo(i),f.initializeGeometry(),e.draftAnchors.push(f)}if(!r||r.length<2){e.draftEdgeLine&&(e.draftEdgeLine._remove(),e.draftEdgeLine=null),e.draftPolygon&&(e.draftPolygon._remove(),e.draftPolygon=null);return}if(r.length===2){e.draftPolygon&&(e.draftPolygon._remove(),e.draftPolygon=null),e.draftEdgeLine&&(e.draftEdgeLine._remove(),e.draftEdgeLine=null);const d={type:"LineString",coordinates:r},m=e.polygonStyle?.config&&e.polygonStyle.config.color||"#00ff00",f=new St({type:"basic-line",color:m,width:2}),g=new Lt({geometry:d,style:f});g.addTo(i),e.draftEdgeLine=g;return}e.draftEdgeLine&&(e.draftEdgeLine._remove(),e.draftEdgeLine=null);const n=r.slice(),s=n[0],a=n[n.length-1];(s[0]!==a[0]||s[1]!==a[1]||(s[2]||0)!==(a[2]||0))&&n.push(s),e.draftPolygon&&(e.draftPolygon._remove(),e.draftPolygon=null);const c={type:"Polygon",coordinates:[n]},h=new wi({geometry:c,style:e.polygonStyle});h.addTo(i),e.draftPolygon=h},generate(r,e){const t=r.tool;if(e.length<3)return null;if(r.draftPolygon&&(r.draftPolygon._remove(),r.draftPolygon=null),r.draftEdgeLine&&(r.draftEdgeLine._remove(),r.draftEdgeLine=null),Array.isArray(r.draftAnchors)){for(const h of r.draftAnchors)h?._remove();r.draftAnchors=[]}const i=en(t.options.geometryStyle,{type:"basic-polygon",color:"#00ff00",opacity:.5}),n=e.slice(),s=n[0],a=n[n.length-1];return(s[0]!==a[0]||s[1]!==a[1]||(s[2]||0)!==(a[2]||0))&&n.push(s),new wi({geometry:{type:"Polygon",coordinates:[n]},style:i})}};Qn.registerMode("point",Fv),Qn.registerMode("line",Ov),Qn.registerMode("polygon",zv);function en(r,e){return St.create(r||e)}var Dv=Object.defineProperty,Xv=(r,e,t)=>e in r?Dv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,oi=(r,e,t)=>Xv(r,typeof e!="symbol"?e+"":e,t);class kv extends si{constructor(e){if(super(e),oi(this,"dataType","image"),oi(this,"attribution","天地图"),oi(this,"token",""),oi(this,"style","img_w"),oi(this,"subdomains","01234"),oi(this,"url","https://t{s}.tianditu.gov.cn/DataServer?T={style}&x={x}&y={y}&l={z}&tk={token}"),Object.assign(this,e),!this.token)throw new Error("天地图访问令牌(token)是必填参数")}}class Uv extends si{constructor(e){if(super(e),oi(this,"dataType","quantized-mesh"),oi(this,"attribution","天地图"),oi(this,"token",""),oi(this,"subdomains","01234"),oi(this,"url","https://t{s}.tianditu.gov.cn/mapservice/swdx?T=elv_c&tk={token}&x={x}&y={y}&l={z}"),Object.assign(this,e),!this.token)throw new Error("天地图访问令牌(token)是必填参数")}}var Nv=Object.defineProperty,Kv=(r,e,t)=>e in r?Nv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Fh=(r,e,t)=>Kv(r,typeof e!="symbol"?e+"":e,t);class Bv extends si{constructor(e){super({...e,url:e.urlTemplate,isTMS:e.isTMS||!1}),Fh(this,"minLevel",2),Fh(this,"maxLevel",24)}getUrl(e,t,i){const n=this.isTMS?Math.pow(2,i)-1-t:t;return mm(this.url,{...this,x:e,y:n,z:i,tileMatrix:i,tileRow:n,tileCol:e})}}var Yv=Object.defineProperty,Rv=(r,e,t)=>e in r?Yv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Gi=(r,e,t)=>Rv(r,typeof e!="symbol"?e+"":e,t);class jv extends si{constructor(e){super(e),Gi(this,"dataType","image"),Gi(this,"attribution","ArcGIS"),Gi(this,"style","World_Imagery"),Gi(this,"url","https://services.arcgisonline.com/arcgis/rest/services/{style}/MapServer/tile/{z}/{y}/{x}"),Object.assign(this,e)}}class Jv extends si{constructor(e){super(e),Gi(this,"dataType","lerc"),Gi(this,"attribution","ArcGIS"),Gi(this,"minLevel",6),Gi(this,"maxLevel",13),Gi(this,"url","https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer/tile/{z}/{y}/{x}"),Object.assign(this,e)}}var Qv=Object.defineProperty,Hv=(r,e,t)=>e in r?Qv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Hn=(r,e,t)=>Hv(r,typeof e!="symbol"?e+"":e,t);class $v extends si{constructor(e){if(super(e),Hn(this,"token",""),Hn(this,"format","webp"),Hn(this,"style","cm2myr6qx001t01pi0sf7estf"),Hn(this,"attribution","MapBox"),Hn(this,"maxLevel",25),Hn(this,"url","https://api.mapbox.com/styles/v1/criska/cm2myr6qx001t01pi0sf7estf/tiles/256/{z}/{x}/{y}?access_token={token}&format={format}"),Object.assign(this,e),!this.token)throw new Error("MapBox访问令牌(token)是必填参数")}}var Ev=Object.defineProperty,qv=(r,e,t)=>e in r?Ev(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Oh=(r,e,t)=>qv(r,typeof e!="symbol"?e+"":e,t);class ew extends si{constructor(e){super(e),Oh(this,"dataType","mvt"),Oh(this,"style",{layer:[]}),Object.assign(this,e)}}var tw=Object.defineProperty,iw=(r,e,t)=>e in r?tw(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Or=(r,e,t)=>iw(r,typeof e!="symbol"?e+"":e,t);class nw extends si{constructor(e){super(e),Or(this,"dataType","VectorTile"),Or(this,"attribution","ArcGIS"),Or(this,"minLevel",1),Or(this,"maxLevel",21),Or(this,"url","https://api.maptiler.com/tiles/v3/{z}/{x}/{y}.pbf?key=uKYsZQZpm72WlbSgH9B7"),Object.assign(this,e)}}class rw extends ji{constructor(e,t){super(e,t)}validateFeature(e){return e._baseType==="Line"}}class sw extends ji{constructor(e,t){super(e,t)}validateFeature(e){return e._baseType==="Point"}}class ow extends ji{constructor(e,t){super(e,t)}validateFeature(e){return e._baseType==="Surface"}}var aw=Object.defineProperty,lw=(r,e,t)=>e in r?aw(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,cw=(r,e,t)=>lw(r,e+"",t);class hw extends ji{constructor(e,t){super(e,t),cw(this,"_clouds",null);const i=["texture"];for(const n of i)wc(t,n);this._createClouds(t.texture)}async _createClouds(e){const t=await St._loadTexture(e),i=new dg({texture:t,material:p.MeshBasicMaterial});i.castShadow=!0,this._clouds=i}validateFeature(e){return e._type==="Cloud"}animate(e,t){this._clouds&&this._clouds.update(this.map.viewer.camera,t,e)}}var uw=Object.defineProperty,dw=(r,e,t)=>e in r?uw(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,zh=(r,e,t)=>dw(r,typeof e!="symbol"?e+"":e,t);class fw extends xa{constructor(e){super({single:!1,...e}),zh(this,"_markerCoord"),zh(this,"_content"),this._markerCoord=[...e.coordinate],this._content=e.content}_getClassName(){return"UIMarker"}buildOn(){const e=document.createElement("div"),{width:t,height:i}=this.options;typeof t=="number"&&(e.style.width=`${t}px`),typeof i=="number"&&(e.style.height=`${i}px`);const n=this.options.containerClass;n&&(Array.isArray(n)?n:[n]).forEach(c=>e.classList.add(c));const s=this._content;return typeof s=="function"?s(e):s instanceof HTMLElement?e.appendChild(s):typeof s=="string"&&(e.innerHTML=s),e}getOffset(){const e=super.getOffset(),t=this._dom;if(!t)return e;const i=t.offsetWidth,n=t.offsetHeight;return{x:e.x-i/2,y:e.y-n/2}}show(e){return e&&(this._markerCoord=[...e]),super.show(this._markerCoord)}setCoordinates(e){return this._markerCoord=[...e],this.isVisible()&&super.show(this._markerCoord),this}getCoordinates(){return[...this._markerCoord]}getCenter(){return this.getCoordinates()}getAltitude(){const e=this._markerCoord;return typeof e[2]=="number"?e[2]:typeof this.options.altitude=="number"?this.options.altitude:0}setAltitude(e){const t=[...this._markerCoord];return t[2]=e,this._markerCoord=t,this.isVisible()&&super.show(this._markerCoord),this}setContent(e){this._content=e,this.options.content=e;const t=this._dom;return t?(t.innerHTML="",typeof e=="function"?e(t):e instanceof HTMLElement?t.appendChild(e):typeof e=="string"&&(t.innerHTML=e),this):this}getContent(){return this._content}addTo(e){return super.addTo(e),this.options.visible!==!1&&this.show(this.options.coordinate),this}}var pw=Object.defineProperty,mw=(r,e,t)=>e in r?pw(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,He=(r,e,t)=>mw(r,typeof e!="symbol"?e+"":e,t);function gw(r){const e=new Date(r),t=e.getHours().toString().padStart(2,"0"),i=e.getMinutes().toString().padStart(2,"0"),n=e.getSeconds().toString().padStart(2,"0");return`${t}:${i}:${n}`}class yw extends Pr{constructor(e,t,i){super(e,i),He(this,"_trailLine",null),He(this,"_activeLine",null),He(this,"_marker",null),He(this,"_controlPointGroup",new p.Group),He(this,"_timeLabels",[]),He(this,"_points",[]),He(this,"_worldPoints",[]),He(this,"_timestamps",[]),He(this,"_totalDuration",0),He(this,"_state","idle"),He(this,"_currentTime",0),He(this,"_playbackSpeed",1),He(this,"_loop",!1),He(this,"_cameraMode","none"),He(this,"_cameraConfig",{mode:"none"}),He(this,"_prevControlsEnabled",!0),He(this,"_options"),He(this,"_gifStates",[]),this._options=i||{},this._playbackSpeed=i?.speed??1,this._loop=i?.loop??!1,i?.cameraFollow&&(this._cameraConfig={...i.cameraFollow},this._cameraMode=i.cameraFollow.mode),this.add(this._controlPointGroup),t&&t.points.length>0&&this._setDataInternal(t)}_bindMap(e){super._bindMap(e),this._points.length>0&&e&&this._buildAll().catch(t=>console.error("TrajectoryLayer build error:",t))}setData(e){this._disposeAll(),this._setDataInternal(e),this.map&&this._buildAll().catch(t=>console.error("TrajectoryLayer build error:",t))}_setDataInternal(e){this._points=[...e.points].sort((t,i)=>t.timestamp-i.timestamp),this._timestamps=this._points.map(t=>t.timestamp),e.duration!==void 0?this._totalDuration=e.duration:this._points.length>=2?this._totalDuration=this._timestamps[this._timestamps.length-1]-this._timestamps[0]:this._totalDuration=0,this._currentTime=0,this._state="idle"}play(){if(!(this._points.length<2)&&(this._state==="idle"&&this._currentTime>=this._totalDuration&&(this._currentTime=0),this._state="playing",this._cameraMode!=="none")){const e=this.getMap()?.viewer;e&&(e.controls.enabled=!1)}}pause(){if(this._state==="playing"&&(this._state="paused",this._cameraMode!=="none")){const e=this.getMap()?.viewer;e&&(e.controls.enabled=this._prevControlsEnabled)}}stop(){if(this._state="idle",this._currentTime=0,this._marker&&(this._marker.visible=!1),this._activeLine&&(this._activeLine.visible=!1),this._cameraMode!=="none"){const t=this.getMap()?.viewer;t&&(t.controls.enabled=this._prevControlsEnabled),this._cameraMode="none",this._cameraConfig={mode:"none"}}}seekTo(e){this._currentTime=Math.max(0,Math.min(e,this._totalDuration)),this._updateVisuals()}setSpeed(e){this._playbackSpeed=Math.max(.1,e)}setLoop(e){this._loop=e}setShowControlPoints(e){this._controlPointGroup.visible=e}setShowTimeLabels(e){for(const t of this._timeLabels)if(e){const i=this.getMap();i&&t.addTo(i)}else t.hide()}setCameraMode(e,t){const i=this._cameraMode;this._cameraMode=e;const n={"first-person":{distance:15,polarAngle:80,smoothing:.08},"third-person":{distance:500,polarAngle:5,smoothing:.08},none:{}};this._cameraConfig={...n[e],mode:e,...t};const a=this.getMap()?.viewer;a&&(i!=="none"&&e==="none"?a.controls.enabled=this._prevControlsEnabled:i==="none"&&e!=="none"&&(this._prevControlsEnabled=a.controls.enabled,a.controls.enabled=!1))}getCurrentTime(){return this._currentTime}getDuration(){return this._totalDuration}getPlaybackState(){return this._state}getSpeed(){return this._playbackSpeed}animate(e,t,i){this._updateGifTextures(),this._state==="playing"&&(this._points.length<2||(this._currentTime+=e*1e3*this._playbackSpeed,this._currentTime>=this._totalDuration&&(this._loop?this._currentTime=this._currentTime%this._totalDuration:(this._currentTime=this._totalDuration,this._state="idle",this._emitEvent("playback-end"))),this._updateVisuals(),this._updateCamera(i)))}async _buildAll(){const e=this.getMap();if(e){this._worldPoints=this._transformCoordinates(e),console.log("TrajectoryLayer: worldPoints count =",this._worldPoints.length),this._buildTrailLine(),this._buildActiveLine();try{await this._buildMarker()}catch(t){console.error("TrajectoryLayer: _buildMarker failed:",t)}try{await this._buildControlPoints()}catch(t){console.error("TrajectoryLayer: _buildControlPoints failed:",t)}this._buildTimeLabels(),this._updateTrailLine()}}_transformCoordinates(e){const t=e.prjcenter;return this._points.map(i=>{const n=new p.Vector3(i.coordinate[0],i.coordinate[1],i.coordinate[2]||0);return e.geo2world(n).sub(t)})}_buildTrailLine(){if(this._worldPoints.length<2)return;const e=this._options.trailStyle||{},t=new Ni;t.setPositions([0,0,0,0,0,0]);const i=new vn({color:new p.Color(e.color??"#4a90d9").getHex(),linewidth:e.width??2,transparent:!0,opacity:e.opacity??.5,resolution:new p.Vector2(window.innerWidth,window.innerHeight),depthTest:!0,depthWrite:!0}),n=()=>i.resolution.set(window.innerWidth,window.innerHeight);window.addEventListener("resize",n),i.__resizeHandler=n,this._trailLine=new bn(t,i),this._trailLine.computeLineDistances(),this._trailLine.position.copy(this.map.prjcenter),this.add(this._trailLine)}_buildActiveLine(){const e=this._options.activeTrailStyle||{},t=new Ni;t.setPositions([0,0,0,0,0,0]);const i=new vn({color:new p.Color(e.color??"#ff4444").getHex(),linewidth:e.width??3,transparent:!0,opacity:e.opacity??1,resolution:new p.Vector2(window.innerWidth,window.innerHeight),depthTest:!0,depthWrite:!0}),n=()=>i.resolution.set(window.innerWidth,window.innerHeight);window.addEventListener("resize",n),i.__resizeHandler=n,this._activeLine=new bn(t,i),this._activeLine.computeLineDistances(),this._activeLine.position.copy(this.map.prjcenter),this._activeLine.visible=!1,this.add(this._activeLine)}async _buildMarker(){const e=this._options.markerStyle||{},t=this.map.prjcenter;if(e.type==="icon"&&e.url){const i=await new Promise((h,d)=>{new p.TextureLoader().load(e.url,m=>h(m),void 0,m=>d(m))});i.colorSpace=p.SRGBColorSpace,i.needsUpdate=!0;const n=e.size??32,s=new p.SpriteMaterial({map:i,transparent:!0,depthWrite:!1,sizeAttenuation:!1}),a=new p.Sprite(s);a.scale.set(n,n,1);const c=e.anchor??[.5,.5];a.center.set(c[0],c[1]),this._marker=a,console.log("TrajectoryLayer: marker sprite created manually",{texWidth:i.image?.width,texHeight:i.image?.height,spriteScale:`(${a.scale.x}, ${a.scale.y}, ${a.scale.z})`})}else this._marker=Sn({color:e.color??"#ff0000",size:e.size??16,sizeAttenuation:!1},new p.Vector3(0,0,0));this._worldPoints.length>0&&this._marker.position.copy(this._worldPoints[0]),this._marker.position.add(t),this._marker.visible=!1,this.add(this._marker)}async _buildControlPoints(){if(!this._options.showControlPoints)return;const e=this._options.controlPointStyle||{},t=e.type??"point",i=this.map.prjcenter;for(;this._controlPointGroup.children.length>0;){const n=this._controlPointGroup.children[0];this._controlPointGroup.remove(n),n.traverse(s=>{"geometry"in s&&s.geometry&&s.geometry.dispose(),"material"in s&&s.material&&(Array.isArray(s.material)?s.material:[s.material]).forEach(c=>c.dispose())})}this._controlPointGroup.position.copy(i);for(let n=0;n<this._worldPoints.length;n++){const s=this._worldPoints[n].clone();let a;if(t==="icon"&&e.url)try{const c=await Dc({type:"icon-point",url:e.url,size:e.size??24,color:"#ffffff",sizeAttenuation:!0},s);if(c.material.map){const d=e.anchor??[.5,.5];c.center.set(d[0],d[1]),a=c}else console.warn("TrajectoryLayer: icon texture failed, fallback to basic point:",e.url),a=Sn({type:"basic-point",color:e.color??"#00ff00",size:e.size??12,sizeAttenuation:!1},s)}catch(c){console.warn("TrajectoryLayer: _createIconPoint error, fallback to basic point:",c),a=Sn({color:e.color??"#00ff00",size:e.size??12,sizeAttenuation:!1},s)}else t==="gif"&&e.url?a=await this._createGifControlPoint(e.url,s,e.size??32):a=Sn({color:e.color??"#00ff00",size:e.size??12,sizeAttenuation:!1},s);this._controlPointGroup.add(a)}}async _createGifControlPoint(e,t,i){return new Promise(n=>{const s=new Image;s.crossOrigin="anonymous",s.onload=()=>{const a=document.createElement("canvas");a.width=s.naturalWidth||s.width,a.height=s.naturalHeight||s.height;const c=a.getContext("2d");c.drawImage(s,0,0);const h=new p.CanvasTexture(a);h.colorSpace=p.SRGBColorSpace,h.needsUpdate=!0;const d=new p.SpriteMaterial({map:h,transparent:!0,sizeAttenuation:!0}),m=new p.Sprite(d),f=.002;m.scale.set(i*f,i*f,1),m.position.copy(t),this._gifStates.push({canvas:a,ctx:c,img:s,texture:h,lastFrameTime:performance.now(),frameIndex:0,loaded:!0}),n(m)},s.onerror=()=>{const a=Sn({color:"#ff0000",size:12,sizeAttenuation:!0},t);n(a)},s.src=e})}_updateGifTextures(){if(this._gifStates.length===0)return;const e=performance.now();for(const t of this._gifStates)t.loaded&&e-t.lastFrameTime>33&&(t.ctx.clearRect(0,0,t.canvas.width,t.canvas.height),t.ctx.drawImage(t.img,0,0),t.texture.needsUpdate=!0,t.lastFrameTime=e)}_buildTimeLabels(){if(!this._options.showTimeLabels)return;const e=this.getMap();if(!e)return;const t=this._options.timeFormat??gw,i=this._options.timeLabelContent;this._disposeTimeLabels();for(let n=0;n<this._points.length;n++){const s=this._points[n],a=i?i(s.timestamp):`<div style="
|
|
1190
|
+
`;var r_=Object.defineProperty,s_=(r,e,t)=>e in r?r_(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,At=(r,e,t)=>s_(r,typeof e!="symbol"?e+"":e,t);class si{constructor(e){At(this,"dataType","image"),At(this,"attribution","isource"),At(this,"minLevel",0),At(this,"maxLevel",18),At(this,"projectionID","3857"),At(this,"url",""),At(this,"subdomains",[]),At(this,"s",""),At(this,"opacity",1),At(this,"isTMS",!1),At(this,"bounds",[-180,-85,180,85]),At(this,"_projectionBounds",[-1/0,-1/0,1/0,1/0]),At(this,"tileMaterial"),Object.assign(this,e)}getUrl(e,t,i){const n={...this,x:e,y:t,z:i};return o_(this.url,n)}_getUrl(e,t,i){const n=this.subdomains.length;if(n>0){const a=Math.floor(Math.random()*n);this.s=this.subdomains[a]}const s=this.isTMS?Math.pow(2,i)-1-t:t;return this.getUrl(e,s,i)}static create(e){return new si(e)}}function o_(r,e){const t=/\{ *([\w_-]+) *\}/g;return r.replace(t,(i,n)=>{const s=e[n]??(()=>{throw new Error(`source url template error, No value provided for variable: ${i}`)})();return typeof s=="function"?s(e):s})}const{version:a_,author:l_}=JSON.parse(n_);function c_(r,e=100){return new Promise(t=>{const i=setInterval(()=>{r&&(clearInterval(i),t())},e)})}function ma(r){return De.registerMaterialLoader(r),r}function ga(r){return De.registerGeometryLoader(r),r}function wh(r){return De.registerMeshLoader(r),r}ma(new t_);const bh="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIEsoayxkKXtjb25zdCB5PW5ldyBGbG9hdDMyQXJyYXkoay5sZW5ndGgpO2ZvcihsZXQgVj0wO1Y8ZC5sZW5ndGg7Vis9Myl7Y29uc3QgYT1kW1ZdKjMsZT1kW1YrMV0qMyxyPWRbVisyXSozLHM9a1thXSx0PWtbYSsxXSxuPWtbYSsyXSxoPWtbZV0saT1rW2UrMV0sbz1rW2UrMl0sYz1rW3JdLHU9a1tyKzFdLG09a1tyKzJdLHc9aC1zLGw9aS10LGY9by1uLGc9Yy1zLE09dS10LEQ9bS1uLHA9bCpELWYqTSxVPWYqZy13KkQsST13Kk0tbCpnLHo9TWF0aC5zcXJ0KHAqcCtVKlUrSSpJKSx4PVswLDAsMV07aWYoej4wKXtjb25zdCB2PTEvejt4WzBdPXAqdix4WzFdPVUqdix4WzJdPUkqdn1mb3IobGV0IHY9MDt2PDM7disrKXlbYSt2XT15W2Urdl09eVtyK3ZdPXhbdl19cmV0dXJuIHl9dmFyIFc9T2JqZWN0LmRlZmluZVByb3BlcnR5LFA9KGssZCx5KT0+ZCBpbiBrP1coayxkLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp5fSk6a1tkXT15LF89KGssZCx5KT0+UChrLHR5cGVvZiBkIT0ic3ltYm9sIj9kKyIiOmQseSk7Y2xhc3MgZWV7Y29uc3RydWN0b3IoZD0yNTcpe18odGhpcywiZ3JpZFNpemUiKSxfKHRoaXMsIm51bVRyaWFuZ2xlcyIpLF8odGhpcywibnVtUGFyZW50VHJpYW5nbGVzIiksXyh0aGlzLCJpbmRpY2VzIiksXyh0aGlzLCJjb29yZHMiKSx0aGlzLmdyaWRTaXplPWQ7Y29uc3QgeT1kLTE7aWYoeSZ5LTEpdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBncmlkIHNpemUgdG8gYmUgMl5uKzEsIGdvdCAke2R9LmApO3RoaXMubnVtVHJpYW5nbGVzPXkqeSoyLTIsdGhpcy5udW1QYXJlbnRUcmlhbmdsZXM9dGhpcy5udW1UcmlhbmdsZXMteSp5LHRoaXMuaW5kaWNlcz1uZXcgVWludDMyQXJyYXkodGhpcy5ncmlkU2l6ZSp0aGlzLmdyaWRTaXplKSx0aGlzLmNvb3Jkcz1uZXcgVWludDE2QXJyYXkodGhpcy5udW1UcmlhbmdsZXMqNCk7Zm9yKGxldCBWPTA7Vjx0aGlzLm51bVRyaWFuZ2xlcztWKyspe2xldCBhPVYrMixlPTAscj0wLHM9MCx0PTAsbj0wLGg9MDtmb3IoYSYxP3M9dD1uPXk6ZT1yPWg9eTsoYT4+PTEpPjE7KXtjb25zdCBvPWUrcz4+MSxjPXIrdD4+MTthJjE/KHM9ZSx0PXIsZT1uLHI9aCk6KGU9cyxyPXQscz1uLHQ9aCksbj1vLGg9Y31jb25zdCBpPVYqNDt0aGlzLmNvb3Jkc1tpKzBdPWUsdGhpcy5jb29yZHNbaSsxXT1yLHRoaXMuY29vcmRzW2krMl09cyx0aGlzLmNvb3Jkc1tpKzNdPXR9fWNyZWF0ZVRpbGUoZCl7cmV0dXJuIG5ldyByZShkLHRoaXMpfX1jbGFzcyByZXtjb25zdHJ1Y3RvcihkLHkpe18odGhpcywibWFydGluaSIpLF8odGhpcywidGVycmFpbiIpLF8odGhpcywiZXJyb3JzIik7Y29uc3QgVj15LmdyaWRTaXplO2lmKGQubGVuZ3RoIT09VipWKXRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdGVycmFpbiBkYXRhIG9mIGxlbmd0aCAke1YqVn0gKCR7Vn0geCAke1Z9KSwgZ290ICR7ZC5sZW5ndGh9LmApO3RoaXMudGVycmFpbj1kLHRoaXMubWFydGluaT15LHRoaXMuZXJyb3JzPW5ldyBGbG9hdDMyQXJyYXkoZC5sZW5ndGgpLHRoaXMudXBkYXRlKCl9dXBkYXRlKCl7Y29uc3R7bnVtVHJpYW5nbGVzOmQsbnVtUGFyZW50VHJpYW5nbGVzOnksY29vcmRzOlYsZ3JpZFNpemU6YX09dGhpcy5tYXJ0aW5pLHt0ZXJyYWluOmUsZXJyb3JzOnJ9PXRoaXM7Zm9yKGxldCBzPWQtMTtzPj0wO3MtLSl7Y29uc3QgdD1zKjQsbj1WW3QrMF0saD1WW3QrMV0saT1WW3QrMl0sbz1WW3QrM10sYz1uK2k+PjEsdT1oK28+PjEsbT1jK3UtaCx3PXUrbi1jLGw9KGVbaCphK25dK2VbbyphK2ldKS8yLGY9dSphK2MsZz1NYXRoLmFicyhsLWVbZl0pO2lmKHJbZl09TWF0aC5tYXgocltmXSxnKSxzPHkpe2NvbnN0IE09KGgrdz4+MSkqYSsobittPj4xKSxEPShvK3c+PjEpKmErKGkrbT4+MSk7cltmXT1NYXRoLm1heChyW2ZdLHJbTV0scltEXSl9fX1nZXRHZW9tZXRyeURhdGEoZD0wKXtjb25zdHtncmlkU2l6ZTp5LGluZGljZXM6Vn09dGhpcy5tYXJ0aW5pLHtlcnJvcnM6YX09dGhpcztsZXQgZT0wLHI9MDtjb25zdCBzPXktMTtsZXQgdCxuLGg9MDtWLmZpbGwoMCk7ZnVuY3Rpb24gaShmLGcsTSxELHAsVSl7Y29uc3QgST1mK00+PjEsej1nK0Q+PjE7TWF0aC5hYnMoZi1wKStNYXRoLmFicyhnLVUpPjEmJmFbeip5K0ldPmQ/KGkocCxVLGYsZyxJLHopLGkoTSxELHAsVSxJLHopKToodD1nKnkrZixuPUQqeStNLGg9VSp5K3AsVlt0XT09PTAmJihWW3RdPSsrZSksVltuXT09PTAmJihWW25dPSsrZSksVltoXT09PTAmJihWW2hdPSsrZSkscisrKX1pKDAsMCxzLHMscywwKSxpKHMscywwLDAsMCxzKTtjb25zdCBvPWUqMixjPXIqMyx1PW5ldyBVaW50MTZBcnJheShvKSxtPW5ldyBVaW50MzJBcnJheShjKTtsZXQgdz0wO2Z1bmN0aW9uIGwoZixnLE0sRCxwLFUpe2NvbnN0IEk9ZitNPj4xLHo9ZytEPj4xO2lmKE1hdGguYWJzKGYtcCkrTWF0aC5hYnMoZy1VKT4xJiZhW3oqeStJXT5kKWwocCxVLGYsZyxJLHopLGwoTSxELHAsVSxJLHopO2Vsc2V7Y29uc3QgeD1WW2cqeStmXS0xLHY9VltEKnkrTV0tMSxBPVZbVSp5K3BdLTE7dVsyKnhdPWYsdVsyKngrMV09Zyx1WzIqdl09TSx1WzIqdisxXT1ELHVbMipBXT1wLHVbMipBKzFdPVUsbVt3KytdPXgsbVt3KytdPXYsbVt3KytdPUF9fXJldHVybiBsKDAsMCxzLHMscywwKSxsKHMscywwLDAsMCxzKSx7YXR0cmlidXRlczp0aGlzLl9nZXRNZXNoQXR0cmlidXRlcyh0aGlzLnRlcnJhaW4sdSxtKSxpbmRpY2VzOm19fV9nZXRNZXNoQXR0cmlidXRlcyhkLHksVil7Y29uc3QgYT1NYXRoLmZsb29yKE1hdGguc3FydChkLmxlbmd0aCkpLGU9YS0xLHI9eS5sZW5ndGgvMixzPW5ldyBGbG9hdDMyQXJyYXkociozKSx0PW5ldyBGbG9hdDMyQXJyYXkocioyKTtmb3IobGV0IGg9MDtoPHI7aCsrKXtjb25zdCBpPXlbaCoyXSxvPXlbaCoyKzFdLGM9byphK2k7c1szKmgrMF09aS9lLS41LHNbMypoKzFdPS41LW8vZSxzWzMqaCsyXT1kW2NdLHRbMipoKzBdPWkvZSx0WzIqaCsxXT0xLW8vZX1jb25zdCBuPUsocyxWKTtyZXR1cm57cG9zaXRpb246e3ZhbHVlOnMsc2l6ZTozfSx0ZXhjb29yZDp7dmFsdWU6dCxzaXplOjJ9LG5vcm1hbDp7dmFsdWU6bixzaXplOjN9fX19Y29uc3QgbmU9ZnVuY3Rpb24oKXt2YXIgaz17fTtrLmRlZmF1bHROb0RhdGFWYWx1ZT0tMzQwMjc5OTkzODc5MDE0ODRlMjIsay5kZWNvZGU9ZnVuY3Rpb24ocixzKXtzPXN8fHt9O3ZhciB0PXMuZW5jb2RlZE1hc2tEYXRhfHxzLmVuY29kZWRNYXNrRGF0YT09PW51bGwsbj1hKHIscy5pbnB1dE9mZnNldHx8MCx0KSxoPXMubm9EYXRhVmFsdWUhPT1udWxsP3Mubm9EYXRhVmFsdWU6ay5kZWZhdWx0Tm9EYXRhVmFsdWUsaT1kKG4scy5waXhlbFR5cGV8fEZsb2F0MzJBcnJheSxzLmVuY29kZWRNYXNrRGF0YSxoLHMucmV0dXJuTWFzayksbz17d2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHQscGl4ZWxEYXRhOmkucmVzdWx0UGl4ZWxzLG1pblZhbHVlOmkubWluVmFsdWUsbWF4VmFsdWU6bi5waXhlbHMubWF4VmFsdWUsbm9EYXRhVmFsdWU6aH07cmV0dXJuIGkucmVzdWx0TWFzayYmKG8ubWFza0RhdGE9aS5yZXN1bHRNYXNrKSxzLnJldHVybkVuY29kZWRNYXNrJiZuLm1hc2smJihvLmVuY29kZWRNYXNrRGF0YT1uLm1hc2suYml0c2V0P24ubWFzay5iaXRzZXQ6bnVsbCkscy5yZXR1cm5GaWxlSW5mbyYmKG8uZmlsZUluZm89eShuKSxzLmNvbXB1dGVVc2VkQml0RGVwdGhzJiYoby5maWxlSW5mby5iaXREZXB0aHM9VihuKSkpLG99O3ZhciBkPWZ1bmN0aW9uKHIscyx0LG4saCl7dmFyIGk9MCxvPXIucGl4ZWxzLm51bUJsb2Nrc1gsYz1yLnBpeGVscy5udW1CbG9ja3NZLHU9TWF0aC5mbG9vcihyLndpZHRoL28pLG09TWF0aC5mbG9vcihyLmhlaWdodC9jKSx3PTIqci5tYXhaRXJyb3IsbD1OdW1iZXIuTUFYX1ZBTFVFLGY7dD10fHwoci5tYXNrP3IubWFzay5iaXRzZXQ6bnVsbCk7dmFyIGcsTTtnPW5ldyBzKHIud2lkdGgqci5oZWlnaHQpLGgmJnQmJihNPW5ldyBVaW50OEFycmF5KHIud2lkdGgqci5oZWlnaHQpKTtmb3IodmFyIEQ9bmV3IEZsb2F0MzJBcnJheSh1Km0pLHAsVSxJPTA7STw9YztJKyspe3ZhciB6PUkhPT1jP206ci5oZWlnaHQlYztpZih6IT09MClmb3IodmFyIHg9MDt4PD1vO3grKyl7dmFyIHY9eCE9PW8/dTpyLndpZHRoJW87aWYodiE9PTApe3ZhciBBPUkqci53aWR0aCptK3gqdSxUPXIud2lkdGgtdixTPXIucGl4ZWxzLmJsb2Nrc1tpXSxiLEwsRjtTLmVuY29kaW5nPDI/KFMuZW5jb2Rpbmc9PT0wP2I9Uy5yYXdEYXRhOihlKFMuc3R1ZmZlZERhdGEsUy5iaXRzUGVyUGl4ZWwsUy5udW1WYWxpZFBpeGVscyxTLm9mZnNldCx3LEQsci5waXhlbHMubWF4VmFsdWUpLGI9RCksTD0wKTpTLmVuY29kaW5nPT09Mj9GPTA6Rj1TLm9mZnNldDt2YXIgQjtpZih0KWZvcihVPTA7VTx6O1UrKyl7Zm9yKEEmNyYmKEI9dFtBPj4zXSxCPDw9QSY3KSxwPTA7cDx2O3ArKylBJjd8fChCPXRbQT4+M10pLEImMTI4PyhNJiYoTVtBXT0xKSxmPVMuZW5jb2Rpbmc8Mj9iW0wrK106RixsPWw+Zj9mOmwsZ1tBKytdPWYpOihNJiYoTVtBXT0wKSxnW0ErK109biksQjw8PTE7QSs9VH1lbHNlIGlmKFMuZW5jb2Rpbmc8Milmb3IoVT0wO1U8ejtVKyspe2ZvcihwPTA7cDx2O3ArKylmPWJbTCsrXSxsPWw+Zj9mOmwsZ1tBKytdPWY7QSs9VH1lbHNlIGZvcihsPWw+Rj9GOmwsVT0wO1U8ejtVKyspe2ZvcihwPTA7cDx2O3ArKylnW0ErK109RjtBKz1UfWlmKFMuZW5jb2Rpbmc9PT0xJiZMIT09Uy5udW1WYWxpZFBpeGVscyl0aHJvdyJCbG9jayBhbmQgTWFzayBkbyBub3QgbWF0Y2giO2krK319fXJldHVybntyZXN1bHRQaXhlbHM6ZyxyZXN1bHRNYXNrOk0sbWluVmFsdWU6bH19LHk9ZnVuY3Rpb24ocil7cmV0dXJue2ZpbGVJZGVudGlmaWVyU3RyaW5nOnIuZmlsZUlkZW50aWZpZXJTdHJpbmcsZmlsZVZlcnNpb246ci5maWxlVmVyc2lvbixpbWFnZVR5cGU6ci5pbWFnZVR5cGUsaGVpZ2h0OnIuaGVpZ2h0LHdpZHRoOnIud2lkdGgsbWF4WkVycm9yOnIubWF4WkVycm9yLGVvZk9mZnNldDpyLmVvZk9mZnNldCxtYXNrOnIubWFzaz97bnVtQmxvY2tzWDpyLm1hc2subnVtQmxvY2tzWCxudW1CbG9ja3NZOnIubWFzay5udW1CbG9ja3NZLG51bUJ5dGVzOnIubWFzay5udW1CeXRlcyxtYXhWYWx1ZTpyLm1hc2subWF4VmFsdWV9Om51bGwscGl4ZWxzOntudW1CbG9ja3NYOnIucGl4ZWxzLm51bUJsb2Nrc1gsbnVtQmxvY2tzWTpyLnBpeGVscy5udW1CbG9ja3NZLG51bUJ5dGVzOnIucGl4ZWxzLm51bUJ5dGVzLG1heFZhbHVlOnIucGl4ZWxzLm1heFZhbHVlLG5vRGF0YVZhbHVlOnIubm9EYXRhVmFsdWV9fX0sVj1mdW5jdGlvbihyKXtmb3IodmFyIHM9ci5waXhlbHMubnVtQmxvY2tzWCpyLnBpeGVscy5udW1CbG9ja3NZLHQ9e30sbj0wO248cztuKyspe3ZhciBoPXIucGl4ZWxzLmJsb2Nrc1tuXTtoLmVuY29kaW5nPT09MD90LmZsb2F0MzI9ITA6aC5lbmNvZGluZz09PTE/dFtoLmJpdHNQZXJQaXhlbF09ITA6dFswXT0hMH1yZXR1cm4gT2JqZWN0LmtleXModCl9LGE9ZnVuY3Rpb24ocixzLHQpe3ZhciBuPXt9LGg9bmV3IFVpbnQ4QXJyYXkocixzLDEwKTtpZihuLmZpbGVJZGVudGlmaWVyU3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxoKSxuLmZpbGVJZGVudGlmaWVyU3RyaW5nLnRyaW0oKSE9PSJDbnRaSW1hZ2UiKXRocm93IlVuZXhwZWN0ZWQgZmlsZSBpZGVudGlmaWVyIHN0cmluZzogIituLmZpbGVJZGVudGlmaWVyU3RyaW5nO3MrPTEwO3ZhciBpPW5ldyBEYXRhVmlldyhyLHMsMjQpO2lmKG4uZmlsZVZlcnNpb249aS5nZXRJbnQzMigwLCEwKSxuLmltYWdlVHlwZT1pLmdldEludDMyKDQsITApLG4uaGVpZ2h0PWkuZ2V0VWludDMyKDgsITApLG4ud2lkdGg9aS5nZXRVaW50MzIoMTIsITApLG4ubWF4WkVycm9yPWkuZ2V0RmxvYXQ2NCgxNiwhMCkscys9MjQsIXQpaWYoaT1uZXcgRGF0YVZpZXcocixzLDE2KSxuLm1hc2s9e30sbi5tYXNrLm51bUJsb2Nrc1k9aS5nZXRVaW50MzIoMCwhMCksbi5tYXNrLm51bUJsb2Nrc1g9aS5nZXRVaW50MzIoNCwhMCksbi5tYXNrLm51bUJ5dGVzPWkuZ2V0VWludDMyKDgsITApLG4ubWFzay5tYXhWYWx1ZT1pLmdldEZsb2F0MzIoMTIsITApLHMrPTE2LG4ubWFzay5udW1CeXRlcz4wKXt2YXIgbz1uZXcgVWludDhBcnJheShNYXRoLmNlaWwobi53aWR0aCpuLmhlaWdodC84KSk7aT1uZXcgRGF0YVZpZXcocixzLG4ubWFzay5udW1CeXRlcyk7dmFyIGM9aS5nZXRJbnQxNigwLCEwKSx1PTIsbT0wO2Rve2lmKGM+MClmb3IoO2MtLTspb1ttKytdPWkuZ2V0VWludDgodSsrKTtlbHNle3ZhciB3PWkuZ2V0VWludDgodSsrKTtmb3IoYz0tYztjLS07KW9bbSsrXT13fWM9aS5nZXRJbnQxNih1LCEwKSx1Kz0yfXdoaWxlKHU8bi5tYXNrLm51bUJ5dGVzKTtpZihjIT09LTMyNzY4fHxtPG8ubGVuZ3RoKXRocm93IlVuZXhwZWN0ZWQgZW5kIG9mIG1hc2sgUkxFIGVuY29kaW5nIjtuLm1hc2suYml0c2V0PW8scys9bi5tYXNrLm51bUJ5dGVzfWVsc2Ugbi5tYXNrLm51bUJ5dGVzfG4ubWFzay5udW1CbG9ja3NZfG4ubWFzay5tYXhWYWx1ZXx8KG4ubWFzay5iaXRzZXQ9bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKG4ud2lkdGgqbi5oZWlnaHQvOCkpKTtpPW5ldyBEYXRhVmlldyhyLHMsMTYpLG4ucGl4ZWxzPXt9LG4ucGl4ZWxzLm51bUJsb2Nrc1k9aS5nZXRVaW50MzIoMCwhMCksbi5waXhlbHMubnVtQmxvY2tzWD1pLmdldFVpbnQzMig0LCEwKSxuLnBpeGVscy5udW1CeXRlcz1pLmdldFVpbnQzMig4LCEwKSxuLnBpeGVscy5tYXhWYWx1ZT1pLmdldEZsb2F0MzIoMTIsITApLHMrPTE2O3ZhciBsPW4ucGl4ZWxzLm51bUJsb2Nrc1gsZj1uLnBpeGVscy5udW1CbG9ja3NZLGc9bCsobi53aWR0aCVsPjA/MTowKSxNPWYrKG4uaGVpZ2h0JWY+MD8xOjApO24ucGl4ZWxzLmJsb2Nrcz1uZXcgQXJyYXkoZypNKTtmb3IodmFyIEQ9MCxwPTA7cDxNO3ArKylmb3IodmFyIFU9MDtVPGc7VSsrKXt2YXIgST0wLHo9ci5ieXRlTGVuZ3RoLXM7aT1uZXcgRGF0YVZpZXcocixzLE1hdGgubWluKDEwLHopKTt2YXIgeD17fTtuLnBpeGVscy5ibG9ja3NbRCsrXT14O3ZhciB2PWkuZ2V0VWludDgoMCk7aWYoSSsrLHguZW5jb2Rpbmc9diY2Myx4LmVuY29kaW5nPjMpdGhyb3ciSW52YWxpZCBibG9jayBlbmNvZGluZyAoIit4LmVuY29kaW5nKyIpIjtpZih4LmVuY29kaW5nPT09Mil7cysrO2NvbnRpbnVlfWlmKHYhPT0wJiZ2IT09Mil7aWYodj4+PTYseC5vZmZzZXRUeXBlPXYsdj09PTIpeC5vZmZzZXQ9aS5nZXRJbnQ4KDEpLEkrKztlbHNlIGlmKHY9PT0xKXgub2Zmc2V0PWkuZ2V0SW50MTYoMSwhMCksSSs9MjtlbHNlIGlmKHY9PT0wKXgub2Zmc2V0PWkuZ2V0RmxvYXQzMigxLCEwKSxJKz00O2Vsc2UgdGhyb3ciSW52YWxpZCBibG9jayBvZmZzZXQgdHlwZSI7aWYoeC5lbmNvZGluZz09PTEpaWYodj1pLmdldFVpbnQ4KEkpLEkrKyx4LmJpdHNQZXJQaXhlbD12JjYzLHY+Pj02LHgubnVtVmFsaWRQaXhlbHNUeXBlPXYsdj09PTIpeC5udW1WYWxpZFBpeGVscz1pLmdldFVpbnQ4KEkpLEkrKztlbHNlIGlmKHY9PT0xKXgubnVtVmFsaWRQaXhlbHM9aS5nZXRVaW50MTYoSSwhMCksSSs9MjtlbHNlIGlmKHY9PT0wKXgubnVtVmFsaWRQaXhlbHM9aS5nZXRVaW50MzIoSSwhMCksSSs9NDtlbHNlIHRocm93IkludmFsaWQgdmFsaWQgcGl4ZWwgY291bnQgdHlwZSJ9aWYocys9SSx4LmVuY29kaW5nIT09Myl7dmFyIEEsVDtpZih4LmVuY29kaW5nPT09MCl7dmFyIFM9KG4ucGl4ZWxzLm51bUJ5dGVzLTEpLzQ7aWYoUyE9PU1hdGguZmxvb3IoUykpdGhyb3cidW5jb21wcmVzc2VkIGJsb2NrIGhhcyBpbnZhbGlkIGxlbmd0aCI7QT1uZXcgQXJyYXlCdWZmZXIoUyo0KSxUPW5ldyBVaW50OEFycmF5KEEpLFQuc2V0KG5ldyBVaW50OEFycmF5KHIscyxTKjQpKTt2YXIgYj1uZXcgRmxvYXQzMkFycmF5KEEpO3gucmF3RGF0YT1iLHMrPVMqNH1lbHNlIGlmKHguZW5jb2Rpbmc9PT0xKXt2YXIgTD1NYXRoLmNlaWwoeC5udW1WYWxpZFBpeGVscyp4LmJpdHNQZXJQaXhlbC84KSxGPU1hdGguY2VpbChMLzQpO0E9bmV3IEFycmF5QnVmZmVyKEYqNCksVD1uZXcgVWludDhBcnJheShBKSxULnNldChuZXcgVWludDhBcnJheShyLHMsTCkpLHguc3R1ZmZlZERhdGE9bmV3IFVpbnQzMkFycmF5KEEpLHMrPUx9fX1yZXR1cm4gbi5lb2ZPZmZzZXQ9cyxufSxlPWZ1bmN0aW9uKHIscyx0LG4saCxpLG8pe3ZhciBjPSgxPDxzKS0xLHU9MCxtLHc9MCxsLGYsZz1NYXRoLmNlaWwoKG8tbikvaCksTT1yLmxlbmd0aCo0LU1hdGguY2VpbChzKnQvOCk7Zm9yKHJbci5sZW5ndGgtMV08PD04Kk0sbT0wO208dDttKyspe2lmKHc9PT0wJiYoZj1yW3UrK10sdz0zMiksdz49cylsPWY+Pj53LXMmYyx3LT1zO2Vsc2V7dmFyIEQ9cy13O2w9KGYmYyk8PEQmYyxmPXJbdSsrXSx3PTMyLUQsbCs9Zj4+Pnd9aVttXT1sPGc/bitsKmg6b31yZXR1cm4gaX07cmV0dXJuIGt9KCksaWU9ZnVuY3Rpb24oKXt2YXIgaz17dW5zdHVmZjpmdW5jdGlvbihhLGUscixzLHQsbixoLGkpe3ZhciBvPSgxPDxyKS0xLGM9MCx1LG09MCx3LGwsZixnLE09YS5sZW5ndGgqNC1NYXRoLmNlaWwocipzLzgpO2lmKGFbYS5sZW5ndGgtMV08PD04Kk0sdClmb3IodT0wO3U8czt1KyspbT09PTAmJihsPWFbYysrXSxtPTMyKSxtPj1yPyh3PWw+Pj5tLXImbyxtLT1yKTooZj1yLW0sdz0obCZvKTw8ZiZvLGw9YVtjKytdLG09MzItZix3Kz1sPj4+bSksZVt1XT10W3ddO2Vsc2UgZm9yKGc9TWF0aC5jZWlsKChpLW4pL2gpLHU9MDt1PHM7dSsrKW09PT0wJiYobD1hW2MrK10sbT0zMiksbT49cj8odz1sPj4+bS1yJm8sbS09cik6KGY9ci1tLHc9KGwmbyk8PGYmbyxsPWFbYysrXSxtPTMyLWYsdys9bD4+Pm0pLGVbdV09dzxnP24rdypoOml9LHVuc3R1ZmZMVVQ6ZnVuY3Rpb24oYSxlLHIscyx0LG4pe3ZhciBoPSgxPDxlKS0xLGk9MCxvPTAsYz0wLHU9MCxtPTAsdyxsPVtdLGY9YS5sZW5ndGgqNC1NYXRoLmNlaWwoZSpyLzgpO2FbYS5sZW5ndGgtMV08PD04KmY7dmFyIGc9TWF0aC5jZWlsKChuLXMpL3QpO2ZvcihvPTA7bzxyO28rKyl1PT09MCYmKHc9YVtpKytdLHU9MzIpLHU+PWU/KG09dz4+PnUtZSZoLHUtPWUpOihjPWUtdSxtPSh3JmgpPDxjJmgsdz1hW2krK10sdT0zMi1jLG0rPXc+Pj51KSxsW29dPW08Zz9zK20qdDpuO3JldHVybiBsLnVuc2hpZnQocyksbH0sdW5zdHVmZjI6ZnVuY3Rpb24oYSxlLHIscyx0LG4saCxpKXt2YXIgbz0oMTw8ciktMSxjPTAsdSxtPTAsdz0wLGwsZixnO2lmKHQpZm9yKHU9MDt1PHM7dSsrKW09PT0wJiYoZj1hW2MrK10sbT0zMix3PTApLG0+PXI/KGw9Zj4+PncmbyxtLT1yLHcrPXIpOihnPXItbSxsPWY+Pj53Jm8sZj1hW2MrK10sbT0zMi1nLGx8PShmJigxPDxnKS0xKTw8ci1nLHc9ZyksZVt1XT10W2xdO2Vsc2V7dmFyIE09TWF0aC5jZWlsKChpLW4pL2gpO2Zvcih1PTA7dTxzO3UrKyltPT09MCYmKGY9YVtjKytdLG09MzIsdz0wKSxtPj1yPyhsPWY+Pj53Jm8sbS09cix3Kz1yKTooZz1yLW0sbD1mPj4+dyZvLGY9YVtjKytdLG09MzItZyxsfD0oZiYoMTw8ZyktMSk8PHItZyx3PWcpLGVbdV09bDxNP24rbCpoOml9cmV0dXJuIGV9LHVuc3R1ZmZMVVQyOmZ1bmN0aW9uKGEsZSxyLHMsdCxuKXt2YXIgaD0oMTw8ZSktMSxpPTAsbz0wLGM9MCx1PTAsbT0wLHc9MCxsLGY9W10sZz1NYXRoLmNlaWwoKG4tcykvdCk7Zm9yKG89MDtvPHI7bysrKXU9PT0wJiYobD1hW2krK10sdT0zMix3PTApLHU+PWU/KG09bD4+PncmaCx1LT1lLHcrPWUpOihjPWUtdSxtPWw+Pj53JmgsbD1hW2krK10sdT0zMi1jLG18PShsJigxPDxjKS0xKTw8ZS1jLHc9YyksZltvXT1tPGc/cyttKnQ6bjtyZXR1cm4gZi51bnNoaWZ0KHMpLGZ9LG9yaWdpbmFsVW5zdHVmZjpmdW5jdGlvbihhLGUscixzKXt2YXIgdD0oMTw8ciktMSxuPTAsaCxpPTAsbyxjLHUsbT1hLmxlbmd0aCo0LU1hdGguY2VpbChyKnMvOCk7Zm9yKGFbYS5sZW5ndGgtMV08PD04Km0saD0wO2g8cztoKyspaT09PTAmJihjPWFbbisrXSxpPTMyKSxpPj1yPyhvPWM+Pj5pLXImdCxpLT1yKToodT1yLWksbz0oYyZ0KTw8dSZ0LGM9YVtuKytdLGk9MzItdSxvKz1jPj4+aSksZVtoXT1vO3JldHVybiBlfSxvcmlnaW5hbFVuc3R1ZmYyOmZ1bmN0aW9uKGEsZSxyLHMpe3ZhciB0PSgxPDxyKS0xLG49MCxoLGk9MCxvPTAsYyx1LG07Zm9yKGg9MDtoPHM7aCsrKWk9PT0wJiYodT1hW24rK10saT0zMixvPTApLGk+PXI/KGM9dT4+Pm8mdCxpLT1yLG8rPXIpOihtPXItaSxjPXU+Pj5vJnQsdT1hW24rK10saT0zMi1tLGN8PSh1JigxPDxtKS0xKTw8ci1tLG89bSksZVtoXT1jO3JldHVybiBlfX0sZD17SFVGRk1BTl9MVVRfQklUU19NQVg6MTIsY29tcHV0ZUNoZWNrc3VtRmxldGNoZXIzMjpmdW5jdGlvbihhKXtmb3IodmFyIGU9NjU1MzUscj02NTUzNSxzPWEubGVuZ3RoLHQ9TWF0aC5mbG9vcihzLzIpLG49MDt0Oyl7dmFyIGg9dD49MzU5PzM1OTp0O3QtPWg7ZG8gZSs9YVtuKytdPDw4LHIrPWUrPWFbbisrXTt3aGlsZSgtLWgpO2U9KGUmNjU1MzUpKyhlPj4+MTYpLHI9KHImNjU1MzUpKyhyPj4+MTYpfXJldHVybiBzJjEmJihyKz1lKz1hW25dPDw4KSxlPShlJjY1NTM1KSsoZT4+PjE2KSxyPShyJjY1NTM1KSsocj4+PjE2KSwocjw8MTZ8ZSk+Pj4wfSxyZWFkSGVhZGVySW5mbzpmdW5jdGlvbihhLGUpe3ZhciByPWUucHRyLHM9bmV3IFVpbnQ4QXJyYXkoYSxyLDYpLHQ9e307aWYodC5maWxlSWRlbnRpZmllclN0cmluZz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwscyksdC5maWxlSWRlbnRpZmllclN0cmluZy5sYXN0SW5kZXhPZigiTGVyYzIiLDApIT09MCl0aHJvdyJVbmV4cGVjdGVkIGZpbGUgaWRlbnRpZmllciBzdHJpbmcgKGV4cGVjdCBMZXJjMiApOiAiK3QuZmlsZUlkZW50aWZpZXJTdHJpbmc7cis9Njt2YXIgbj1uZXcgRGF0YVZpZXcoYSxyLDgpLGg9bi5nZXRJbnQzMigwLCEwKTt0LmZpbGVWZXJzaW9uPWgscis9NCxoPj0zJiYodC5jaGVja3N1bT1uLmdldFVpbnQzMig0LCEwKSxyKz00KSxuPW5ldyBEYXRhVmlldyhhLHIsMTIpLHQuaGVpZ2h0PW4uZ2V0VWludDMyKDAsITApLHQud2lkdGg9bi5nZXRVaW50MzIoNCwhMCkscis9OCxoPj00Pyh0Lm51bURpbXM9bi5nZXRVaW50MzIoOCwhMCkscis9NCk6dC5udW1EaW1zPTEsbj1uZXcgRGF0YVZpZXcoYSxyLDQwKSx0Lm51bVZhbGlkUGl4ZWw9bi5nZXRVaW50MzIoMCwhMCksdC5taWNyb0Jsb2NrU2l6ZT1uLmdldEludDMyKDQsITApLHQuYmxvYlNpemU9bi5nZXRJbnQzMig4LCEwKSx0LmltYWdlVHlwZT1uLmdldEludDMyKDEyLCEwKSx0Lm1heFpFcnJvcj1uLmdldEZsb2F0NjQoMTYsITApLHQuek1pbj1uLmdldEZsb2F0NjQoMjQsITApLHQuek1heD1uLmdldEZsb2F0NjQoMzIsITApLHIrPTQwLGUuaGVhZGVySW5mbz10LGUucHRyPXI7dmFyIGksbztpZihoPj0zJiYobz1oPj00PzUyOjQ4LGk9dGhpcy5jb21wdXRlQ2hlY2tzdW1GbGV0Y2hlcjMyKG5ldyBVaW50OEFycmF5KGEsci1vLHQuYmxvYlNpemUtMTQpKSxpIT09dC5jaGVja3N1bSkpdGhyb3ciQ2hlY2tzdW0gZmFpbGVkLiI7cmV0dXJuITB9LGNoZWNrTWluTWF4UmFuZ2VzOmZ1bmN0aW9uKGEsZSl7dmFyIHI9ZS5oZWFkZXJJbmZvLHM9dGhpcy5nZXREYXRhVHlwZUFycmF5KHIuaW1hZ2VUeXBlKSx0PXIubnVtRGltcyp0aGlzLmdldERhdGFUeXBlU2l6ZShyLmltYWdlVHlwZSksbj10aGlzLnJlYWRTdWJBcnJheShhLGUucHRyLHMsdCksaD10aGlzLnJlYWRTdWJBcnJheShhLGUucHRyK3Qscyx0KTtlLnB0cis9Mip0O3ZhciBpLG89ITA7Zm9yKGk9MDtpPHIubnVtRGltcztpKyspaWYobltpXSE9PWhbaV0pe289ITE7YnJlYWt9cmV0dXJuIHIubWluVmFsdWVzPW4sci5tYXhWYWx1ZXM9aCxvfSxyZWFkU3ViQXJyYXk6ZnVuY3Rpb24oYSxlLHIscyl7dmFyIHQ7aWYocj09PVVpbnQ4QXJyYXkpdD1uZXcgVWludDhBcnJheShhLGUscyk7ZWxzZXt2YXIgbj1uZXcgQXJyYXlCdWZmZXIocyksaD1uZXcgVWludDhBcnJheShuKTtoLnNldChuZXcgVWludDhBcnJheShhLGUscykpLHQ9bmV3IHIobil9cmV0dXJuIHR9LHJlYWRNYXNrOmZ1bmN0aW9uKGEsZSl7dmFyIHI9ZS5wdHIscz1lLmhlYWRlckluZm8sdD1zLndpZHRoKnMuaGVpZ2h0LG49cy5udW1WYWxpZFBpeGVsLGg9bmV3IERhdGFWaWV3KGEsciw0KSxpPXt9O2lmKGkubnVtQnl0ZXM9aC5nZXRVaW50MzIoMCwhMCkscis9NCwobj09PTB8fHQ9PT1uKSYmaS5udW1CeXRlcyE9PTApdGhyb3ciaW52YWxpZCBtYXNrIjt2YXIgbyxjO2lmKG49PT0wKW89bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKHQvOCkpLGkuYml0c2V0PW8sYz1uZXcgVWludDhBcnJheSh0KSxlLnBpeGVscy5yZXN1bHRNYXNrPWMscis9aS5udW1CeXRlcztlbHNlIGlmKGkubnVtQnl0ZXM+MCl7bz1uZXcgVWludDhBcnJheShNYXRoLmNlaWwodC84KSksaD1uZXcgRGF0YVZpZXcoYSxyLGkubnVtQnl0ZXMpO3ZhciB1PWguZ2V0SW50MTYoMCwhMCksbT0yLHc9MCxsPTA7ZG97aWYodT4wKWZvcig7dS0tOylvW3crK109aC5nZXRVaW50OChtKyspO2Vsc2UgZm9yKGw9aC5nZXRVaW50OChtKyspLHU9LXU7dS0tOylvW3crK109bDt1PWguZ2V0SW50MTYobSwhMCksbSs9Mn13aGlsZShtPGkubnVtQnl0ZXMpO2lmKHUhPT0tMzI3Njh8fHc8by5sZW5ndGgpdGhyb3ciVW5leHBlY3RlZCBlbmQgb2YgbWFzayBSTEUgZW5jb2RpbmciO2M9bmV3IFVpbnQ4QXJyYXkodCk7dmFyIGY9MCxnPTA7Zm9yKGc9MDtnPHQ7ZysrKWcmNz8oZj1vW2c+PjNdLGY8PD1nJjcpOmY9b1tnPj4zXSxmJjEyOCYmKGNbZ109MSk7ZS5waXhlbHMucmVzdWx0TWFzaz1jLGkuYml0c2V0PW8scis9aS5udW1CeXRlc31yZXR1cm4gZS5wdHI9cixlLm1hc2s9aSwhMH0scmVhZERhdGFPbmVTd2VlcDpmdW5jdGlvbihhLGUscixzKXt2YXIgdD1lLnB0cixuPWUuaGVhZGVySW5mbyxoPW4ubnVtRGltcyxpPW4ud2lkdGgqbi5oZWlnaHQsbz1uLmltYWdlVHlwZSxjPW4ubnVtVmFsaWRQaXhlbCpkLmdldERhdGFUeXBlU2l6ZShvKSpoLHUsbT1lLnBpeGVscy5yZXN1bHRNYXNrO2lmKHI9PT1VaW50OEFycmF5KXU9bmV3IFVpbnQ4QXJyYXkoYSx0LGMpO2Vsc2V7dmFyIHc9bmV3IEFycmF5QnVmZmVyKGMpLGw9bmV3IFVpbnQ4QXJyYXkodyk7bC5zZXQobmV3IFVpbnQ4QXJyYXkoYSx0LGMpKSx1PW5ldyByKHcpfWlmKHUubGVuZ3RoPT09aSpoKXM/ZS5waXhlbHMucmVzdWx0UGl4ZWxzPWQuc3dhcERpbWVuc2lvbk9yZGVyKHUsaSxoLHIsITApOmUucGl4ZWxzLnJlc3VsdFBpeGVscz11O2Vsc2V7ZS5waXhlbHMucmVzdWx0UGl4ZWxzPW5ldyByKGkqaCk7dmFyIGY9MCxnPTAsTT0wLEQ9MDtpZihoPjEpe2lmKHMpe2ZvcihnPTA7ZzxpO2crKylpZihtW2ddKWZvcihEPWcsTT0wO008aDtNKyssRCs9aSllLnBpeGVscy5yZXN1bHRQaXhlbHNbRF09dVtmKytdfWVsc2UgZm9yKGc9MDtnPGk7ZysrKWlmKG1bZ10pZm9yKEQ9ZypoLE09MDtNPGg7TSsrKWUucGl4ZWxzLnJlc3VsdFBpeGVsc1tEK01dPXVbZisrXX1lbHNlIGZvcihnPTA7ZzxpO2crKyltW2ddJiYoZS5waXhlbHMucmVzdWx0UGl4ZWxzW2ddPXVbZisrXSl9cmV0dXJuIHQrPWMsZS5wdHI9dCwhMH0scmVhZEh1ZmZtYW5UcmVlOmZ1bmN0aW9uKGEsZSl7dmFyIHI9dGhpcy5IVUZGTUFOX0xVVF9CSVRTX01BWCxzPW5ldyBEYXRhVmlldyhhLGUucHRyLDE2KTtlLnB0cis9MTY7dmFyIHQ9cy5nZXRJbnQzMigwLCEwKTtpZih0PDIpdGhyb3cidW5zdXBwb3J0ZWQgSHVmZm1hbiB2ZXJzaW9uIjt2YXIgbj1zLmdldEludDMyKDQsITApLGg9cy5nZXRJbnQzMig4LCEwKSxpPXMuZ2V0SW50MzIoMTIsITApO2lmKGg+PWkpcmV0dXJuITE7dmFyIG89bmV3IFVpbnQzMkFycmF5KGktaCk7ZC5kZWNvZGVCaXRzKGEsZSxvKTt2YXIgYz1bXSx1LG0sdyxsO2Zvcih1PWg7dTxpO3UrKyltPXUtKHU8bj8wOm4pLGNbbV09e2ZpcnN0Om9bdS1oXSxzZWNvbmQ6bnVsbH07dmFyIGY9YS5ieXRlTGVuZ3RoLWUucHRyLGc9TWF0aC5jZWlsKGYvNCksTT1uZXcgQXJyYXlCdWZmZXIoZyo0KSxEPW5ldyBVaW50OEFycmF5KE0pO0Quc2V0KG5ldyBVaW50OEFycmF5KGEsZS5wdHIsZikpO3ZhciBwPW5ldyBVaW50MzJBcnJheShNKSxVPTAsSSx6PTA7Zm9yKEk9cFswXSx1PWg7dTxpO3UrKyltPXUtKHU8bj8wOm4pLGw9Y1ttXS5maXJzdCxsPjAmJihjW21dLnNlY29uZD1JPDxVPj4+MzItbCwzMi1VPj1sPyhVKz1sLFU9PT0zMiYmKFU9MCx6KyssST1wW3pdKSk6KFUrPWwtMzIseisrLEk9cFt6XSxjW21dLnNlY29uZHw9ST4+PjMyLVUpKTt2YXIgeD0wLHY9MCxBPW5ldyB5O2Zvcih1PTA7dTxjLmxlbmd0aDt1KyspY1t1XSE9PXZvaWQgMCYmKHg9TWF0aC5tYXgoeCxjW3VdLmZpcnN0KSk7eD49cj92PXI6dj14O3ZhciBUPVtdLFMsYixMLEYsQixDO2Zvcih1PWg7dTxpO3UrKylpZihtPXUtKHU8bj8wOm4pLGw9Y1ttXS5maXJzdCxsPjApaWYoUz1bbCxtXSxsPD12KWZvcihiPWNbbV0uc2Vjb25kPDx2LWwsTD0xPDx2LWwsdz0wO3c8TDt3KyspVFtifHddPVM7ZWxzZSBmb3IoYj1jW21dLnNlY29uZCxDPUEsRj1sLTE7Rj49MDtGLS0pQj1iPj4+RiYxLEI/KEMucmlnaHR8fChDLnJpZ2h0PW5ldyB5KSxDPUMucmlnaHQpOihDLmxlZnR8fChDLmxlZnQ9bmV3IHkpLEM9Qy5sZWZ0KSxGPT09MCYmIUMudmFsJiYoQy52YWw9U1sxXSk7cmV0dXJue2RlY29kZUx1dDpULG51bUJpdHNMVVRRaWNrOnYsbnVtQml0c0xVVDp4LHRyZWU6QSxzdHVmZmVkRGF0YTpwLHNyY1B0cjp6LGJpdFBvczpVfX0scmVhZEh1ZmZtYW46ZnVuY3Rpb24oYSxlLHIscyl7dmFyIHQ9ZS5oZWFkZXJJbmZvLG49dC5udW1EaW1zLGg9ZS5oZWFkZXJJbmZvLmhlaWdodCxpPWUuaGVhZGVySW5mby53aWR0aCxvPWkqaCxjPXRoaXMucmVhZEh1ZmZtYW5UcmVlKGEsZSksdT1jLmRlY29kZUx1dCxtPWMudHJlZSx3PWMuc3R1ZmZlZERhdGEsbD1jLnNyY1B0cixmPWMuYml0UG9zLGc9Yy5udW1CaXRzTFVUUWljayxNPWMubnVtQml0c0xVVCxEPWUuaGVhZGVySW5mby5pbWFnZVR5cGU9PT0wPzEyODowLHAsVSxJLHo9ZS5waXhlbHMucmVzdWx0TWFzayx4LHYsQSxULFMsYixMLEY9MDtmPjAmJihsKyssZj0wKTt2YXIgQj13W2xdLEM9ZS5lbmNvZGVNb2RlPT09MSxIPW5ldyByKG8qbiksTz1ILFg7aWYobjwyfHxDKXtmb3IoWD0wO1g8bjtYKyspaWYobj4xJiYoTz1uZXcgcihILmJ1ZmZlcixvKlgsbyksRj0wKSxlLmhlYWRlckluZm8ubnVtVmFsaWRQaXhlbD09PWkqaClmb3IoYj0wLFQ9MDtUPGg7VCsrKWZvcihTPTA7UzxpO1MrKyxiKyspe2lmKFU9MCx4PUI8PGY+Pj4zMi1nLHY9eCwzMi1mPGcmJih4fD13W2wrMV0+Pj42NC1mLWcsdj14KSx1W3ZdKVU9dVt2XVsxXSxmKz11W3ZdWzBdO2Vsc2UgZm9yKHg9Qjw8Zj4+PjMyLU0sdj14LDMyLWY8TSYmKHh8PXdbbCsxXT4+PjY0LWYtTSx2PXgpLHA9bSxMPTA7TDxNO0wrKylpZihBPXg+Pj5NLUwtMSYxLHA9QT9wLnJpZ2h0OnAubGVmdCwhKHAubGVmdHx8cC5yaWdodCkpe1U9cC52YWwsZj1mK0wrMTticmVha31mPj0zMiYmKGYtPTMyLGwrKyxCPXdbbF0pLEk9VS1ELEM/KFM+MD9JKz1GOlQ+MD9JKz1PW2ItaV06SSs9RixJJj0yNTUsT1tiXT1JLEY9SSk6T1tiXT1JfWVsc2UgZm9yKGI9MCxUPTA7VDxoO1QrKylmb3IoUz0wO1M8aTtTKyssYisrKWlmKHpbYl0pe2lmKFU9MCx4PUI8PGY+Pj4zMi1nLHY9eCwzMi1mPGcmJih4fD13W2wrMV0+Pj42NC1mLWcsdj14KSx1W3ZdKVU9dVt2XVsxXSxmKz11W3ZdWzBdO2Vsc2UgZm9yKHg9Qjw8Zj4+PjMyLU0sdj14LDMyLWY8TSYmKHh8PXdbbCsxXT4+PjY0LWYtTSx2PXgpLHA9bSxMPTA7TDxNO0wrKylpZihBPXg+Pj5NLUwtMSYxLHA9QT9wLnJpZ2h0OnAubGVmdCwhKHAubGVmdHx8cC5yaWdodCkpe1U9cC52YWwsZj1mK0wrMTticmVha31mPj0zMiYmKGYtPTMyLGwrKyxCPXdbbF0pLEk9VS1ELEM/KFM+MCYmeltiLTFdP0krPUY6VD4wJiZ6W2ItaV0/SSs9T1tiLWldOkkrPUYsSSY9MjU1LE9bYl09SSxGPUkpOk9bYl09SX19ZWxzZSBmb3IoYj0wLFQ9MDtUPGg7VCsrKWZvcihTPTA7UzxpO1MrKylpZihiPVQqaStTLCF6fHx6W2JdKWZvcihYPTA7WDxuO1grKyxiKz1vKXtpZihVPTAseD1CPDxmPj4+MzItZyx2PXgsMzItZjxnJiYoeHw9d1tsKzFdPj4+NjQtZi1nLHY9eCksdVt2XSlVPXVbdl1bMV0sZis9dVt2XVswXTtlbHNlIGZvcih4PUI8PGY+Pj4zMi1NLHY9eCwzMi1mPE0mJih4fD13W2wrMV0+Pj42NC1mLU0sdj14KSxwPW0sTD0wO0w8TTtMKyspaWYoQT14Pj4+TS1MLTEmMSxwPUE/cC5yaWdodDpwLmxlZnQsIShwLmxlZnR8fHAucmlnaHQpKXtVPXAudmFsLGY9ZitMKzE7YnJlYWt9Zj49MzImJihmLT0zMixsKyssQj13W2xdKSxJPVUtRCxPW2JdPUl9ZS5wdHI9ZS5wdHIrKGwrMSkqNCsoZj4wPzQ6MCksZS5waXhlbHMucmVzdWx0UGl4ZWxzPUgsbj4xJiYhcyYmKGUucGl4ZWxzLnJlc3VsdFBpeGVscz1kLnN3YXBEaW1lbnNpb25PcmRlcihILG8sbixyKSl9LGRlY29kZUJpdHM6ZnVuY3Rpb24oYSxlLHIscyx0KXt7dmFyIG49ZS5oZWFkZXJJbmZvLGg9bi5maWxlVmVyc2lvbixpPTAsbz1hLmJ5dGVMZW5ndGgtZS5wdHI+PTU/NTphLmJ5dGVMZW5ndGgtZS5wdHIsYz1uZXcgRGF0YVZpZXcoYSxlLnB0cixvKSx1PWMuZ2V0VWludDgoMCk7aSsrO3ZhciBtPXU+PjYsdz1tPT09MD80OjMtbSxsPSh1JjMyKT4wLGY9dSYzMSxnPTA7aWYodz09PTEpZz1jLmdldFVpbnQ4KGkpLGkrKztlbHNlIGlmKHc9PT0yKWc9Yy5nZXRVaW50MTYoaSwhMCksaSs9MjtlbHNlIGlmKHc9PT00KWc9Yy5nZXRVaW50MzIoaSwhMCksaSs9NDtlbHNlIHRocm93IkludmFsaWQgdmFsaWQgcGl4ZWwgY291bnQgdHlwZSI7dmFyIE09MipuLm1heFpFcnJvcixELHAsVSxJLHoseCx2LEEsVCxTPW4ubnVtRGltcz4xP24ubWF4VmFsdWVzW3RdOm4uek1heDtpZihsKXtmb3IoZS5jb3VudGVyLmx1dCsrLEE9Yy5nZXRVaW50OChpKSxpKyssST1NYXRoLmNlaWwoKEEtMSkqZi84KSx6PU1hdGguY2VpbChJLzQpLHA9bmV3IEFycmF5QnVmZmVyKHoqNCksVT1uZXcgVWludDhBcnJheShwKSxlLnB0cis9aSxVLnNldChuZXcgVWludDhBcnJheShhLGUucHRyLEkpKSx2PW5ldyBVaW50MzJBcnJheShwKSxlLnB0cis9SSxUPTA7QS0xPj4+VDspVCsrO0k9TWF0aC5jZWlsKGcqVC84KSx6PU1hdGguY2VpbChJLzQpLHA9bmV3IEFycmF5QnVmZmVyKHoqNCksVT1uZXcgVWludDhBcnJheShwKSxVLnNldChuZXcgVWludDhBcnJheShhLGUucHRyLEkpKSxEPW5ldyBVaW50MzJBcnJheShwKSxlLnB0cis9SSxoPj0zP3g9ay51bnN0dWZmTFVUMih2LGYsQS0xLHMsTSxTKTp4PWsudW5zdHVmZkxVVCh2LGYsQS0xLHMsTSxTKSxoPj0zP2sudW5zdHVmZjIoRCxyLFQsZyx4KTprLnVuc3R1ZmYoRCxyLFQsZyx4KX1lbHNlIGUuY291bnRlci5iaXRzdHVmZmVyKyssVD1mLGUucHRyKz1pLFQ+MCYmKEk9TWF0aC5jZWlsKGcqVC84KSx6PU1hdGguY2VpbChJLzQpLHA9bmV3IEFycmF5QnVmZmVyKHoqNCksVT1uZXcgVWludDhBcnJheShwKSxVLnNldChuZXcgVWludDhBcnJheShhLGUucHRyLEkpKSxEPW5ldyBVaW50MzJBcnJheShwKSxlLnB0cis9SSxoPj0zP3M9PW51bGw/ay5vcmlnaW5hbFVuc3R1ZmYyKEQscixULGcpOmsudW5zdHVmZjIoRCxyLFQsZywhMSxzLE0sUyk6cz09bnVsbD9rLm9yaWdpbmFsVW5zdHVmZihELHIsVCxnKTprLnVuc3R1ZmYoRCxyLFQsZywhMSxzLE0sUykpfX0scmVhZFRpbGVzOmZ1bmN0aW9uKGEsZSxyLHMpe3ZhciB0PWUuaGVhZGVySW5mbyxuPXQud2lkdGgsaD10LmhlaWdodCxpPW4qaCxvPXQubWljcm9CbG9ja1NpemUsYz10LmltYWdlVHlwZSx1PWQuZ2V0RGF0YVR5cGVTaXplKGMpLG09TWF0aC5jZWlsKG4vbyksdz1NYXRoLmNlaWwoaC9vKTtlLnBpeGVscy5udW1CbG9ja3NZPXcsZS5waXhlbHMubnVtQmxvY2tzWD1tLGUucGl4ZWxzLnB0cj0wO3ZhciBsPTAsZj0wLGc9MCxNPTAsRD0wLHA9MCxVPTAsST0wLHo9MCx4PTAsdj0wLEE9MCxUPTAsUz0wLGI9MCxMPTAsRixCLEMsSCxPLFgsJD1uZXcgcihvKm8pLGhlPWglb3x8byxjZT1uJW98fG8sUSxSLHE9dC5udW1EaW1zLGosRT1lLnBpeGVscy5yZXN1bHRNYXNrLFk9ZS5waXhlbHMucmVzdWx0UGl4ZWxzLG1lPXQuZmlsZVZlcnNpb24sSj1tZT49NT8xNDoxNSxaLEc9dC56TWF4LE47Zm9yKGc9MDtnPHc7ZysrKWZvcihEPWchPT13LTE/bzpoZSxNPTA7TTxtO00rKylmb3IocD1NIT09bS0xP286Y2Usdj1nKm4qbytNKm8sQT1uLXAsaj0wO2o8cTtqKyspe2lmKHE+MT8oTj1ZLHY9ZypuKm8rTSpvLFk9bmV3IHIoZS5waXhlbHMucmVzdWx0UGl4ZWxzLmJ1ZmZlcixpKmoqdSxpKSxHPXQubWF4VmFsdWVzW2pdKTpOPW51bGwsVT1hLmJ5dGVMZW5ndGgtZS5wdHIsRj1uZXcgRGF0YVZpZXcoYSxlLnB0cixNYXRoLm1pbigxMCxVKSksQj17fSxMPTAsST1GLmdldFVpbnQ4KDApLEwrKyxaPXQuZmlsZVZlcnNpb24+PTU/SSY0OjAsej1JPj42JjI1NSx4PUk+PjImSix4IT09KE0qbz4+MyZKKXx8WiYmaj09PTApdGhyb3ciaW50ZWdyaXR5IGlzc3VlIjtpZihYPUkmMyxYPjMpdGhyb3cgZS5wdHIrPUwsIkludmFsaWQgYmxvY2sgZW5jb2RpbmcgKCIrWCsiKSI7aWYoWD09PTIpe2lmKFopaWYoRSlmb3IobD0wO2w8RDtsKyspZm9yKGY9MDtmPHA7ZisrKUVbdl0mJihZW3ZdPU5bdl0pLHYrKztlbHNlIGZvcihsPTA7bDxEO2wrKylmb3IoZj0wO2Y8cDtmKyspWVt2XT1OW3ZdLHYrKztlLmNvdW50ZXIuY29uc3RhbnQrKyxlLnB0cis9TDtjb250aW51ZX1lbHNlIGlmKFg9PT0wKXtpZihaKXRocm93ImludGVncml0eSBpc3N1ZSI7aWYoZS5jb3VudGVyLnVuY29tcHJlc3NlZCsrLGUucHRyKz1MLFQ9RCpwKnUsUz1hLmJ5dGVMZW5ndGgtZS5wdHIsVD1UPFM/VDpTLEM9bmV3IEFycmF5QnVmZmVyKFQldT09PTA/VDpUK3UtVCV1KSxIPW5ldyBVaW50OEFycmF5KEMpLEguc2V0KG5ldyBVaW50OEFycmF5KGEsZS5wdHIsVCkpLE89bmV3IHIoQyksYj0wLEUpZm9yKGw9MDtsPEQ7bCsrKXtmb3IoZj0wO2Y8cDtmKyspRVt2XSYmKFlbdl09T1tiKytdKSx2Kys7dis9QX1lbHNlIGZvcihsPTA7bDxEO2wrKyl7Zm9yKGY9MDtmPHA7ZisrKVlbdisrXT1PW2IrK107dis9QX1lLnB0cis9Yip1fWVsc2UgaWYoUT1kLmdldERhdGFUeXBlVXNlZChaJiZjPDY/NDpjLHopLFI9ZC5nZXRPbmVQaXhlbChCLEwsUSxGKSxMKz1kLmdldERhdGFUeXBlU2l6ZShRKSxYPT09MylpZihlLnB0cis9TCxlLmNvdW50ZXIuY29uc3RhbnRvZmZzZXQrKyxFKWZvcihsPTA7bDxEO2wrKyl7Zm9yKGY9MDtmPHA7ZisrKUVbdl0mJihZW3ZdPVo/TWF0aC5taW4oRyxOW3ZdK1IpOlIpLHYrKzt2Kz1BfWVsc2UgZm9yKGw9MDtsPEQ7bCsrKXtmb3IoZj0wO2Y8cDtmKyspWVt2XT1aP01hdGgubWluKEcsTlt2XStSKTpSLHYrKzt2Kz1BfWVsc2UgaWYoZS5wdHIrPUwsZC5kZWNvZGVCaXRzKGEsZSwkLFIsaiksTD0wLFopaWYoRSlmb3IobD0wO2w8RDtsKyspe2ZvcihmPTA7ZjxwO2YrKylFW3ZdJiYoWVt2XT0kW0wrK10rTlt2XSksdisrO3YrPUF9ZWxzZSBmb3IobD0wO2w8RDtsKyspe2ZvcihmPTA7ZjxwO2YrKylZW3ZdPSRbTCsrXStOW3ZdLHYrKzt2Kz1BfWVsc2UgaWYoRSlmb3IobD0wO2w8RDtsKyspe2ZvcihmPTA7ZjxwO2YrKylFW3ZdJiYoWVt2XT0kW0wrK10pLHYrKzt2Kz1BfWVsc2UgZm9yKGw9MDtsPEQ7bCsrKXtmb3IoZj0wO2Y8cDtmKyspWVt2KytdPSRbTCsrXTt2Kz1BfX1xPjEmJiFzJiYoZS5waXhlbHMucmVzdWx0UGl4ZWxzPWQuc3dhcERpbWVuc2lvbk9yZGVyKGUucGl4ZWxzLnJlc3VsdFBpeGVscyxpLHEscikpfSxmb3JtYXRGaWxlSW5mbzpmdW5jdGlvbihhKXtyZXR1cm57ZmlsZUlkZW50aWZpZXJTdHJpbmc6YS5oZWFkZXJJbmZvLmZpbGVJZGVudGlmaWVyU3RyaW5nLGZpbGVWZXJzaW9uOmEuaGVhZGVySW5mby5maWxlVmVyc2lvbixpbWFnZVR5cGU6YS5oZWFkZXJJbmZvLmltYWdlVHlwZSxoZWlnaHQ6YS5oZWFkZXJJbmZvLmhlaWdodCx3aWR0aDphLmhlYWRlckluZm8ud2lkdGgsbnVtVmFsaWRQaXhlbDphLmhlYWRlckluZm8ubnVtVmFsaWRQaXhlbCxtaWNyb0Jsb2NrU2l6ZTphLmhlYWRlckluZm8ubWljcm9CbG9ja1NpemUsYmxvYlNpemU6YS5oZWFkZXJJbmZvLmJsb2JTaXplLG1heFpFcnJvcjphLmhlYWRlckluZm8ubWF4WkVycm9yLHBpeGVsVHlwZTpkLmdldFBpeGVsVHlwZShhLmhlYWRlckluZm8uaW1hZ2VUeXBlKSxlb2ZPZmZzZXQ6YS5lb2ZPZmZzZXQsbWFzazphLm1hc2s/e251bUJ5dGVzOmEubWFzay5udW1CeXRlc306bnVsbCxwaXhlbHM6e251bUJsb2Nrc1g6YS5waXhlbHMubnVtQmxvY2tzWCxudW1CbG9ja3NZOmEucGl4ZWxzLm51bUJsb2Nrc1ksbWF4VmFsdWU6YS5oZWFkZXJJbmZvLnpNYXgsbWluVmFsdWU6YS5oZWFkZXJJbmZvLnpNaW4sbm9EYXRhVmFsdWU6YS5ub0RhdGFWYWx1ZX19fSxjb25zdHJ1Y3RDb25zdGFudFN1cmZhY2U6ZnVuY3Rpb24oYSxlKXt2YXIgcj1hLmhlYWRlckluZm8uek1heCxzPWEuaGVhZGVySW5mby56TWluLHQ9YS5oZWFkZXJJbmZvLm1heFZhbHVlcyxuPWEuaGVhZGVySW5mby5udW1EaW1zLGg9YS5oZWFkZXJJbmZvLmhlaWdodCphLmhlYWRlckluZm8ud2lkdGgsaT0wLG89MCxjPTAsdT1hLnBpeGVscy5yZXN1bHRNYXNrLG09YS5waXhlbHMucmVzdWx0UGl4ZWxzO2lmKHUpaWYobj4xKXtpZihlKWZvcihpPTA7aTxuO2krKylmb3IoYz1pKmgscj10W2ldLG89MDtvPGg7bysrKXVbb10mJihtW2Mrb109cik7ZWxzZSBmb3Iobz0wO288aDtvKyspaWYodVtvXSlmb3IoYz1vKm4saT0wO2k8bjtpKyspbVtjK25dPXRbaV19ZWxzZSBmb3Iobz0wO288aDtvKyspdVtvXSYmKG1bb109cik7ZWxzZSBpZihuPjEmJnMhPT1yKWlmKGUpZm9yKGk9MDtpPG47aSsrKWZvcihjPWkqaCxyPXRbaV0sbz0wO288aDtvKyspbVtjK29dPXI7ZWxzZSBmb3Iobz0wO288aDtvKyspZm9yKGM9bypuLGk9MDtpPG47aSsrKW1bYytpXT10W2ldO2Vsc2UgZm9yKG89MDtvPGgqbjtvKyspbVtvXT1yfSxnZXREYXRhVHlwZUFycmF5OmZ1bmN0aW9uKGEpe3ZhciBlO3N3aXRjaChhKXtjYXNlIDA6ZT1JbnQ4QXJyYXk7YnJlYWs7Y2FzZSAxOmU9VWludDhBcnJheTticmVhaztjYXNlIDI6ZT1JbnQxNkFycmF5O2JyZWFrO2Nhc2UgMzplPVVpbnQxNkFycmF5O2JyZWFrO2Nhc2UgNDplPUludDMyQXJyYXk7YnJlYWs7Y2FzZSA1OmU9VWludDMyQXJyYXk7YnJlYWs7Y2FzZSA2OmU9RmxvYXQzMkFycmF5O2JyZWFrO2Nhc2UgNzplPUZsb2F0NjRBcnJheTticmVhaztkZWZhdWx0OmU9RmxvYXQzMkFycmF5fXJldHVybiBlfSxnZXRQaXhlbFR5cGU6ZnVuY3Rpb24oYSl7dmFyIGU7c3dpdGNoKGEpe2Nhc2UgMDplPSJTOCI7YnJlYWs7Y2FzZSAxOmU9IlU4IjticmVhaztjYXNlIDI6ZT0iUzE2IjticmVhaztjYXNlIDM6ZT0iVTE2IjticmVhaztjYXNlIDQ6ZT0iUzMyIjticmVhaztjYXNlIDU6ZT0iVTMyIjticmVhaztjYXNlIDY6ZT0iRjMyIjticmVhaztjYXNlIDc6ZT0iRjY0IjticmVhaztkZWZhdWx0OmU9IkYzMiJ9cmV0dXJuIGV9LGlzVmFsaWRQaXhlbFZhbHVlOmZ1bmN0aW9uKGEsZSl7aWYoZT09bnVsbClyZXR1cm4hMTt2YXIgcjtzd2l0Y2goYSl7Y2FzZSAwOnI9ZT49LTEyOCYmZTw9MTI3O2JyZWFrO2Nhc2UgMTpyPWU+PTAmJmU8PTI1NTticmVhaztjYXNlIDI6cj1lPj0tMzI3NjgmJmU8PTMyNzY3O2JyZWFrO2Nhc2UgMzpyPWU+PTAmJmU8PTY1NTM2O2JyZWFrO2Nhc2UgNDpyPWU+PS0yMTQ3NDgzNjQ4JiZlPD0yMTQ3NDgzNjQ3O2JyZWFrO2Nhc2UgNTpyPWU+PTAmJmU8PTQyOTQ5NjcyOTY7YnJlYWs7Y2FzZSA2OnI9ZT49LTM0MDI3OTk5Mzg3OTAxNDg0ZTIyJiZlPD0zNDAyNzk5OTM4NzkwMTQ4NGUyMjticmVhaztjYXNlIDc6cj1lPj0tMTc5NzY5MzEzNDg2MjMxNTdlMjkyJiZlPD0xNzk3NjkzMTM0ODYyMzE1N2UyOTI7YnJlYWs7ZGVmYXVsdDpyPSExfXJldHVybiByfSxnZXREYXRhVHlwZVNpemU6ZnVuY3Rpb24oYSl7dmFyIGU9MDtzd2l0Y2goYSl7Y2FzZSAwOmNhc2UgMTplPTE7YnJlYWs7Y2FzZSAyOmNhc2UgMzplPTI7YnJlYWs7Y2FzZSA0OmNhc2UgNTpjYXNlIDY6ZT00O2JyZWFrO2Nhc2UgNzplPTg7YnJlYWs7ZGVmYXVsdDplPWF9cmV0dXJuIGV9LGdldERhdGFUeXBlVXNlZDpmdW5jdGlvbihhLGUpe3ZhciByPWE7c3dpdGNoKGEpe2Nhc2UgMjpjYXNlIDQ6cj1hLWU7YnJlYWs7Y2FzZSAzOmNhc2UgNTpyPWEtMiplO2JyZWFrO2Nhc2UgNjplPT09MD9yPWE6ZT09PTE/cj0yOnI9MTticmVhaztjYXNlIDc6ZT09PTA/cj1hOnI9YS0yKmUrMTticmVhaztkZWZhdWx0OnI9YTticmVha31yZXR1cm4gcn0sZ2V0T25lUGl4ZWw6ZnVuY3Rpb24oYSxlLHIscyl7dmFyIHQ9MDtzd2l0Y2gocil7Y2FzZSAwOnQ9cy5nZXRJbnQ4KGUpO2JyZWFrO2Nhc2UgMTp0PXMuZ2V0VWludDgoZSk7YnJlYWs7Y2FzZSAyOnQ9cy5nZXRJbnQxNihlLCEwKTticmVhaztjYXNlIDM6dD1zLmdldFVpbnQxNihlLCEwKTticmVhaztjYXNlIDQ6dD1zLmdldEludDMyKGUsITApO2JyZWFrO2Nhc2UgNTp0PXMuZ2V0VUludDMyKGUsITApO2JyZWFrO2Nhc2UgNjp0PXMuZ2V0RmxvYXQzMihlLCEwKTticmVhaztjYXNlIDc6dD1zLmdldEZsb2F0NjQoZSwhMCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJ0aGUgZGVjb2RlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoaXMgcGl4ZWwgdHlwZSJ9cmV0dXJuIHR9LHN3YXBEaW1lbnNpb25PcmRlcjpmdW5jdGlvbihhLGUscixzLHQpe3ZhciBuPTAsaD0wLGk9MCxvPTAsYz1hO2lmKHI+MSlpZihjPW5ldyBzKGUqciksdClmb3Iobj0wO248ZTtuKyspZm9yKG89bixpPTA7aTxyO2krKyxvKz1lKWNbb109YVtoKytdO2Vsc2UgZm9yKG49MDtuPGU7bisrKWZvcihvPW4saT0wO2k8cjtpKyssbys9ZSljW2grK109YVtvXTtyZXR1cm4gY319LHk9ZnVuY3Rpb24oYSxlLHIpe3RoaXMudmFsPWEsdGhpcy5sZWZ0PWUsdGhpcy5yaWdodD1yfSxWPXtkZWNvZGU6ZnVuY3Rpb24oYSxlKXtlPWV8fHt9O3ZhciByPWUubm9EYXRhVmFsdWUscz0wLHQ9e307aWYodC5wdHI9ZS5pbnB1dE9mZnNldHx8MCx0LnBpeGVscz17fSwhIWQucmVhZEhlYWRlckluZm8oYSx0KSl7dmFyIG49dC5oZWFkZXJJbmZvLGg9bi5maWxlVmVyc2lvbixpPWQuZ2V0RGF0YVR5cGVBcnJheShuLmltYWdlVHlwZSk7aWYoaD41KXRocm93InVuc3VwcG9ydGVkIGxlcmMgdmVyc2lvbiAyLiIraDtkLnJlYWRNYXNrKGEsdCksbi5udW1WYWxpZFBpeGVsIT09bi53aWR0aCpuLmhlaWdodCYmIXQucGl4ZWxzLnJlc3VsdE1hc2smJih0LnBpeGVscy5yZXN1bHRNYXNrPWUubWFza0RhdGEpO3ZhciBvPW4ud2lkdGgqbi5oZWlnaHQ7dC5waXhlbHMucmVzdWx0UGl4ZWxzPW5ldyBpKG8qbi5udW1EaW1zKSx0LmNvdW50ZXI9e29uZXN3ZWVwOjAsdW5jb21wcmVzc2VkOjAsbHV0OjAsYml0c3R1ZmZlcjowLGNvbnN0YW50OjAsY29uc3RhbnRvZmZzZXQ6MH07dmFyIGM9IWUucmV0dXJuUGl4ZWxJbnRlcmxlYXZlZERpbXM7aWYobi5udW1WYWxpZFBpeGVsIT09MClpZihuLnpNYXg9PT1uLnpNaW4pZC5jb25zdHJ1Y3RDb25zdGFudFN1cmZhY2UodCxjKTtlbHNlIGlmKGg+PTQmJmQuY2hlY2tNaW5NYXhSYW5nZXMoYSx0KSlkLmNvbnN0cnVjdENvbnN0YW50U3VyZmFjZSh0LGMpO2Vsc2V7dmFyIHU9bmV3IERhdGFWaWV3KGEsdC5wdHIsMiksbT11LmdldFVpbnQ4KDApO2lmKHQucHRyKyssbSlkLnJlYWREYXRhT25lU3dlZXAoYSx0LGksYyk7ZWxzZSBpZihoPjEmJm4uaW1hZ2VUeXBlPD0xJiZNYXRoLmFicyhuLm1heFpFcnJvci0uNSk8MWUtNSl7dmFyIHc9dS5nZXRVaW50OCgxKTtpZih0LnB0cisrLHQuZW5jb2RlTW9kZT13LHc+Mnx8aDw0JiZ3PjEpdGhyb3ciSW52YWxpZCBIdWZmbWFuIGZsYWcgIit3O3c/ZC5yZWFkSHVmZm1hbihhLHQsaSxjKTpkLnJlYWRUaWxlcyhhLHQsaSxjKX1lbHNlIGQucmVhZFRpbGVzKGEsdCxpLGMpfXQuZW9mT2Zmc2V0PXQucHRyO3ZhciBsO2UuaW5wdXRPZmZzZXQ/KGw9dC5oZWFkZXJJbmZvLmJsb2JTaXplK2UuaW5wdXRPZmZzZXQtdC5wdHIsTWF0aC5hYnMobCk+PTEmJih0LmVvZk9mZnNldD1lLmlucHV0T2Zmc2V0K3QuaGVhZGVySW5mby5ibG9iU2l6ZSkpOihsPXQuaGVhZGVySW5mby5ibG9iU2l6ZS10LnB0cixNYXRoLmFicyhsKT49MSYmKHQuZW9mT2Zmc2V0PXQuaGVhZGVySW5mby5ibG9iU2l6ZSkpO3ZhciBmPXt3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodCxwaXhlbERhdGE6dC5waXhlbHMucmVzdWx0UGl4ZWxzLG1pblZhbHVlOm4uek1pbixtYXhWYWx1ZTpuLnpNYXgsdmFsaWRQaXhlbENvdW50Om4ubnVtVmFsaWRQaXhlbCxkaW1Db3VudDpuLm51bURpbXMsZGltU3RhdHM6e21pblZhbHVlczpuLm1pblZhbHVlcyxtYXhWYWx1ZXM6bi5tYXhWYWx1ZXN9LG1hc2tEYXRhOnQucGl4ZWxzLnJlc3VsdE1hc2t9O2lmKHQucGl4ZWxzLnJlc3VsdE1hc2smJmQuaXNWYWxpZFBpeGVsVmFsdWUobi5pbWFnZVR5cGUscikpe3ZhciBnPXQucGl4ZWxzLnJlc3VsdE1hc2s7Zm9yKHM9MDtzPG87cysrKWdbc118fChmLnBpeGVsRGF0YVtzXT1yKTtmLm5vRGF0YVZhbHVlPXJ9cmV0dXJuIHQubm9EYXRhVmFsdWU9cixlLnJldHVybkZpbGVJbmZvJiYoZi5maWxlSW5mbz1kLmZvcm1hdEZpbGVJbmZvKHQpKSxmfX0sZ2V0QmFuZENvdW50OmZ1bmN0aW9uKGEpe3ZhciBlPTAscj0wLHM9e307Zm9yKHMucHRyPTAscy5waXhlbHM9e307cjxhLmJ5dGVMZW5ndGgtNTg7KWQucmVhZEhlYWRlckluZm8oYSxzKSxyKz1zLmhlYWRlckluZm8uYmxvYlNpemUsZSsrLHMucHRyPXI7cmV0dXJuIGV9fTtyZXR1cm4gVn0oKTt2YXIgdGU9ZnVuY3Rpb24oKXt2YXIgaz1uZXcgQXJyYXlCdWZmZXIoNCksZD1uZXcgVWludDhBcnJheShrKSx5PW5ldyBVaW50MzJBcnJheShrKTtyZXR1cm4geVswXT0xLGRbMF09PT0xfSgpLGFlPXtkZWNvZGU6ZnVuY3Rpb24oayxkKXtpZighdGUpdGhyb3ciQmlnIGVuZGlhbiBzeXN0ZW0gaXMgbm90IHN1cHBvcnRlZC4iO2Q9ZHx8e307dmFyIHk9ZC5pbnB1dE9mZnNldHx8MCxWPW5ldyBVaW50OEFycmF5KGsseSwxMCksYT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsViksZSxyO2lmKGEudHJpbSgpPT09IkNudFpJbWFnZSIpZT1uZSxyPTE7ZWxzZSBpZihhLnN1YnN0cmluZygwLDUpPT09IkxlcmMyIillPWllLHI9MjtlbHNlIHRocm93IlVuZXhwZWN0ZWQgZmlsZSBpZGVudGlmaWVyIHN0cmluZzogIithO2Zvcih2YXIgcz0wLHQ9ay5ieXRlTGVuZ3RoLTEwLG4saD1bXSxpLG8sYz17d2lkdGg6MCxoZWlnaHQ6MCxwaXhlbHM6W10scGl4ZWxUeXBlOmQucGl4ZWxUeXBlLG1hc2s6bnVsbCxzdGF0aXN0aWNzOltdfSx1PTA7eTx0Oyl7dmFyIG09ZS5kZWNvZGUoayx7aW5wdXRPZmZzZXQ6eSxlbmNvZGVkTWFza0RhdGE6bixtYXNrRGF0YTpvLHJldHVybk1hc2s6cz09PTAscmV0dXJuRW5jb2RlZE1hc2s6cz09PTAscmV0dXJuRmlsZUluZm86ITAscmV0dXJuUGl4ZWxJbnRlcmxlYXZlZERpbXM6ZC5yZXR1cm5QaXhlbEludGVybGVhdmVkRGltcyxwaXhlbFR5cGU6ZC5waXhlbFR5cGV8fG51bGwsbm9EYXRhVmFsdWU6ZC5ub0RhdGFWYWx1ZXx8bnVsbH0pO3k9bS5maWxlSW5mby5lb2ZPZmZzZXQsbz1tLm1hc2tEYXRhLHM9PT0wJiYobj1tLmVuY29kZWRNYXNrRGF0YSxjLndpZHRoPW0ud2lkdGgsYy5oZWlnaHQ9bS5oZWlnaHQsYy5kaW1Db3VudD1tLmRpbUNvdW50fHwxLGMucGl4ZWxUeXBlPW0ucGl4ZWxUeXBlfHxtLmZpbGVJbmZvLnBpeGVsVHlwZSxjLm1hc2s9bykscj4xJiYobyYmaC5wdXNoKG8pLG0uZmlsZUluZm8ubWFzayYmbS5maWxlSW5mby5tYXNrLm51bUJ5dGVzPjAmJnUrKykscysrLGMucGl4ZWxzLnB1c2gobS5waXhlbERhdGEpLGMuc3RhdGlzdGljcy5wdXNoKHttaW5WYWx1ZTptLm1pblZhbHVlLG1heFZhbHVlOm0ubWF4VmFsdWUsbm9EYXRhVmFsdWU6bS5ub0RhdGFWYWx1ZSxkaW1TdGF0czptLmRpbVN0YXRzfSl9dmFyIHcsbCxmO2lmKHI+MSYmdT4xKXtmb3IoZj1jLndpZHRoKmMuaGVpZ2h0LGMuYmFuZE1hc2tzPWgsbz1uZXcgVWludDhBcnJheShmKSxvLnNldChoWzBdKSx3PTE7dzxoLmxlbmd0aDt3KyspZm9yKGk9aFt3XSxsPTA7bDxmO2wrKylvW2xdPW9bbF0maVtsXTtjLm1hc2tEYXRhPW99cmV0dXJuIGN9fTtjb25zdCBzZT17MDo3ZTMsMTo2ZTMsMjo1ZTMsMzo0ZTMsNDozZTMsNToyNTAwLDY6MmUzLDc6MTUwMCw4OjgwMCw5OjUwMCwxMDoyMDAsMTE6MTAwLDEyOjQwLDEzOjEyLDE0OjUsMTU6MiwxNjoxLDE3Oi41LDE4Oi4yLDE5Oi4xLDIwOi4wMX07ZnVuY3Rpb24gZmUoayl7Y29uc3R7aGVpZ2h0OmQsd2lkdGg6eSxwaXhlbHM6Vn09YWUuZGVjb2RlKGspLGE9bmV3IEZsb2F0MzJBcnJheShkKnkpO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV09VlswXVtlXTtyZXR1cm57YXJyYXk6YSx3aWR0aDp5LGhlaWdodDpkfX1mdW5jdGlvbiBvZShrLGQseSl7bGV0IFY9ZmUoayk7eVsyXS15WzBdPDEmJihWPWxlKFYseSkpO2NvbnN0e2FycmF5OmEsd2lkdGg6ZX09VixzPW5ldyBlZShlKS5jcmVhdGVUaWxlKGEpLHQ9c2VbZF18fDA7cmV0dXJuIHMuZ2V0R2VvbWV0cnlEYXRhKHQpfWZ1bmN0aW9uIGxlKGssZCl7ZnVuY3Rpb24geShzLHQsbixoLGksbyxjLHUpe2NvbnN0IG09bmV3IEZsb2F0MzJBcnJheShpKm8pO2ZvcihsZXQgbD0wO2w8bztsKyspZm9yKGxldCBmPTA7ZjxpO2YrKyl7Y29uc3QgZz0obCtoKSp0KyhmK24pLE09bCppK2Y7bVtNXT1zW2ddfWNvbnN0IHc9bmV3IEZsb2F0MzJBcnJheSh1KmMpO2ZvcihsZXQgbD0wO2w8dTtsKyspZm9yKGxldCBmPTA7ZjxjO2YrKyl7Y29uc3QgZz1sKnUrZixNPU1hdGgucm91bmQoZipvL3UpLHA9TWF0aC5yb3VuZChsKmkvYykqaStNO3dbZ109bVtwXX1yZXR1cm4gd31jb25zdCBWPXVlKGQsay53aWR0aCksYT1WLnN3KzEsZT1WLnNoKzE7cmV0dXJue2FycmF5Onkoay5hcnJheSxrLndpZHRoLFYuc3gsVi5zeSxWLnN3LFYuc2gsYSxlKSx3aWR0aDphLGhlaWdodDplfX1mdW5jdGlvbiB1ZShrLGQpe2NvbnN0IHk9TWF0aC5mbG9vcihrWzBdKmQpLFY9TWF0aC5mbG9vcihrWzFdKmQpLGE9TWF0aC5mbG9vcigoa1syXS1rWzBdKSpkKSxlPU1hdGguZmxvb3IoKGtbM10ta1sxXSkqZCk7cmV0dXJue3N4Onksc3k6VixzdzphLHNoOmV9fXNlbGYub25tZXNzYWdlPWs9Pntjb25zdCBkPWsuZGF0YSx5PW9lKGQuZGVtRGF0YSxkLnosZC5jbGlwQm91bmRzKTtzZWxmLnBvc3RNZXNzYWdlKHkpfX0pKCk7Cg==",h_=r=>Uint8Array.from(atob(r),e=>e.charCodeAt(0)),xh=typeof self<"u"&&self.Blob&&new Blob([h_(bh)],{type:"text/javascript;charset=utf-8"});function u_(r){let e;try{if(e=xh&&(self.URL||self.webkitURL).createObjectURL(xh),!e)throw"";const t=new Worker(e,{name:r?.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;base64,"+bh,{name:r?.name})}finally{e&&(self.URL||self.webkitURL).revokeObjectURL(e)}}const d_=function(){var r={};r.defaultNoDataValue=-34027999387901484e22,r.decode=function(a,c){c=c||{};var h=c.encodedMaskData||c.encodedMaskData===null,d=n(a,c.inputOffset||0,h),m=c.noDataValue!==null?c.noDataValue:r.defaultNoDataValue,f=e(d,c.pixelType||Float32Array,c.encodedMaskData,m,c.returnMask),g={width:d.width,height:d.height,pixelData:f.resultPixels,minValue:f.minValue,maxValue:d.pixels.maxValue,noDataValue:m};return f.resultMask&&(g.maskData=f.resultMask),c.returnEncodedMask&&d.mask&&(g.encodedMaskData=d.mask.bitset?d.mask.bitset:null),c.returnFileInfo&&(g.fileInfo=t(d),c.computeUsedBitDepths&&(g.fileInfo.bitDepths=i(d))),g};var e=function(a,c,h,d,m){var f=0,g=a.pixels.numBlocksX,_=a.pixels.numBlocksY,w=Math.floor(a.width/g),b=Math.floor(a.height/_),x=2*a.maxZError,L=Number.MAX_VALUE,M;h=h||(a.mask?a.mask.bitset:null);var C,W;C=new c(a.width*a.height),m&&h&&(W=new Uint8Array(a.width*a.height));for(var D=new Float32Array(w*b),z,X,I=0;I<=_;I++){var U=I!==_?b:a.height%_;if(U!==0)for(var V=0;V<=g;V++){var G=V!==g?w:a.width%g;if(G!==0){var N=I*a.width*b+V*w,j=a.width-G,Y=a.pixels.blocks[f],H,Q,re;Y.encoding<2?(Y.encoding===0?H=Y.rawData:(s(Y.stuffedData,Y.bitsPerPixel,Y.numValidPixels,Y.offset,x,D,a.pixels.maxValue),H=D),Q=0):Y.encoding===2?re=0:re=Y.offset;var ne;if(h)for(X=0;X<U;X++){for(N&7&&(ne=h[N>>3],ne<<=N&7),z=0;z<G;z++)N&7||(ne=h[N>>3]),ne&128?(W&&(W[N]=1),M=Y.encoding<2?H[Q++]:re,L=L>M?M:L,C[N++]=M):(W&&(W[N]=0),C[N++]=d),ne<<=1;N+=j}else if(Y.encoding<2)for(X=0;X<U;X++){for(z=0;z<G;z++)M=H[Q++],L=L>M?M:L,C[N++]=M;N+=j}else for(L=L>re?re:L,X=0;X<U;X++){for(z=0;z<G;z++)C[N++]=re;N+=j}if(Y.encoding===1&&Q!==Y.numValidPixels)throw"Block and Mask do not match";f++}}}return{resultPixels:C,resultMask:W,minValue:L}},t=function(a){return{fileIdentifierString:a.fileIdentifierString,fileVersion:a.fileVersion,imageType:a.imageType,height:a.height,width:a.width,maxZError:a.maxZError,eofOffset:a.eofOffset,mask:a.mask?{numBlocksX:a.mask.numBlocksX,numBlocksY:a.mask.numBlocksY,numBytes:a.mask.numBytes,maxValue:a.mask.maxValue}:null,pixels:{numBlocksX:a.pixels.numBlocksX,numBlocksY:a.pixels.numBlocksY,numBytes:a.pixels.numBytes,maxValue:a.pixels.maxValue,noDataValue:a.noDataValue}}},i=function(a){for(var c=a.pixels.numBlocksX*a.pixels.numBlocksY,h={},d=0;d<c;d++){var m=a.pixels.blocks[d];m.encoding===0?h.float32=!0:m.encoding===1?h[m.bitsPerPixel]=!0:h[0]=!0}return Object.keys(h)},n=function(a,c,h){var d={},m=new Uint8Array(a,c,10);if(d.fileIdentifierString=String.fromCharCode.apply(null,m),d.fileIdentifierString.trim()!=="CntZImage")throw"Unexpected file identifier string: "+d.fileIdentifierString;c+=10;var f=new DataView(a,c,24);if(d.fileVersion=f.getInt32(0,!0),d.imageType=f.getInt32(4,!0),d.height=f.getUint32(8,!0),d.width=f.getUint32(12,!0),d.maxZError=f.getFloat64(16,!0),c+=24,!h)if(f=new DataView(a,c,16),d.mask={},d.mask.numBlocksY=f.getUint32(0,!0),d.mask.numBlocksX=f.getUint32(4,!0),d.mask.numBytes=f.getUint32(8,!0),d.mask.maxValue=f.getFloat32(12,!0),c+=16,d.mask.numBytes>0){var g=new Uint8Array(Math.ceil(d.width*d.height/8));f=new DataView(a,c,d.mask.numBytes);var _=f.getInt16(0,!0),w=2,b=0;do{if(_>0)for(;_--;)g[b++]=f.getUint8(w++);else{var x=f.getUint8(w++);for(_=-_;_--;)g[b++]=x}_=f.getInt16(w,!0),w+=2}while(w<d.mask.numBytes);if(_!==-32768||b<g.length)throw"Unexpected end of mask RLE encoding";d.mask.bitset=g,c+=d.mask.numBytes}else d.mask.numBytes|d.mask.numBlocksY|d.mask.maxValue||(d.mask.bitset=new Uint8Array(Math.ceil(d.width*d.height/8)));f=new DataView(a,c,16),d.pixels={},d.pixels.numBlocksY=f.getUint32(0,!0),d.pixels.numBlocksX=f.getUint32(4,!0),d.pixels.numBytes=f.getUint32(8,!0),d.pixels.maxValue=f.getFloat32(12,!0),c+=16;var L=d.pixels.numBlocksX,M=d.pixels.numBlocksY,C=L+(d.width%L>0?1:0),W=M+(d.height%M>0?1:0);d.pixels.blocks=new Array(C*W);for(var D=0,z=0;z<W;z++)for(var X=0;X<C;X++){var I=0,U=a.byteLength-c;f=new DataView(a,c,Math.min(10,U));var V={};d.pixels.blocks[D++]=V;var G=f.getUint8(0);if(I++,V.encoding=G&63,V.encoding>3)throw"Invalid block encoding ("+V.encoding+")";if(V.encoding===2){c++;continue}if(G!==0&&G!==2){if(G>>=6,V.offsetType=G,G===2)V.offset=f.getInt8(1),I++;else if(G===1)V.offset=f.getInt16(1,!0),I+=2;else if(G===0)V.offset=f.getFloat32(1,!0),I+=4;else throw"Invalid block offset type";if(V.encoding===1)if(G=f.getUint8(I),I++,V.bitsPerPixel=G&63,G>>=6,V.numValidPixelsType=G,G===2)V.numValidPixels=f.getUint8(I),I++;else if(G===1)V.numValidPixels=f.getUint16(I,!0),I+=2;else if(G===0)V.numValidPixels=f.getUint32(I,!0),I+=4;else throw"Invalid valid pixel count type"}if(c+=I,V.encoding!==3){var N,j;if(V.encoding===0){var Y=(d.pixels.numBytes-1)/4;if(Y!==Math.floor(Y))throw"uncompressed block has invalid length";N=new ArrayBuffer(Y*4),j=new Uint8Array(N),j.set(new Uint8Array(a,c,Y*4));var H=new Float32Array(N);V.rawData=H,c+=Y*4}else if(V.encoding===1){var Q=Math.ceil(V.numValidPixels*V.bitsPerPixel/8),re=Math.ceil(Q/4);N=new ArrayBuffer(re*4),j=new Uint8Array(N),j.set(new Uint8Array(a,c,Q)),V.stuffedData=new Uint32Array(N),c+=Q}}}return d.eofOffset=c,d},s=function(a,c,h,d,m,f,g){var _=(1<<c)-1,w=0,b,x=0,L,M,C=Math.ceil((g-d)/m),W=a.length*4-Math.ceil(c*h/8);for(a[a.length-1]<<=8*W,b=0;b<h;b++){if(x===0&&(M=a[w++],x=32),x>=c)L=M>>>x-c&_,x-=c;else{var D=c-x;L=(M&_)<<D&_,M=a[w++],x=32-D,L+=M>>>x}f[b]=L<C?d+L*m:g}return f};return r}(),f_=function(){var r={unstuff:function(n,s,a,c,h,d,m,f){var g=(1<<a)-1,_=0,w,b=0,x,L,M,C,W=n.length*4-Math.ceil(a*c/8);if(n[n.length-1]<<=8*W,h)for(w=0;w<c;w++)b===0&&(L=n[_++],b=32),b>=a?(x=L>>>b-a&g,b-=a):(M=a-b,x=(L&g)<<M&g,L=n[_++],b=32-M,x+=L>>>b),s[w]=h[x];else for(C=Math.ceil((f-d)/m),w=0;w<c;w++)b===0&&(L=n[_++],b=32),b>=a?(x=L>>>b-a&g,b-=a):(M=a-b,x=(L&g)<<M&g,L=n[_++],b=32-M,x+=L>>>b),s[w]=x<C?d+x*m:f},unstuffLUT:function(n,s,a,c,h,d){var m=(1<<s)-1,f=0,g=0,_=0,w=0,b=0,x,L=[],M=n.length*4-Math.ceil(s*a/8);n[n.length-1]<<=8*M;var C=Math.ceil((d-c)/h);for(g=0;g<a;g++)w===0&&(x=n[f++],w=32),w>=s?(b=x>>>w-s&m,w-=s):(_=s-w,b=(x&m)<<_&m,x=n[f++],w=32-_,b+=x>>>w),L[g]=b<C?c+b*h:d;return L.unshift(c),L},unstuff2:function(n,s,a,c,h,d,m,f){var g=(1<<a)-1,_=0,w,b=0,x=0,L,M,C;if(h)for(w=0;w<c;w++)b===0&&(M=n[_++],b=32,x=0),b>=a?(L=M>>>x&g,b-=a,x+=a):(C=a-b,L=M>>>x&g,M=n[_++],b=32-C,L|=(M&(1<<C)-1)<<a-C,x=C),s[w]=h[L];else{var W=Math.ceil((f-d)/m);for(w=0;w<c;w++)b===0&&(M=n[_++],b=32,x=0),b>=a?(L=M>>>x&g,b-=a,x+=a):(C=a-b,L=M>>>x&g,M=n[_++],b=32-C,L|=(M&(1<<C)-1)<<a-C,x=C),s[w]=L<W?d+L*m:f}return s},unstuffLUT2:function(n,s,a,c,h,d){var m=(1<<s)-1,f=0,g=0,_=0,w=0,b=0,x=0,L,M=[],C=Math.ceil((d-c)/h);for(g=0;g<a;g++)w===0&&(L=n[f++],w=32,x=0),w>=s?(b=L>>>x&m,w-=s,x+=s):(_=s-w,b=L>>>x&m,L=n[f++],w=32-_,b|=(L&(1<<_)-1)<<s-_,x=_),M[g]=b<C?c+b*h:d;return M.unshift(c),M},originalUnstuff:function(n,s,a,c){var h=(1<<a)-1,d=0,m,f=0,g,_,w,b=n.length*4-Math.ceil(a*c/8);for(n[n.length-1]<<=8*b,m=0;m<c;m++)f===0&&(_=n[d++],f=32),f>=a?(g=_>>>f-a&h,f-=a):(w=a-f,g=(_&h)<<w&h,_=n[d++],f=32-w,g+=_>>>f),s[m]=g;return s},originalUnstuff2:function(n,s,a,c){var h=(1<<a)-1,d=0,m,f=0,g=0,_,w,b;for(m=0;m<c;m++)f===0&&(w=n[d++],f=32,g=0),f>=a?(_=w>>>g&h,f-=a,g+=a):(b=a-f,_=w>>>g&h,w=n[d++],f=32-b,_|=(w&(1<<b)-1)<<a-b,g=b),s[m]=_;return s}},e={HUFFMAN_LUT_BITS_MAX:12,computeChecksumFletcher32:function(n){for(var s=65535,a=65535,c=n.length,h=Math.floor(c/2),d=0;h;){var m=h>=359?359:h;h-=m;do s+=n[d++]<<8,a+=s+=n[d++];while(--m);s=(s&65535)+(s>>>16),a=(a&65535)+(a>>>16)}return c&1&&(a+=s+=n[d]<<8),s=(s&65535)+(s>>>16),a=(a&65535)+(a>>>16),(a<<16|s)>>>0},readHeaderInfo:function(n,s){var a=s.ptr,c=new Uint8Array(n,a,6),h={};if(h.fileIdentifierString=String.fromCharCode.apply(null,c),h.fileIdentifierString.lastIndexOf("Lerc2",0)!==0)throw"Unexpected file identifier string (expect Lerc2 ): "+h.fileIdentifierString;a+=6;var d=new DataView(n,a,8),m=d.getInt32(0,!0);h.fileVersion=m,a+=4,m>=3&&(h.checksum=d.getUint32(4,!0),a+=4),d=new DataView(n,a,12),h.height=d.getUint32(0,!0),h.width=d.getUint32(4,!0),a+=8,m>=4?(h.numDims=d.getUint32(8,!0),a+=4):h.numDims=1,d=new DataView(n,a,40),h.numValidPixel=d.getUint32(0,!0),h.microBlockSize=d.getInt32(4,!0),h.blobSize=d.getInt32(8,!0),h.imageType=d.getInt32(12,!0),h.maxZError=d.getFloat64(16,!0),h.zMin=d.getFloat64(24,!0),h.zMax=d.getFloat64(32,!0),a+=40,s.headerInfo=h,s.ptr=a;var f,g;if(m>=3&&(g=m>=4?52:48,f=this.computeChecksumFletcher32(new Uint8Array(n,a-g,h.blobSize-14)),f!==h.checksum))throw"Checksum failed.";return!0},checkMinMaxRanges:function(n,s){var a=s.headerInfo,c=this.getDataTypeArray(a.imageType),h=a.numDims*this.getDataTypeSize(a.imageType),d=this.readSubArray(n,s.ptr,c,h),m=this.readSubArray(n,s.ptr+h,c,h);s.ptr+=2*h;var f,g=!0;for(f=0;f<a.numDims;f++)if(d[f]!==m[f]){g=!1;break}return a.minValues=d,a.maxValues=m,g},readSubArray:function(n,s,a,c){var h;if(a===Uint8Array)h=new Uint8Array(n,s,c);else{var d=new ArrayBuffer(c),m=new Uint8Array(d);m.set(new Uint8Array(n,s,c)),h=new a(d)}return h},readMask:function(n,s){var a=s.ptr,c=s.headerInfo,h=c.width*c.height,d=c.numValidPixel,m=new DataView(n,a,4),f={};if(f.numBytes=m.getUint32(0,!0),a+=4,(d===0||h===d)&&f.numBytes!==0)throw"invalid mask";var g,_;if(d===0)g=new Uint8Array(Math.ceil(h/8)),f.bitset=g,_=new Uint8Array(h),s.pixels.resultMask=_,a+=f.numBytes;else if(f.numBytes>0){g=new Uint8Array(Math.ceil(h/8)),m=new DataView(n,a,f.numBytes);var w=m.getInt16(0,!0),b=2,x=0,L=0;do{if(w>0)for(;w--;)g[x++]=m.getUint8(b++);else for(L=m.getUint8(b++),w=-w;w--;)g[x++]=L;w=m.getInt16(b,!0),b+=2}while(b<f.numBytes);if(w!==-32768||x<g.length)throw"Unexpected end of mask RLE encoding";_=new Uint8Array(h);var M=0,C=0;for(C=0;C<h;C++)C&7?(M=g[C>>3],M<<=C&7):M=g[C>>3],M&128&&(_[C]=1);s.pixels.resultMask=_,f.bitset=g,a+=f.numBytes}return s.ptr=a,s.mask=f,!0},readDataOneSweep:function(n,s,a,c){var h=s.ptr,d=s.headerInfo,m=d.numDims,f=d.width*d.height,g=d.imageType,_=d.numValidPixel*e.getDataTypeSize(g)*m,w,b=s.pixels.resultMask;if(a===Uint8Array)w=new Uint8Array(n,h,_);else{var x=new ArrayBuffer(_),L=new Uint8Array(x);L.set(new Uint8Array(n,h,_)),w=new a(x)}if(w.length===f*m)c?s.pixels.resultPixels=e.swapDimensionOrder(w,f,m,a,!0):s.pixels.resultPixels=w;else{s.pixels.resultPixels=new a(f*m);var M=0,C=0,W=0,D=0;if(m>1){if(c){for(C=0;C<f;C++)if(b[C])for(D=C,W=0;W<m;W++,D+=f)s.pixels.resultPixels[D]=w[M++]}else for(C=0;C<f;C++)if(b[C])for(D=C*m,W=0;W<m;W++)s.pixels.resultPixels[D+W]=w[M++]}else for(C=0;C<f;C++)b[C]&&(s.pixels.resultPixels[C]=w[M++])}return h+=_,s.ptr=h,!0},readHuffmanTree:function(n,s){var a=this.HUFFMAN_LUT_BITS_MAX,c=new DataView(n,s.ptr,16);s.ptr+=16;var h=c.getInt32(0,!0);if(h<2)throw"unsupported Huffman version";var d=c.getInt32(4,!0),m=c.getInt32(8,!0),f=c.getInt32(12,!0);if(m>=f)return!1;var g=new Uint32Array(f-m);e.decodeBits(n,s,g);var _=[],w,b,x,L;for(w=m;w<f;w++)b=w-(w<d?0:d),_[b]={first:g[w-m],second:null};var M=n.byteLength-s.ptr,C=Math.ceil(M/4),W=new ArrayBuffer(C*4),D=new Uint8Array(W);D.set(new Uint8Array(n,s.ptr,M));var z=new Uint32Array(W),X=0,I,U=0;for(I=z[0],w=m;w<f;w++)b=w-(w<d?0:d),L=_[b].first,L>0&&(_[b].second=I<<X>>>32-L,32-X>=L?(X+=L,X===32&&(X=0,U++,I=z[U])):(X+=L-32,U++,I=z[U],_[b].second|=I>>>32-X));var V=0,G=0,N=new t;for(w=0;w<_.length;w++)_[w]!==void 0&&(V=Math.max(V,_[w].first));V>=a?G=a:G=V;var j=[],Y,H,Q,re,ne,le;for(w=m;w<f;w++)if(b=w-(w<d?0:d),L=_[b].first,L>0)if(Y=[L,b],L<=G)for(H=_[b].second<<G-L,Q=1<<G-L,x=0;x<Q;x++)j[H|x]=Y;else for(H=_[b].second,le=N,re=L-1;re>=0;re--)ne=H>>>re&1,ne?(le.right||(le.right=new t),le=le.right):(le.left||(le.left=new t),le=le.left),re===0&&!le.val&&(le.val=Y[1]);return{decodeLut:j,numBitsLUTQick:G,numBitsLUT:V,tree:N,stuffedData:z,srcPtr:U,bitPos:X}},readHuffman:function(n,s,a,c){var h=s.headerInfo,d=h.numDims,m=s.headerInfo.height,f=s.headerInfo.width,g=f*m,_=this.readHuffmanTree(n,s),w=_.decodeLut,b=_.tree,x=_.stuffedData,L=_.srcPtr,M=_.bitPos,C=_.numBitsLUTQick,W=_.numBitsLUT,D=s.headerInfo.imageType===0?128:0,z,X,I,U=s.pixels.resultMask,V,G,N,j,Y,H,Q,re=0;M>0&&(L++,M=0);var ne=x[L],le=s.encodeMode===1,de=new a(g*d),ge=de,fe;if(d<2||le){for(fe=0;fe<d;fe++)if(d>1&&(ge=new a(de.buffer,g*fe,g),re=0),s.headerInfo.numValidPixel===f*m)for(H=0,j=0;j<m;j++)for(Y=0;Y<f;Y++,H++){if(X=0,V=ne<<M>>>32-C,G=V,32-M<C&&(V|=x[L+1]>>>64-M-C,G=V),w[G])X=w[G][1],M+=w[G][0];else for(V=ne<<M>>>32-W,G=V,32-M<W&&(V|=x[L+1]>>>64-M-W,G=V),z=b,Q=0;Q<W;Q++)if(N=V>>>W-Q-1&1,z=N?z.right:z.left,!(z.left||z.right)){X=z.val,M=M+Q+1;break}M>=32&&(M-=32,L++,ne=x[L]),I=X-D,le?(Y>0?I+=re:j>0?I+=ge[H-f]:I+=re,I&=255,ge[H]=I,re=I):ge[H]=I}else for(H=0,j=0;j<m;j++)for(Y=0;Y<f;Y++,H++)if(U[H]){if(X=0,V=ne<<M>>>32-C,G=V,32-M<C&&(V|=x[L+1]>>>64-M-C,G=V),w[G])X=w[G][1],M+=w[G][0];else for(V=ne<<M>>>32-W,G=V,32-M<W&&(V|=x[L+1]>>>64-M-W,G=V),z=b,Q=0;Q<W;Q++)if(N=V>>>W-Q-1&1,z=N?z.right:z.left,!(z.left||z.right)){X=z.val,M=M+Q+1;break}M>=32&&(M-=32,L++,ne=x[L]),I=X-D,le?(Y>0&&U[H-1]?I+=re:j>0&&U[H-f]?I+=ge[H-f]:I+=re,I&=255,ge[H]=I,re=I):ge[H]=I}}else for(H=0,j=0;j<m;j++)for(Y=0;Y<f;Y++)if(H=j*f+Y,!U||U[H])for(fe=0;fe<d;fe++,H+=g){if(X=0,V=ne<<M>>>32-C,G=V,32-M<C&&(V|=x[L+1]>>>64-M-C,G=V),w[G])X=w[G][1],M+=w[G][0];else for(V=ne<<M>>>32-W,G=V,32-M<W&&(V|=x[L+1]>>>64-M-W,G=V),z=b,Q=0;Q<W;Q++)if(N=V>>>W-Q-1&1,z=N?z.right:z.left,!(z.left||z.right)){X=z.val,M=M+Q+1;break}M>=32&&(M-=32,L++,ne=x[L]),I=X-D,ge[H]=I}s.ptr=s.ptr+(L+1)*4+(M>0?4:0),s.pixels.resultPixels=de,d>1&&!c&&(s.pixels.resultPixels=e.swapDimensionOrder(de,g,d,a))},decodeBits:function(n,s,a,c,h){{var d=s.headerInfo,m=d.fileVersion,f=0,g=n.byteLength-s.ptr>=5?5:n.byteLength-s.ptr,_=new DataView(n,s.ptr,g),w=_.getUint8(0);f++;var b=w>>6,x=b===0?4:3-b,L=(w&32)>0,M=w&31,C=0;if(x===1)C=_.getUint8(f),f++;else if(x===2)C=_.getUint16(f,!0),f+=2;else if(x===4)C=_.getUint32(f,!0),f+=4;else throw"Invalid valid pixel count type";var W=2*d.maxZError,D,z,X,I,U,V,G,N,j,Y=d.numDims>1?d.maxValues[h]:d.zMax;if(L){for(s.counter.lut++,N=_.getUint8(f),f++,I=Math.ceil((N-1)*M/8),U=Math.ceil(I/4),z=new ArrayBuffer(U*4),X=new Uint8Array(z),s.ptr+=f,X.set(new Uint8Array(n,s.ptr,I)),G=new Uint32Array(z),s.ptr+=I,j=0;N-1>>>j;)j++;I=Math.ceil(C*j/8),U=Math.ceil(I/4),z=new ArrayBuffer(U*4),X=new Uint8Array(z),X.set(new Uint8Array(n,s.ptr,I)),D=new Uint32Array(z),s.ptr+=I,m>=3?V=r.unstuffLUT2(G,M,N-1,c,W,Y):V=r.unstuffLUT(G,M,N-1,c,W,Y),m>=3?r.unstuff2(D,a,j,C,V):r.unstuff(D,a,j,C,V)}else s.counter.bitstuffer++,j=M,s.ptr+=f,j>0&&(I=Math.ceil(C*j/8),U=Math.ceil(I/4),z=new ArrayBuffer(U*4),X=new Uint8Array(z),X.set(new Uint8Array(n,s.ptr,I)),D=new Uint32Array(z),s.ptr+=I,m>=3?c==null?r.originalUnstuff2(D,a,j,C):r.unstuff2(D,a,j,C,!1,c,W,Y):c==null?r.originalUnstuff(D,a,j,C):r.unstuff(D,a,j,C,!1,c,W,Y))}},readTiles:function(n,s,a,c){var h=s.headerInfo,d=h.width,m=h.height,f=d*m,g=h.microBlockSize,_=h.imageType,w=e.getDataTypeSize(_),b=Math.ceil(d/g),x=Math.ceil(m/g);s.pixels.numBlocksY=x,s.pixels.numBlocksX=b,s.pixels.ptr=0;var L=0,M=0,C=0,W=0,D=0,z=0,X=0,I=0,U=0,V=0,G=0,N=0,j=0,Y=0,H=0,Q=0,re,ne,le,de,ge,fe,Se=new a(g*g),st=m%g||g,ot=d%g||g,pt,$e,Re=h.numDims,je,at=s.pixels.resultMask,Xe=s.pixels.resultPixels,Ft=h.fileVersion,Rt=Ft>=5?14:15,Ce,lt=h.zMax,mt;for(C=0;C<x;C++)for(D=C!==x-1?g:st,W=0;W<b;W++)for(z=W!==b-1?g:ot,G=C*d*g+W*g,N=d-z,je=0;je<Re;je++){if(Re>1?(mt=Xe,G=C*d*g+W*g,Xe=new a(s.pixels.resultPixels.buffer,f*je*w,f),lt=h.maxValues[je]):mt=null,X=n.byteLength-s.ptr,re=new DataView(n,s.ptr,Math.min(10,X)),ne={},Q=0,I=re.getUint8(0),Q++,Ce=h.fileVersion>=5?I&4:0,U=I>>6&255,V=I>>2&Rt,V!==(W*g>>3&Rt)||Ce&&je===0)throw"integrity issue";if(fe=I&3,fe>3)throw s.ptr+=Q,"Invalid block encoding ("+fe+")";if(fe===2){if(Ce)if(at)for(L=0;L<D;L++)for(M=0;M<z;M++)at[G]&&(Xe[G]=mt[G]),G++;else for(L=0;L<D;L++)for(M=0;M<z;M++)Xe[G]=mt[G],G++;s.counter.constant++,s.ptr+=Q;continue}else if(fe===0){if(Ce)throw"integrity issue";if(s.counter.uncompressed++,s.ptr+=Q,j=D*z*w,Y=n.byteLength-s.ptr,j=j<Y?j:Y,le=new ArrayBuffer(j%w===0?j:j+w-j%w),de=new Uint8Array(le),de.set(new Uint8Array(n,s.ptr,j)),ge=new a(le),H=0,at)for(L=0;L<D;L++){for(M=0;M<z;M++)at[G]&&(Xe[G]=ge[H++]),G++;G+=N}else for(L=0;L<D;L++){for(M=0;M<z;M++)Xe[G++]=ge[H++];G+=N}s.ptr+=H*w}else if(pt=e.getDataTypeUsed(Ce&&_<6?4:_,U),$e=e.getOnePixel(ne,Q,pt,re),Q+=e.getDataTypeSize(pt),fe===3)if(s.ptr+=Q,s.counter.constantoffset++,at)for(L=0;L<D;L++){for(M=0;M<z;M++)at[G]&&(Xe[G]=Ce?Math.min(lt,mt[G]+$e):$e),G++;G+=N}else for(L=0;L<D;L++){for(M=0;M<z;M++)Xe[G]=Ce?Math.min(lt,mt[G]+$e):$e,G++;G+=N}else if(s.ptr+=Q,e.decodeBits(n,s,Se,$e,je),Q=0,Ce)if(at)for(L=0;L<D;L++){for(M=0;M<z;M++)at[G]&&(Xe[G]=Se[Q++]+mt[G]),G++;G+=N}else for(L=0;L<D;L++){for(M=0;M<z;M++)Xe[G]=Se[Q++]+mt[G],G++;G+=N}else if(at)for(L=0;L<D;L++){for(M=0;M<z;M++)at[G]&&(Xe[G]=Se[Q++]),G++;G+=N}else for(L=0;L<D;L++){for(M=0;M<z;M++)Xe[G++]=Se[Q++];G+=N}}Re>1&&!c&&(s.pixels.resultPixels=e.swapDimensionOrder(s.pixels.resultPixels,f,Re,a))},formatFileInfo:function(n){return{fileIdentifierString:n.headerInfo.fileIdentifierString,fileVersion:n.headerInfo.fileVersion,imageType:n.headerInfo.imageType,height:n.headerInfo.height,width:n.headerInfo.width,numValidPixel:n.headerInfo.numValidPixel,microBlockSize:n.headerInfo.microBlockSize,blobSize:n.headerInfo.blobSize,maxZError:n.headerInfo.maxZError,pixelType:e.getPixelType(n.headerInfo.imageType),eofOffset:n.eofOffset,mask:n.mask?{numBytes:n.mask.numBytes}:null,pixels:{numBlocksX:n.pixels.numBlocksX,numBlocksY:n.pixels.numBlocksY,maxValue:n.headerInfo.zMax,minValue:n.headerInfo.zMin,noDataValue:n.noDataValue}}},constructConstantSurface:function(n,s){var a=n.headerInfo.zMax,c=n.headerInfo.zMin,h=n.headerInfo.maxValues,d=n.headerInfo.numDims,m=n.headerInfo.height*n.headerInfo.width,f=0,g=0,_=0,w=n.pixels.resultMask,b=n.pixels.resultPixels;if(w)if(d>1){if(s)for(f=0;f<d;f++)for(_=f*m,a=h[f],g=0;g<m;g++)w[g]&&(b[_+g]=a);else for(g=0;g<m;g++)if(w[g])for(_=g*d,f=0;f<d;f++)b[_+d]=h[f]}else for(g=0;g<m;g++)w[g]&&(b[g]=a);else if(d>1&&c!==a)if(s)for(f=0;f<d;f++)for(_=f*m,a=h[f],g=0;g<m;g++)b[_+g]=a;else for(g=0;g<m;g++)for(_=g*d,f=0;f<d;f++)b[_+f]=h[f];else for(g=0;g<m*d;g++)b[g]=a},getDataTypeArray:function(n){var s;switch(n){case 0:s=Int8Array;break;case 1:s=Uint8Array;break;case 2:s=Int16Array;break;case 3:s=Uint16Array;break;case 4:s=Int32Array;break;case 5:s=Uint32Array;break;case 6:s=Float32Array;break;case 7:s=Float64Array;break;default:s=Float32Array}return s},getPixelType:function(n){var s;switch(n){case 0:s="S8";break;case 1:s="U8";break;case 2:s="S16";break;case 3:s="U16";break;case 4:s="S32";break;case 5:s="U32";break;case 6:s="F32";break;case 7:s="F64";break;default:s="F32"}return s},isValidPixelValue:function(n,s){if(s==null)return!1;var a;switch(n){case 0:a=s>=-128&&s<=127;break;case 1:a=s>=0&&s<=255;break;case 2:a=s>=-32768&&s<=32767;break;case 3:a=s>=0&&s<=65536;break;case 4:a=s>=-2147483648&&s<=2147483647;break;case 5:a=s>=0&&s<=4294967296;break;case 6:a=s>=-34027999387901484e22&&s<=34027999387901484e22;break;case 7:a=s>=-17976931348623157e292&&s<=17976931348623157e292;break;default:a=!1}return a},getDataTypeSize:function(n){var s=0;switch(n){case 0:case 1:s=1;break;case 2:case 3:s=2;break;case 4:case 5:case 6:s=4;break;case 7:s=8;break;default:s=n}return s},getDataTypeUsed:function(n,s){var a=n;switch(n){case 2:case 4:a=n-s;break;case 3:case 5:a=n-2*s;break;case 6:s===0?a=n:s===1?a=2:a=1;break;case 7:s===0?a=n:a=n-2*s+1;break;default:a=n;break}return a},getOnePixel:function(n,s,a,c){var h=0;switch(a){case 0:h=c.getInt8(s);break;case 1:h=c.getUint8(s);break;case 2:h=c.getInt16(s,!0);break;case 3:h=c.getUint16(s,!0);break;case 4:h=c.getInt32(s,!0);break;case 5:h=c.getUInt32(s,!0);break;case 6:h=c.getFloat32(s,!0);break;case 7:h=c.getFloat64(s,!0);break;default:throw"the decoder does not understand this pixel type"}return h},swapDimensionOrder:function(n,s,a,c,h){var d=0,m=0,f=0,g=0,_=n;if(a>1)if(_=new c(s*a),h)for(d=0;d<s;d++)for(g=d,f=0;f<a;f++,g+=s)_[g]=n[m++];else for(d=0;d<s;d++)for(g=d,f=0;f<a;f++,g+=s)_[m++]=n[g];return _}},t=function(n,s,a){this.val=n,this.left=s,this.right=a},i={decode:function(n,s){s=s||{};var a=s.noDataValue,c=0,h={};if(h.ptr=s.inputOffset||0,h.pixels={},!!e.readHeaderInfo(n,h)){var d=h.headerInfo,m=d.fileVersion,f=e.getDataTypeArray(d.imageType);if(m>5)throw"unsupported lerc version 2."+m;e.readMask(n,h),d.numValidPixel!==d.width*d.height&&!h.pixels.resultMask&&(h.pixels.resultMask=s.maskData);var g=d.width*d.height;h.pixels.resultPixels=new f(g*d.numDims),h.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0};var _=!s.returnPixelInterleavedDims;if(d.numValidPixel!==0)if(d.zMax===d.zMin)e.constructConstantSurface(h,_);else if(m>=4&&e.checkMinMaxRanges(n,h))e.constructConstantSurface(h,_);else{var w=new DataView(n,h.ptr,2),b=w.getUint8(0);if(h.ptr++,b)e.readDataOneSweep(n,h,f,_);else if(m>1&&d.imageType<=1&&Math.abs(d.maxZError-.5)<1e-5){var x=w.getUint8(1);if(h.ptr++,h.encodeMode=x,x>2||m<4&&x>1)throw"Invalid Huffman flag "+x;x?e.readHuffman(n,h,f,_):e.readTiles(n,h,f,_)}else e.readTiles(n,h,f,_)}h.eofOffset=h.ptr;var L;s.inputOffset?(L=h.headerInfo.blobSize+s.inputOffset-h.ptr,Math.abs(L)>=1&&(h.eofOffset=s.inputOffset+h.headerInfo.blobSize)):(L=h.headerInfo.blobSize-h.ptr,Math.abs(L)>=1&&(h.eofOffset=h.headerInfo.blobSize));var M={width:d.width,height:d.height,pixelData:h.pixels.resultPixels,minValue:d.zMin,maxValue:d.zMax,validPixelCount:d.numValidPixel,dimCount:d.numDims,dimStats:{minValues:d.minValues,maxValues:d.maxValues},maskData:h.pixels.resultMask};if(h.pixels.resultMask&&e.isValidPixelValue(d.imageType,a)){var C=h.pixels.resultMask;for(c=0;c<g;c++)C[c]||(M.pixelData[c]=a);M.noDataValue=a}return h.noDataValue=a,s.returnFileInfo&&(M.fileInfo=e.formatFileInfo(h)),M}},getBandCount:function(n){var s=0,a=0,c={};for(c.ptr=0,c.pixels={};a<n.byteLength-58;)e.readHeaderInfo(n,c),a+=c.headerInfo.blobSize,s++,c.ptr=a;return s}};return i}();var p_=function(){var r=new ArrayBuffer(4),e=new Uint8Array(r),t=new Uint32Array(r);return t[0]=1,e[0]===1}(),m_={decode:function(r,e){if(!p_)throw"Big endian system is not supported.";e=e||{};var t=e.inputOffset||0,i=new Uint8Array(r,t,10),n=String.fromCharCode.apply(null,i),s,a;if(n.trim()==="CntZImage")s=d_,a=1;else if(n.substring(0,5)==="Lerc2")s=f_,a=2;else throw"Unexpected file identifier string: "+n;for(var c=0,h=r.byteLength-10,d,m=[],f,g,_={width:0,height:0,pixels:[],pixelType:e.pixelType,mask:null,statistics:[]},w=0;t<h;){var b=s.decode(r,{inputOffset:t,encodedMaskData:d,maskData:g,returnMask:c===0,returnEncodedMask:c===0,returnFileInfo:!0,returnPixelInterleavedDims:e.returnPixelInterleavedDims,pixelType:e.pixelType||null,noDataValue:e.noDataValue||null});t=b.fileInfo.eofOffset,g=b.maskData,c===0&&(d=b.encodedMaskData,_.width=b.width,_.height=b.height,_.dimCount=b.dimCount||1,_.pixelType=b.pixelType||b.fileInfo.pixelType,_.mask=g),a>1&&(g&&m.push(g),b.fileInfo.mask&&b.fileInfo.mask.numBytes>0&&w++),c++,_.pixels.push(b.pixelData),_.statistics.push({minValue:b.minValue,maxValue:b.maxValue,noDataValue:b.noDataValue,dimStats:b.dimStats})}var x,L,M;if(a>1&&w>1){for(M=_.width*_.height,_.bandMasks=m,g=new Uint8Array(M),g.set(m[0]),x=1;x<m.length;x++)for(f=m[x],L=0;L<M;L++)g[L]=g[L]&f[L];_.maskData=g}return _}};const g_={0:7e3,1:6e3,2:5e3,3:4e3,4:3e3,5:2500,6:2e3,7:1500,8:800,9:500,10:200,11:100,12:40,13:12,14:5,15:2,16:1,17:.5,18:.2,19:.1,20:.01};function y_(r){const{height:e,width:t,pixels:i}=m_.decode(r),n=new Float32Array(e*t);for(let s=0;s<n.length;s++)n[s]=i[0][s];return{array:n,width:t,height:e}}function __(r,e,t){let i=y_(r);t[2]-t[0]<1&&(i=v_(i,t));const{array:n,width:s}=i,c=new mh(s).createTile(n),h=g_[e]||0;return c.getGeometryData(h)}function v_(r,e){function t(c,h,d,m,f,g,_,w){const b=new Float32Array(f*g);for(let L=0;L<g;L++)for(let M=0;M<f;M++){const C=(L+m)*h+(M+d),W=L*f+M;b[W]=c[C]}const x=new Float32Array(w*_);for(let L=0;L<w;L++)for(let M=0;M<_;M++){const C=L*w+M,W=Math.round(M*g/w),z=Math.round(L*f/_)*f+W;x[C]=b[z]}return x}const i=w_(e,r.width),n=i.sw+1,s=i.sh+1;return{array:t(r.array,r.width,i.sx,i.sy,i.sw,i.sh,n,s),width:n,height:s}}function w_(r,e){const t=Math.floor(r[0]*e),i=Math.floor(r[1]*e),n=Math.floor((r[2]-r[0])*e),s=Math.floor((r[3]-r[1])*e);return{sx:t,sy:i,sw:n,sh:s}}var b_=Object.defineProperty,x_=(r,e,t)=>e in r?b_(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Ps=(r,e,t)=>x_(r,typeof e!="symbol"?e+"":e,t);const M_=10;class S_ extends ua{constructor(){super(),Ps(this,"info",{version:"0.10.0",description:"Tile LERC terrain loader. It can load ArcGis-lerc format terrain data."}),Ps(this,"dataType","lerc"),Ps(this,"fileLoader",new p.FileLoader(De.manager)),Ps(this,"_workerPool",new $o(0)),this.fileLoader.setResponseType("arraybuffer"),this._workerPool.setWorkerCreator(()=>new u_)}async doLoad(e,t){this._workerPool.pool===0&&this._workerPool.setWorkerLimit(M_);const{z:i,bounds:n}=t,s=await this.fileLoader.loadAsync(e).catch(()=>new Float32Array(256*256)),a=__(s,i,n);return new jn().setData(a)}}ga(new S_);const Mh="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGModCl7cmV0dXJuIGEodC5kYXRhKX1mdW5jdGlvbiBhKHQpe2Z1bmN0aW9uIG4oZSx1KXtjb25zdCByPXUqNCxbaSxmLGcsbF09ZS5zbGljZShyLHIrNCk7cmV0dXJuIGw9PT0wPzA6LTFlNCsoaTw8MTZ8Zjw8OHxnKSouMX1jb25zdCBvPXQubGVuZ3RoPj4+MixzPW5ldyBGbG9hdDMyQXJyYXkobyk7Zm9yKGxldCBlPTA7ZTxvO2UrKylzW2VdPW4odCxlKTtyZXR1cm4gc31zZWxmLm9ubWVzc2FnZT10PT57Y29uc3Qgbj1jKHQuZGF0YS5pbWdEYXRhKTtzZWxmLnBvc3RNZXNzYWdlKG4pfX0pKCk7Cg==",L_=r=>Uint8Array.from(atob(r),e=>e.charCodeAt(0)),Sh=typeof self<"u"&&self.Blob&&new Blob([L_(Mh)],{type:"text/javascript;charset=utf-8"});function P_(r){let e;try{if(e=Sh&&(self.URL||self.webkitURL).createObjectURL(Sh),!e)throw"";const t=new Worker(e,{name:r?.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;base64,"+Mh,{name:r?.name})}finally{e&&(self.URL||self.webkitURL).revokeObjectURL(e)}}var C_=Object.defineProperty,T_=(r,e,t)=>e in r?C_(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Cs=(r,e,t)=>T_(r,typeof e!="symbol"?e+"":e,t);const G_=10;class W_ extends ua{constructor(){super(),Cs(this,"info",{version:"0.10.0",description:"Mapbox-RGB terrain loader, It can load Mapbox-RGB terrain data."}),Cs(this,"dataType","terrain-rgb"),Cs(this,"imageLoader",new p.ImageLoader(De.manager)),Cs(this,"_workerPool",new $o(0)),this._workerPool.setWorkerCreator(()=>new P_)}async doLoad(e,t){const i=await this.imageLoader.loadAsync(e).catch(h=>new Image),n=p.MathUtils.clamp((t.z+2)*3,2,64),s=Z_(i,t.bounds,n);let a;this._workerPool.pool===0&&this._workerPool.setWorkerLimit(G_),a=(await this._workerPool.postMessage({imgData:s},[s.data.buffer])).data;const c=new jn;return c.setData(a),c}}function Z_(r,e,t){const i=oa(e,r.width);t=Math.min(t,i.sw);const s=new OffscreenCanvas(t,t).getContext("2d");return s.imageSmoothingEnabled=!1,s.drawImage(r,i.sx,i.sy,i.sw,i.sh,0,0,t,t),s.getImageData(0,0,t,t)}ga(new W_);function Ei(r,e){this.x=r,this.y=e}Ei.prototype={clone(){return new Ei(this.x,this.y)},add(r){return this.clone()._add(r)},sub(r){return this.clone()._sub(r)},multByPoint(r){return this.clone()._multByPoint(r)},divByPoint(r){return this.clone()._divByPoint(r)},mult(r){return this.clone()._mult(r)},div(r){return this.clone()._div(r)},rotate(r){return this.clone()._rotate(r)},rotateAround(r,e){return this.clone()._rotateAround(r,e)},matMult(r){return this.clone()._matMult(r)},unit(){return this.clone()._unit()},perp(){return this.clone()._perp()},round(){return this.clone()._round()},mag(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals(r){return this.x===r.x&&this.y===r.y},dist(r){return Math.sqrt(this.distSqr(r))},distSqr(r){const e=r.x-this.x,t=r.y-this.y;return e*e+t*t},angle(){return Math.atan2(this.y,this.x)},angleTo(r){return Math.atan2(this.y-r.y,this.x-r.x)},angleWith(r){return this.angleWithSep(r.x,r.y)},angleWithSep(r,e){return Math.atan2(this.x*e-this.y*r,this.x*r+this.y*e)},_matMult(r){const e=r[0]*this.x+r[1]*this.y,t=r[2]*this.x+r[3]*this.y;return this.x=e,this.y=t,this},_add(r){return this.x+=r.x,this.y+=r.y,this},_sub(r){return this.x-=r.x,this.y-=r.y,this},_mult(r){return this.x*=r,this.y*=r,this},_div(r){return this.x/=r,this.y/=r,this},_multByPoint(r){return this.x*=r.x,this.y*=r.y,this},_divByPoint(r){return this.x/=r.x,this.y/=r.y,this},_unit(){return this._div(this.mag()),this},_perp(){const r=this.y;return this.y=this.x,this.x=-r,this},_rotate(r){const e=Math.cos(r),t=Math.sin(r),i=e*this.x-t*this.y,n=t*this.x+e*this.y;return this.x=i,this.y=n,this},_rotateAround(r,e){const t=Math.cos(r),i=Math.sin(r),n=e.x+t*(this.x-e.x)-i*(this.y-e.y),s=e.y+i*(this.x-e.x)+t*(this.y-e.y);return this.x=n,this.y=s,this},_round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},constructor:Ei},Ei.convert=function(r){if(r instanceof Ei)return r;if(Array.isArray(r))return new Ei(+r[0],+r[1]);if(r.x!==void 0&&r.y!==void 0)return new Ei(+r.x,+r.y);throw new Error("Expected [x, y] or {x, y} point format")};class Lh{constructor(e,t,i,n,s){this.properties={},this.extent=i,this.type=0,this.id=void 0,this._pbf=e,this._geometry=-1,this._keys=n,this._values=s,e.readFields(V_,this,t)}loadGeometry(){const e=this._pbf;e.pos=this._geometry;const t=e.readVarint()+e.pos,i=[];let n,s=1,a=0,c=0,h=0;for(;e.pos<t;){if(a<=0){const d=e.readVarint();s=d&7,a=d>>3}if(a--,s===1||s===2)c+=e.readSVarint(),h+=e.readSVarint(),s===1&&(n&&i.push(n),n=[]),n&&n.push(new Ei(c,h));else if(s===7)n&&n.push(n[0].clone());else throw new Error(`unknown command ${s}`)}return n&&i.push(n),i}bbox(){const e=this._pbf;e.pos=this._geometry;const t=e.readVarint()+e.pos;let i=1,n=0,s=0,a=0,c=1/0,h=-1/0,d=1/0,m=-1/0;for(;e.pos<t;){if(n<=0){const f=e.readVarint();i=f&7,n=f>>3}if(n--,i===1||i===2)s+=e.readSVarint(),a+=e.readSVarint(),s<c&&(c=s),s>h&&(h=s),a<d&&(d=a),a>m&&(m=a);else if(i!==7)throw new Error(`unknown command ${i}`)}return[c,d,h,m]}toGeoJSON(e,t,i){const n=this.extent*Math.pow(2,i),s=this.extent*e,a=this.extent*t,c=this.loadGeometry();function h(g){return[(g.x+s)*360/n-180,360/Math.PI*Math.atan(Math.exp((1-(g.y+a)*2/n)*Math.PI))-90]}function d(g){return g.map(h)}let m;if(this.type===1){const g=[];for(const w of c)g.push(w[0]);const _=d(g);m=g.length===1?{type:"Point",coordinates:_[0]}:{type:"MultiPoint",coordinates:_}}else if(this.type===2){const g=c.map(d);m=g.length===1?{type:"LineString",coordinates:g[0]}:{type:"MultiLineString",coordinates:g}}else if(this.type===3){const g=A_(c),_=[];for(const w of g)_.push(w.map(d));m=_.length===1?{type:"Polygon",coordinates:_[0]}:{type:"MultiPolygon",coordinates:_}}else throw new Error("unknown feature type");const f={type:"Feature",geometry:m,properties:this.properties};return this.id!=null&&(f.id=this.id),f}}Lh.types=["Unknown","Point","LineString","Polygon"];function V_(r,e,t){r===1?e.id=t.readVarint():r===2?I_(t,e):r===3?e.type=t.readVarint():r===4&&(e._geometry=t.pos)}function I_(r,e){const t=r.readVarint()+r.pos;for(;r.pos<t;){const i=e._keys[r.readVarint()],n=e._values[r.readVarint()];e.properties[i]=n}}function A_(r){const e=r.length;if(e<=1)return[r];const t=[];let i,n;for(let s=0;s<e;s++){const a=F_(r[s]);a!==0&&(n===void 0&&(n=a<0),n===a<0?(i&&t.push(i),i=[r[s]]):i&&i.push(r[s]))}return i&&t.push(i),t}function F_(r){let e=0;for(let t=0,i=r.length,n=i-1,s,a;t<i;n=t++)s=r[t],a=r[n],e+=(a.x-s.x)*(s.y+a.y);return e}let O_=class{constructor(e,t){this.version=1,this.name="",this.extent=4096,this.length=0,this._pbf=e,this._keys=[],this._values=[],this._features=[],e.readFields(z_,this,t),this.length=this._features.length}feature(e){if(e<0||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];const t=this._pbf.readVarint()+this._pbf.pos;return new Lh(this._pbf,t,this.extent,this._keys,this._values)}};function z_(r,e,t){r===15?e.version=t.readVarint():r===1?e.name=t.readString():r===5?e.extent=t.readVarint():r===2?e._features.push(t.pos):r===3?e._keys.push(t.readString()):r===4&&e._values.push(D_(t))}function D_(r){let e=null;const t=r.readVarint()+r.pos;for(;r.pos<t;){const i=r.readVarint()>>3;e=i===1?r.readString():i===2?r.readFloat():i===3?r.readDouble():i===4?r.readVarint64():i===5?r.readVarint():i===6?r.readSVarint():i===7?r.readBoolean():null}if(e==null)throw new Error("unknown feature value");return e}class X_{constructor(e,t){this.layers=e.readFields(k_,{},t)}}function k_(r,e,t){if(r===3){const i=new O_(t,t.readVarint()+t.pos);i.length&&(e[i.name]=i)}}const ya=65536*65536,Ph=1/ya,U_=12,Ch=typeof TextDecoder>"u"?null:new TextDecoder("utf-8"),_a=0,Ts=1,Ar=2,Gs=5;class N_{constructor(e=new Uint8Array(16)){this.buf=ArrayBuffer.isView(e)?e:new Uint8Array(e),this.dataView=new DataView(this.buf.buffer),this.pos=0,this.type=0,this.length=this.buf.length}readFields(e,t,i=this.length){for(;this.pos<i;){const n=this.readVarint(),s=n>>3,a=this.pos;this.type=n&7,e(s,t,this),this.pos===a&&this.skip(n)}return t}readMessage(e,t){return this.readFields(e,t,this.readVarint()+this.pos)}readFixed32(){const e=this.dataView.getUint32(this.pos,!0);return this.pos+=4,e}readSFixed32(){const e=this.dataView.getInt32(this.pos,!0);return this.pos+=4,e}readFixed64(){const e=this.dataView.getUint32(this.pos,!0)+this.dataView.getUint32(this.pos+4,!0)*ya;return this.pos+=8,e}readSFixed64(){const e=this.dataView.getUint32(this.pos,!0)+this.dataView.getInt32(this.pos+4,!0)*ya;return this.pos+=8,e}readFloat(){const e=this.dataView.getFloat32(this.pos,!0);return this.pos+=4,e}readDouble(){const e=this.dataView.getFloat64(this.pos,!0);return this.pos+=8,e}readVarint(e){const t=this.buf;let i,n;return n=t[this.pos++],i=n&127,n<128||(n=t[this.pos++],i|=(n&127)<<7,n<128)||(n=t[this.pos++],i|=(n&127)<<14,n<128)||(n=t[this.pos++],i|=(n&127)<<21,n<128)?i:(n=t[this.pos],i|=(n&15)<<28,K_(i,e,this))}readVarint64(){return this.readVarint(!0)}readSVarint(){const e=this.readVarint();return e%2===1?(e+1)/-2:e/2}readBoolean(){return!!this.readVarint()}readString(){const e=this.readVarint()+this.pos,t=this.pos;return this.pos=e,e-t>=U_&&Ch?Ch.decode(this.buf.subarray(t,e)):iv(this.buf,t,e)}readBytes(){const e=this.readVarint()+this.pos,t=this.buf.subarray(this.pos,e);return this.pos=e,t}readPackedVarint(e=[],t){const i=this.readPackedEnd();for(;this.pos<i;)e.push(this.readVarint(t));return e}readPackedSVarint(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readSVarint());return e}readPackedBoolean(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readBoolean());return e}readPackedFloat(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readFloat());return e}readPackedDouble(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readDouble());return e}readPackedFixed32(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readFixed32());return e}readPackedSFixed32(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readSFixed32());return e}readPackedFixed64(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readFixed64());return e}readPackedSFixed64(e=[]){const t=this.readPackedEnd();for(;this.pos<t;)e.push(this.readSFixed64());return e}readPackedEnd(){return this.type===Ar?this.readVarint()+this.pos:this.pos+1}skip(e){const t=e&7;if(t===_a)for(;this.buf[this.pos++]>127;);else if(t===Ar)this.pos=this.readVarint()+this.pos;else if(t===Gs)this.pos+=4;else if(t===Ts)this.pos+=8;else throw new Error(`Unimplemented type: ${t}`)}writeTag(e,t){this.writeVarint(e<<3|t)}realloc(e){let t=this.length||16;for(;t<this.pos+e;)t*=2;if(t!==this.length){const i=new Uint8Array(t);i.set(this.buf),this.buf=i,this.dataView=new DataView(i.buffer),this.length=t}}finish(){return this.length=this.pos,this.pos=0,this.buf.subarray(0,this.length)}writeFixed32(e){this.realloc(4),this.dataView.setInt32(this.pos,e,!0),this.pos+=4}writeSFixed32(e){this.realloc(4),this.dataView.setInt32(this.pos,e,!0),this.pos+=4}writeFixed64(e){this.realloc(8),this.dataView.setInt32(this.pos,e&-1,!0),this.dataView.setInt32(this.pos+4,Math.floor(e*Ph),!0),this.pos+=8}writeSFixed64(e){this.realloc(8),this.dataView.setInt32(this.pos,e&-1,!0),this.dataView.setInt32(this.pos+4,Math.floor(e*Ph),!0),this.pos+=8}writeVarint(e){if(e=+e||0,e>268435455||e<0){B_(e,this);return}this.realloc(4),this.buf[this.pos++]=e&127|(e>127?128:0),!(e<=127)&&(this.buf[this.pos++]=(e>>>=7)&127|(e>127?128:0),!(e<=127)&&(this.buf[this.pos++]=(e>>>=7)&127|(e>127?128:0),!(e<=127)&&(this.buf[this.pos++]=e>>>7&127)))}writeSVarint(e){this.writeVarint(e<0?-e*2-1:e*2)}writeBoolean(e){this.writeVarint(+e)}writeString(e){e=String(e),this.realloc(e.length*4),this.pos++;const t=this.pos;this.pos=nv(this.buf,e,this.pos);const i=this.pos-t;i>=128&&Th(t,i,this),this.pos=t-1,this.writeVarint(i),this.pos+=i}writeFloat(e){this.realloc(4),this.dataView.setFloat32(this.pos,e,!0),this.pos+=4}writeDouble(e){this.realloc(8),this.dataView.setFloat64(this.pos,e,!0),this.pos+=8}writeBytes(e){const t=e.length;this.writeVarint(t),this.realloc(t);for(let i=0;i<t;i++)this.buf[this.pos++]=e[i]}writeRawMessage(e,t){this.pos++;const i=this.pos;e(t,this);const n=this.pos-i;n>=128&&Th(i,n,this),this.pos=i-1,this.writeVarint(n),this.pos+=n}writeMessage(e,t,i){this.writeTag(e,Ar),this.writeRawMessage(t,i)}writePackedVarint(e,t){t.length&&this.writeMessage(e,j_,t)}writePackedSVarint(e,t){t.length&&this.writeMessage(e,J_,t)}writePackedBoolean(e,t){t.length&&this.writeMessage(e,$_,t)}writePackedFloat(e,t){t.length&&this.writeMessage(e,Q_,t)}writePackedDouble(e,t){t.length&&this.writeMessage(e,H_,t)}writePackedFixed32(e,t){t.length&&this.writeMessage(e,E_,t)}writePackedSFixed32(e,t){t.length&&this.writeMessage(e,q_,t)}writePackedFixed64(e,t){t.length&&this.writeMessage(e,ev,t)}writePackedSFixed64(e,t){t.length&&this.writeMessage(e,tv,t)}writeBytesField(e,t){this.writeTag(e,Ar),this.writeBytes(t)}writeFixed32Field(e,t){this.writeTag(e,Gs),this.writeFixed32(t)}writeSFixed32Field(e,t){this.writeTag(e,Gs),this.writeSFixed32(t)}writeFixed64Field(e,t){this.writeTag(e,Ts),this.writeFixed64(t)}writeSFixed64Field(e,t){this.writeTag(e,Ts),this.writeSFixed64(t)}writeVarintField(e,t){this.writeTag(e,_a),this.writeVarint(t)}writeSVarintField(e,t){this.writeTag(e,_a),this.writeSVarint(t)}writeStringField(e,t){this.writeTag(e,Ar),this.writeString(t)}writeFloatField(e,t){this.writeTag(e,Gs),this.writeFloat(t)}writeDoubleField(e,t){this.writeTag(e,Ts),this.writeDouble(t)}writeBooleanField(e,t){this.writeVarintField(e,+t)}}function K_(r,e,t){const i=t.buf;let n,s;if(s=i[t.pos++],n=(s&112)>>4,s<128||(s=i[t.pos++],n|=(s&127)<<3,s<128)||(s=i[t.pos++],n|=(s&127)<<10,s<128)||(s=i[t.pos++],n|=(s&127)<<17,s<128)||(s=i[t.pos++],n|=(s&127)<<24,s<128)||(s=i[t.pos++],n|=(s&1)<<31,s<128))return Jn(r,n,e);throw new Error("Expected varint not more than 10 bytes")}function Jn(r,e,t){return t?e*4294967296+(r>>>0):(e>>>0)*4294967296+(r>>>0)}function B_(r,e){let t,i;if(r>=0?(t=r%4294967296|0,i=r/4294967296|0):(t=~(-r%4294967296),i=~(-r/4294967296),t^4294967295?t=t+1|0:(t=0,i=i+1|0)),r>=18446744073709552e3||r<-18446744073709552e3)throw new Error("Given varint doesn't fit into 10 bytes");e.realloc(10),Y_(t,i,e),R_(i,e)}function Y_(r,e,t){t.buf[t.pos++]=r&127|128,r>>>=7,t.buf[t.pos++]=r&127|128,r>>>=7,t.buf[t.pos++]=r&127|128,r>>>=7,t.buf[t.pos++]=r&127|128,r>>>=7,t.buf[t.pos]=r&127}function R_(r,e){const t=(r&7)<<4;e.buf[e.pos++]|=t|((r>>>=3)?128:0),r&&(e.buf[e.pos++]=r&127|((r>>>=7)?128:0),r&&(e.buf[e.pos++]=r&127|((r>>>=7)?128:0),r&&(e.buf[e.pos++]=r&127|((r>>>=7)?128:0),r&&(e.buf[e.pos++]=r&127|((r>>>=7)?128:0),r&&(e.buf[e.pos++]=r&127)))))}function Th(r,e,t){const i=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(Math.LN2*7));t.realloc(i);for(let n=t.pos-1;n>=r;n--)t.buf[n+i]=t.buf[n]}function j_(r,e){for(let t=0;t<r.length;t++)e.writeVarint(r[t])}function J_(r,e){for(let t=0;t<r.length;t++)e.writeSVarint(r[t])}function Q_(r,e){for(let t=0;t<r.length;t++)e.writeFloat(r[t])}function H_(r,e){for(let t=0;t<r.length;t++)e.writeDouble(r[t])}function $_(r,e){for(let t=0;t<r.length;t++)e.writeBoolean(r[t])}function E_(r,e){for(let t=0;t<r.length;t++)e.writeFixed32(r[t])}function q_(r,e){for(let t=0;t<r.length;t++)e.writeSFixed32(r[t])}function ev(r,e){for(let t=0;t<r.length;t++)e.writeFixed64(r[t])}function tv(r,e){for(let t=0;t<r.length;t++)e.writeSFixed64(r[t])}function iv(r,e,t){let i="",n=e;for(;n<t;){const s=r[n];let a=null,c=s>239?4:s>223?3:s>191?2:1;if(n+c>t)break;let h,d,m;c===1?s<128&&(a=s):c===2?(h=r[n+1],(h&192)===128&&(a=(s&31)<<6|h&63,a<=127&&(a=null))):c===3?(h=r[n+1],d=r[n+2],(h&192)===128&&(d&192)===128&&(a=(s&15)<<12|(h&63)<<6|d&63,(a<=2047||a>=55296&&a<=57343)&&(a=null))):c===4&&(h=r[n+1],d=r[n+2],m=r[n+3],(h&192)===128&&(d&192)===128&&(m&192)===128&&(a=(s&15)<<18|(h&63)<<12|(d&63)<<6|m&63,(a<=65535||a>=1114112)&&(a=null))),a===null?(a=65533,c=1):a>65535&&(a-=65536,i+=String.fromCharCode(a>>>10&1023|55296),a=56320|a&1023),i+=String.fromCharCode(a),n+=c}return i}function nv(r,e,t){for(let i=0,n,s;i<e.length;i++){if(n=e.charCodeAt(i),n>55295&&n<57344)if(s)if(n<56320){r[t++]=239,r[t++]=191,r[t++]=189,s=n;continue}else n=s-55296<<10|n-56320|65536,s=null;else{n>56319||i+1===e.length?(r[t++]=239,r[t++]=191,r[t++]=189):s=n;continue}else s&&(r[t++]=239,r[t++]=191,r[t++]=189,s=null);n<128?r[t++]=n:(n<2048?r[t++]=n>>6|192:(n<65536?r[t++]=n>>12|224:(r[t++]=n>>18|240,r[t++]=n>>12&63|128),r[t++]=n>>6&63|128),r[t++]=n&63|128)}return t}var rv=Object.defineProperty,sv=(r,e,t)=>e in r?rv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,va=(r,e,t)=>sv(r,typeof e!="symbol"?e+"":e,t);class ov extends fa{constructor(){super(),va(this,"dataType","mvt"),va(this,"_loader",new p.FileLoader(De.manager)),va(this,"_render",new yh),this._loader.setResponseType("arraybuffer")}async doLoad(e,t){const i=await this._loader.loadAsync(e),n=new X_(new N_(i)),s=this.drawTile(n,t.source.style,t.z);return new p.CanvasTexture(s)}drawTile(e,t,i){const c=new OffscreenCanvas(256,256).getContext("2d");if(c){if(t)for(const h in t.layer){const d=t.layer[h];if(t&&(i<(d.minLevel??1)||i>(d.maxLevel??20)))continue;const m=e.layers[h];if(m){const f=256/m.extent;this._renderLayer(c,m,d,f)}}else for(const h in e.layers){const d=e.layers[h],m=256/d.extent;this._renderLayer(c,d,void 0,m)}return c.canvas}else throw new Error("Canvas context is not available")}_renderLayer(e,t,i,n=1){e.save();for(let s=0;s<t.length;s++){const a=t.feature(s);this._renderFeature(e,a,i,n)}return e.restore(),this}_renderFeature(e,t,i={},n=1){const s=[rt.Unknown,rt.Point,rt.Linestring,rt.Polygon][t.type],a={geometry:t.loadGeometry(),properties:t.properties};this._render.render(e,s,a,i,n)}_convertToGeoJSONFeature(e,t){const i=this._convertGeometryToGeoJSON(e.geometry,t);return i?{type:"Feature",geometry:i,properties:e.properties||{},id:e.id}:null}_convertGeometryToGeoJSON(e,t){switch(t){case rt.Point:return this._convertPointGeometry(e);case rt.Linestring:return this._convertLineGeometry(e);case rt.Polygon:return this._convertPolygonGeometry(e);default:return console.warn("未知的几何类型:",t),null}}_convertPointGeometry(e){const t=[];for(const i of e)for(const n of i)t.push([n.x,n.y]);return t.length===0?null:t.length===1?{type:"Point",coordinates:t[0]}:{type:"MultiPoint",coordinates:t}}_convertLineGeometry(e){const t=[];for(const i of e){const n=[];for(const s of i)n.push([s.x,s.y]);n.length>=2&&t.push(n)}return t.length===0?null:t.length===1?{type:"LineString",coordinates:t[0]}:{type:"MultiLineString",coordinates:t}}_convertPolygonGeometry(e){const t=[];let i=[];for(const n of e){const s=[];for(const a of n)s.push([a.x,a.y]);s.length>=4&&(this._isRingClockwise(s)||i.length===0?(i.length>0&&t.push(i),i=[s]):i.push(s))}return i.length>0&&t.push(i),t.length===0?null:t.length===1?{type:"Polygon",coordinates:t[0]}:{type:"MultiPolygon",coordinates:t}}_isRingClockwise(e){let t=0;for(let i=0;i<e.length-1;i++){const[n,s]=e[i],[a,c]=e[i+1];t+=(a-n)*(c+s)}return t>0}convertVectorTileToGeoJSON(e){const t=[];for(const i in e.layers){const n=e.layers[i];for(let s=0;s<n.length;s++){const a=n.feature(s),c=[rt.Unknown,rt.Point,rt.Linestring,rt.Polygon][a.type],h={geometry:a.loadGeometry(),properties:a.properties},d=this._convertToGeoJSONFeature(h,c);d&&(d.properties._layer=i,t.push(d))}}return{type:"FeatureCollection",features:t}}}ma(new ov);const Gh="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IF89MjMyODMwNjQzNjUzODY5NjNlLTI2LG09MTIsUD10eXBlb2YgVGV4dERlY29kZXI+InUiP251bGw6bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpLGc9MCx5PTEsRj0yLHA9NTtjbGFzcyBNe2NvbnN0cnVjdG9yKHQ9bmV3IFVpbnQ4QXJyYXkoMTYpKXt0aGlzLmJ1Zj1BcnJheUJ1ZmZlci5pc1ZpZXcodCk/dDpuZXcgVWludDhBcnJheSh0KSx0aGlzLmRhdGFWaWV3PW5ldyBEYXRhVmlldyh0aGlzLmJ1Zi5idWZmZXIpLHRoaXMucG9zPTAsdGhpcy50eXBlPTAsdGhpcy5sZW5ndGg9dGhpcy5idWYubGVuZ3RofXJlYWRGaWVsZHModCxlLHI9dGhpcy5sZW5ndGgpe2Zvcig7dGhpcy5wb3M8cjspe2NvbnN0IHM9dGhpcy5yZWFkVmFyaW50KCksbj1zPj4zLG89dGhpcy5wb3M7dGhpcy50eXBlPXMmNyx0KG4sZSx0aGlzKSx0aGlzLnBvcz09PW8mJnRoaXMuc2tpcChzKX1yZXR1cm4gZX1yZWFkTWVzc2FnZSh0LGUpe3JldHVybiB0aGlzLnJlYWRGaWVsZHModCxlLHRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zKX1yZWFkRml4ZWQzMigpe2NvbnN0IHQ9dGhpcy5kYXRhVmlldy5nZXRVaW50MzIodGhpcy5wb3MsITApO3JldHVybiB0aGlzLnBvcys9NCx0fXJlYWRTRml4ZWQzMigpe2NvbnN0IHQ9dGhpcy5kYXRhVmlldy5nZXRJbnQzMih0aGlzLnBvcywhMCk7cmV0dXJuIHRoaXMucG9zKz00LHR9cmVhZEZpeGVkNjQoKXtjb25zdCB0PXRoaXMuZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMucG9zLCEwKSt0aGlzLmRhdGFWaWV3LmdldFVpbnQzMih0aGlzLnBvcys0LCEwKSo0Mjk0OTY3Mjk2O3JldHVybiB0aGlzLnBvcys9OCx0fXJlYWRTRml4ZWQ2NCgpe2NvbnN0IHQ9dGhpcy5kYXRhVmlldy5nZXRVaW50MzIodGhpcy5wb3MsITApK3RoaXMuZGF0YVZpZXcuZ2V0SW50MzIodGhpcy5wb3MrNCwhMCkqNDI5NDk2NzI5NjtyZXR1cm4gdGhpcy5wb3MrPTgsdH1yZWFkRmxvYXQoKXtjb25zdCB0PXRoaXMuZGF0YVZpZXcuZ2V0RmxvYXQzMih0aGlzLnBvcywhMCk7cmV0dXJuIHRoaXMucG9zKz00LHR9cmVhZERvdWJsZSgpe2NvbnN0IHQ9dGhpcy5kYXRhVmlldy5nZXRGbG9hdDY0KHRoaXMucG9zLCEwKTtyZXR1cm4gdGhpcy5wb3MrPTgsdH1yZWFkVmFyaW50KHQpe2NvbnN0IGU9dGhpcy5idWY7bGV0IHIscztyZXR1cm4gcz1lW3RoaXMucG9zKytdLHI9cyYxMjcsczwxMjh8fChzPWVbdGhpcy5wb3MrK10scnw9KHMmMTI3KTw8NyxzPDEyOCl8fChzPWVbdGhpcy5wb3MrK10scnw9KHMmMTI3KTw8MTQsczwxMjgpfHwocz1lW3RoaXMucG9zKytdLHJ8PShzJjEyNyk8PDIxLHM8MTI4KT9yOihzPWVbdGhpcy5wb3NdLHJ8PShzJjE1KTw8MjgsRShyLHQsdGhpcykpfXJlYWRWYXJpbnQ2NCgpe3JldHVybiB0aGlzLnJlYWRWYXJpbnQoITApfXJlYWRTVmFyaW50KCl7Y29uc3QgdD10aGlzLnJlYWRWYXJpbnQoKTtyZXR1cm4gdCUyPT09MT8odCsxKS8tMjp0LzJ9cmVhZEJvb2xlYW4oKXtyZXR1cm4hIXRoaXMucmVhZFZhcmludCgpfXJlYWRTdHJpbmcoKXtjb25zdCB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5wb3M7cmV0dXJuIHRoaXMucG9zPXQsdC1lPj1tJiZQP1AuZGVjb2RlKHRoaXMuYnVmLnN1YmFycmF5KGUsdCkpOlIodGhpcy5idWYsZSx0KX1yZWFkQnl0ZXMoKXtjb25zdCB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5idWYuc3ViYXJyYXkodGhpcy5wb3MsdCk7cmV0dXJuIHRoaXMucG9zPXQsZX1yZWFkUGFja2VkVmFyaW50KHQ9W10sZSl7Y29uc3Qgcj10aGlzLnJlYWRQYWNrZWRFbmQoKTtmb3IoO3RoaXMucG9zPHI7KXQucHVzaCh0aGlzLnJlYWRWYXJpbnQoZSkpO3JldHVybiB0fXJlYWRQYWNrZWRTVmFyaW50KHQ9W10pe2NvbnN0IGU9dGhpcy5yZWFkUGFja2VkRW5kKCk7Zm9yKDt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtyZXR1cm4gdH1yZWFkUGFja2VkQm9vbGVhbih0PVtdKXtjb25zdCBlPXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7cmV0dXJuIHR9cmVhZFBhY2tlZEZsb2F0KHQ9W10pe2NvbnN0IGU9dGhpcy5yZWFkUGFja2VkRW5kKCk7Zm9yKDt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRmxvYXQoKSk7cmV0dXJuIHR9cmVhZFBhY2tlZERvdWJsZSh0PVtdKXtjb25zdCBlPXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtyZXR1cm4gdH1yZWFkUGFja2VkRml4ZWQzMih0PVtdKXtjb25zdCBlPXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7cmV0dXJuIHR9cmVhZFBhY2tlZFNGaXhlZDMyKHQ9W10pe2NvbnN0IGU9dGhpcy5yZWFkUGFja2VkRW5kKCk7Zm9yKDt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7cmV0dXJuIHR9cmVhZFBhY2tlZEZpeGVkNjQodD1bXSl7Y29uc3QgZT10aGlzLnJlYWRQYWNrZWRFbmQoKTtmb3IoO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO3JldHVybiB0fXJlYWRQYWNrZWRTRml4ZWQ2NCh0PVtdKXtjb25zdCBlPXRoaXMucmVhZFBhY2tlZEVuZCgpO2Zvcig7dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiB0fXJlYWRQYWNrZWRFbmQoKXtyZXR1cm4gdGhpcy50eXBlPT09Rj90aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvczp0aGlzLnBvcysxfXNraXAodCl7Y29uc3QgZT10Jjc7aWYoZT09PWcpZm9yKDt0aGlzLmJ1Zlt0aGlzLnBvcysrXT4xMjc7KTtlbHNlIGlmKGU9PT1GKXRoaXMucG9zPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zO2Vsc2UgaWYoZT09PXApdGhpcy5wb3MrPTQ7ZWxzZSBpZihlPT09eSl0aGlzLnBvcys9ODtlbHNlIHRocm93IG5ldyBFcnJvcihgVW5pbXBsZW1lbnRlZCB0eXBlOiAke2V9YCl9d3JpdGVUYWcodCxlKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8ZSl9cmVhbGxvYyh0KXtsZXQgZT10aGlzLmxlbmd0aHx8MTY7Zm9yKDtlPHRoaXMucG9zK3Q7KWUqPTI7aWYoZSE9PXRoaXMubGVuZ3RoKXtjb25zdCByPW5ldyBVaW50OEFycmF5KGUpO3Iuc2V0KHRoaXMuYnVmKSx0aGlzLmJ1Zj1yLHRoaXMuZGF0YVZpZXc9bmV3IERhdGFWaWV3KHIuYnVmZmVyKSx0aGlzLmxlbmd0aD1lfX1maW5pc2goKXtyZXR1cm4gdGhpcy5sZW5ndGg9dGhpcy5wb3MsdGhpcy5wb3M9MCx0aGlzLmJ1Zi5zdWJhcnJheSgwLHRoaXMubGVuZ3RoKX13cml0ZUZpeGVkMzIodCl7dGhpcy5yZWFsbG9jKDQpLHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5wb3MsdCwhMCksdGhpcy5wb3MrPTR9d3JpdGVTRml4ZWQzMih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLnBvcyx0LCEwKSx0aGlzLnBvcys9NH13cml0ZUZpeGVkNjQodCl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5wb3MsdCYtMSwhMCksdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLnBvcys0LE1hdGguZmxvb3IodCpfKSwhMCksdGhpcy5wb3MrPTh9d3JpdGVTRml4ZWQ2NCh0KXt0aGlzLnJlYWxsb2MoOCksdGhpcy5kYXRhVmlldy5zZXRJbnQzMih0aGlzLnBvcyx0Ji0xLCEwKSx0aGlzLmRhdGFWaWV3LnNldEludDMyKHRoaXMucG9zKzQsTWF0aC5mbG9vcih0Kl8pLCEwKSx0aGlzLnBvcys9OH13cml0ZVZhcmludCh0KXtpZih0PSt0fHwwLHQ+MjY4NDM1NDU1fHx0PDApe0IodCx0aGlzKTtyZXR1cm59dGhpcy5yZWFsbG9jKDQpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjcmMTI3KSkpfXdyaXRlU1ZhcmludCh0KXt0aGlzLndyaXRlVmFyaW50KHQ8MD8tdCoyLTE6dCoyKX13cml0ZUJvb2xlYW4odCl7dGhpcy53cml0ZVZhcmludCgrdCl9d3JpdGVTdHJpbmcodCl7dD1TdHJpbmcodCksdGhpcy5yZWFsbG9jKHQubGVuZ3RoKjQpLHRoaXMucG9zKys7Y29uc3QgZT10aGlzLnBvczt0aGlzLnBvcz1xKHRoaXMuYnVmLHQsdGhpcy5wb3MpO2NvbnN0IHI9dGhpcy5wb3MtZTtyPj0xMjgmJlMoZSxyLHRoaXMpLHRoaXMucG9zPWUtMSx0aGlzLndyaXRlVmFyaW50KHIpLHRoaXMucG9zKz1yfXdyaXRlRmxvYXQodCl7dGhpcy5yZWFsbG9jKDQpLHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQzMih0aGlzLnBvcyx0LCEwKSx0aGlzLnBvcys9NH13cml0ZURvdWJsZSh0KXt0aGlzLnJlYWxsb2MoOCksdGhpcy5kYXRhVmlldy5zZXRGbG9hdDY0KHRoaXMucG9zLHQsITApLHRoaXMucG9zKz04fXdyaXRlQnl0ZXModCl7Y29uc3QgZT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGUpLHRoaXMucmVhbGxvYyhlKTtmb3IobGV0IHI9MDtyPGU7cisrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbcl19d3JpdGVSYXdNZXNzYWdlKHQsZSl7dGhpcy5wb3MrKztjb25zdCByPXRoaXMucG9zO3QoZSx0aGlzKTtjb25zdCBzPXRoaXMucG9zLXI7cz49MTI4JiZTKHIscyx0aGlzKSx0aGlzLnBvcz1yLTEsdGhpcy53cml0ZVZhcmludChzKSx0aGlzLnBvcys9c313cml0ZU1lc3NhZ2UodCxlLHIpe3RoaXMud3JpdGVUYWcodCxGKSx0aGlzLndyaXRlUmF3TWVzc2FnZShlLHIpfXdyaXRlUGFja2VkVmFyaW50KHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsSSxlKX13cml0ZVBhY2tlZFNWYXJpbnQodCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxDLGUpfXdyaXRlUGFja2VkQm9vbGVhbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LFUsZSl9d3JpdGVQYWNrZWRGbG9hdCh0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LEwsZSl9d3JpdGVQYWNrZWREb3VibGUodCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxBLGUpfXdyaXRlUGFja2VkRml4ZWQzMih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHYsZSl9d3JpdGVQYWNrZWRTRml4ZWQzMih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LE4sZSl9d3JpdGVQYWNrZWRGaXhlZDY0KHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsRyxlKX13cml0ZVBhY2tlZFNGaXhlZDY0KHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsSCxlKX13cml0ZUJ5dGVzRmllbGQodCxlKXt0aGlzLndyaXRlVGFnKHQsRiksdGhpcy53cml0ZUJ5dGVzKGUpfXdyaXRlRml4ZWQzMkZpZWxkKHQsZSl7dGhpcy53cml0ZVRhZyh0LHApLHRoaXMud3JpdGVGaXhlZDMyKGUpfXdyaXRlU0ZpeGVkMzJGaWVsZCh0LGUpe3RoaXMud3JpdGVUYWcodCxwKSx0aGlzLndyaXRlU0ZpeGVkMzIoZSl9d3JpdGVGaXhlZDY0RmllbGQodCxlKXt0aGlzLndyaXRlVGFnKHQseSksdGhpcy53cml0ZUZpeGVkNjQoZSl9d3JpdGVTRml4ZWQ2NEZpZWxkKHQsZSl7dGhpcy53cml0ZVRhZyh0LHkpLHRoaXMud3JpdGVTRml4ZWQ2NChlKX13cml0ZVZhcmludEZpZWxkKHQsZSl7dGhpcy53cml0ZVRhZyh0LGcpLHRoaXMud3JpdGVWYXJpbnQoZSl9d3JpdGVTVmFyaW50RmllbGQodCxlKXt0aGlzLndyaXRlVGFnKHQsZyksdGhpcy53cml0ZVNWYXJpbnQoZSl9d3JpdGVTdHJpbmdGaWVsZCh0LGUpe3RoaXMud3JpdGVUYWcodCxGKSx0aGlzLndyaXRlU3RyaW5nKGUpfXdyaXRlRmxvYXRGaWVsZCh0LGUpe3RoaXMud3JpdGVUYWcodCxwKSx0aGlzLndyaXRlRmxvYXQoZSl9d3JpdGVEb3VibGVGaWVsZCh0LGUpe3RoaXMud3JpdGVUYWcodCx5KSx0aGlzLndyaXRlRG91YmxlKGUpfXdyaXRlQm9vbGVhbkZpZWxkKHQsZSl7dGhpcy53cml0ZVZhcmludEZpZWxkKHQsK2UpfX1mdW5jdGlvbiBFKGksdCxlKXtjb25zdCByPWUuYnVmO2xldCBzLG47aWYobj1yW2UucG9zKytdLHM9KG4mMTEyKT4+NCxuPDEyOHx8KG49cltlLnBvcysrXSxzfD0obiYxMjcpPDwzLG48MTI4KXx8KG49cltlLnBvcysrXSxzfD0obiYxMjcpPDwxMCxuPDEyOCl8fChuPXJbZS5wb3MrK10sc3w9KG4mMTI3KTw8MTcsbjwxMjgpfHwobj1yW2UucG9zKytdLHN8PShuJjEyNyk8PDI0LG48MTI4KXx8KG49cltlLnBvcysrXSxzfD0obiYxKTw8MzEsbjwxMjgpKXJldHVybiBmKGkscyx0KTt0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzIil9ZnVuY3Rpb24gZihpLHQsZSl7cmV0dXJuIGU/dCo0Mjk0OTY3Mjk2KyhpPj4+MCk6KHQ+Pj4wKSo0Mjk0OTY3Mjk2KyhpPj4+MCl9ZnVuY3Rpb24gQihpLHQpe2xldCBlLHI7aWYoaT49MD8oZT1pJTQyOTQ5NjcyOTZ8MCxyPWkvNDI5NDk2NzI5NnwwKTooZT1+KC1pJTQyOTQ5NjcyOTYpLHI9figtaS80Mjk0OTY3Mjk2KSxlXjQyOTQ5NjcyOTU/ZT1lKzF8MDooZT0wLHI9cisxfDApKSxpPj0xODQ0Njc0NDA3MzcwOTU1MmUzfHxpPC0xODQ0Njc0NDA3MzcwOTU1MmUzKXRocm93IG5ldyBFcnJvcigiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXMiKTt0LnJlYWxsb2MoMTApLFQoZSxyLHQpLEQocix0KX1mdW5jdGlvbiBUKGksdCxlKXtlLmJ1ZltlLnBvcysrXT1pJjEyN3wxMjgsaT4+Pj03LGUuYnVmW2UucG9zKytdPWkmMTI3fDEyOCxpPj4+PTcsZS5idWZbZS5wb3MrK109aSYxMjd8MTI4LGk+Pj49NyxlLmJ1ZltlLnBvcysrXT1pJjEyN3wxMjgsaT4+Pj03LGUuYnVmW2UucG9zXT1pJjEyN31mdW5jdGlvbiBEKGksdCl7Y29uc3QgZT0oaSY3KTw8NDt0LmJ1Zlt0LnBvcysrXXw9ZXwoKGk+Pj49Myk/MTI4OjApLGkmJih0LmJ1Zlt0LnBvcysrXT1pJjEyN3woKGk+Pj49Nyk/MTI4OjApLGkmJih0LmJ1Zlt0LnBvcysrXT1pJjEyN3woKGk+Pj49Nyk/MTI4OjApLGkmJih0LmJ1Zlt0LnBvcysrXT1pJjEyN3woKGk+Pj49Nyk/MTI4OjApLGkmJih0LmJ1Zlt0LnBvcysrXT1pJjEyN3woKGk+Pj49Nyk/MTI4OjApLGkmJih0LmJ1Zlt0LnBvcysrXT1pJjEyNykpKSkpfWZ1bmN0aW9uIFMoaSx0LGUpe2NvbnN0IHI9dDw9MTYzODM/MTp0PD0yMDk3MTUxPzI6dDw9MjY4NDM1NDU1PzM6TWF0aC5mbG9vcihNYXRoLmxvZyh0KS8oTWF0aC5MTjIqNykpO2UucmVhbGxvYyhyKTtmb3IobGV0IHM9ZS5wb3MtMTtzPj1pO3MtLSllLmJ1ZltzK3JdPWUuYnVmW3NdfWZ1bmN0aW9uIEkoaSx0KXtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl0LndyaXRlVmFyaW50KGlbZV0pfWZ1bmN0aW9uIEMoaSx0KXtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl0LndyaXRlU1ZhcmludChpW2VdKX1mdW5jdGlvbiBMKGksdCl7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspdC53cml0ZUZsb2F0KGlbZV0pfWZ1bmN0aW9uIEEoaSx0KXtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl0LndyaXRlRG91YmxlKGlbZV0pfWZ1bmN0aW9uIFUoaSx0KXtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl0LndyaXRlQm9vbGVhbihpW2VdKX1mdW5jdGlvbiB2KGksdCl7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspdC53cml0ZUZpeGVkMzIoaVtlXSl9ZnVuY3Rpb24gTihpLHQpe2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXQud3JpdGVTRml4ZWQzMihpW2VdKX1mdW5jdGlvbiBHKGksdCl7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspdC53cml0ZUZpeGVkNjQoaVtlXSl9ZnVuY3Rpb24gSChpLHQpe2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXQud3JpdGVTRml4ZWQ2NChpW2VdKX1mdW5jdGlvbiBSKGksdCxlKXtsZXQgcj0iIixzPXQ7Zm9yKDtzPGU7KXtjb25zdCBuPWlbc107bGV0IG89bnVsbCxoPW4+MjM5PzQ6bj4yMjM/MzpuPjE5MT8yOjE7aWYocytoPmUpYnJlYWs7bGV0IGEsZCx1O2g9PT0xP248MTI4JiYobz1uKTpoPT09Mj8oYT1pW3MrMV0sKGEmMTkyKT09PTEyOCYmKG89KG4mMzEpPDw2fGEmNjMsbzw9MTI3JiYobz1udWxsKSkpOmg9PT0zPyhhPWlbcysxXSxkPWlbcysyXSwoYSYxOTIpPT09MTI4JiYoZCYxOTIpPT09MTI4JiYobz0obiYxNSk8PDEyfChhJjYzKTw8NnxkJjYzLChvPD0yMDQ3fHxvPj01NTI5NiYmbzw9NTczNDMpJiYobz1udWxsKSkpOmg9PT00JiYoYT1pW3MrMV0sZD1pW3MrMl0sdT1pW3MrM10sKGEmMTkyKT09PTEyOCYmKGQmMTkyKT09PTEyOCYmKHUmMTkyKT09PTEyOCYmKG89KG4mMTUpPDwxOHwoYSY2Myk8PDEyfChkJjYzKTw8Nnx1JjYzLChvPD02NTUzNXx8bz49MTExNDExMikmJihvPW51bGwpKSksbz09PW51bGw/KG89NjU1MzMsaD0xKTpvPjY1NTM1JiYoby09NjU1MzYscis9U3RyaW5nLmZyb21DaGFyQ29kZShvPj4+MTAmMTAyM3w1NTI5Niksbz01NjMyMHxvJjEwMjMpLHIrPVN0cmluZy5mcm9tQ2hhckNvZGUobykscys9aH1yZXR1cm4gcn1mdW5jdGlvbiBxKGksdCxlKXtmb3IobGV0IHI9MCxzLG47cjx0Lmxlbmd0aDtyKyspe2lmKHM9dC5jaGFyQ29kZUF0KHIpLHM+NTUyOTUmJnM8NTczNDQpaWYobilpZihzPDU2MzIwKXtpW2UrK109MjM5LGlbZSsrXT0xOTEsaVtlKytdPTE4OSxuPXM7Y29udGludWV9ZWxzZSBzPW4tNTUyOTY8PDEwfHMtNTYzMjB8NjU1MzYsbj1udWxsO2Vsc2V7cz41NjMxOXx8cisxPT09dC5sZW5ndGg/KGlbZSsrXT0yMzksaVtlKytdPTE5MSxpW2UrK109MTg5KTpuPXM7Y29udGludWV9ZWxzZSBuJiYoaVtlKytdPTIzOSxpW2UrK109MTkxLGlbZSsrXT0xODksbj1udWxsKTtzPDEyOD9pW2UrK109czooczwyMDQ4P2lbZSsrXT1zPj42fDE5Mjooczw2NTUzNj9pW2UrK109cz4+MTJ8MjI0OihpW2UrK109cz4+MTh8MjQwLGlbZSsrXT1zPj4xMiY2M3wxMjgpLGlbZSsrXT1zPj42JjYzfDEyOCksaVtlKytdPXMmNjN8MTI4KX1yZXR1cm4gZX1mdW5jdGlvbiB4KGksdCl7dGhpcy54PWksdGhpcy55PXR9eC5wcm90b3R5cGU9e2Nsb25lKCl7cmV0dXJuIG5ldyB4KHRoaXMueCx0aGlzLnkpfSxhZGQoaSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKGkpfSxzdWIoaSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKGkpfSxtdWx0QnlQb2ludChpKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludChpKX0sZGl2QnlQb2ludChpKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KGkpfSxtdWx0KGkpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQoaSl9LGRpdihpKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoaSl9LHJvdGF0ZShpKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUoaSl9LHJvdGF0ZUFyb3VuZChpLHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZUFyb3VuZChpLHQpfSxtYXRNdWx0KGkpe3JldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQoaSl9LHVuaXQoKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCl9LHBlcnAoKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCl9LHJvdW5kKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sbWFnKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfSxlcXVhbHMoaSl7cmV0dXJuIHRoaXMueD09PWkueCYmdGhpcy55PT09aS55fSxkaXN0KGkpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKGkpKX0sZGlzdFNxcihpKXtjb25zdCB0PWkueC10aGlzLngsZT1pLnktdGhpcy55O3JldHVybiB0KnQrZSplfSxhbmdsZSgpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueSx0aGlzLngpfSxhbmdsZVRvKGkpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueS1pLnksdGhpcy54LWkueCl9LGFuZ2xlV2l0aChpKXtyZXR1cm4gdGhpcy5hbmdsZVdpdGhTZXAoaS54LGkueSl9LGFuZ2xlV2l0aFNlcChpLHQpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMueCp0LXRoaXMueSppLHRoaXMueCppK3RoaXMueSp0KX0sX21hdE11bHQoaSl7Y29uc3QgdD1pWzBdKnRoaXMueCtpWzFdKnRoaXMueSxlPWlbMl0qdGhpcy54K2lbM10qdGhpcy55O3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfSxfYWRkKGkpe3JldHVybiB0aGlzLngrPWkueCx0aGlzLnkrPWkueSx0aGlzfSxfc3ViKGkpe3JldHVybiB0aGlzLngtPWkueCx0aGlzLnktPWkueSx0aGlzfSxfbXVsdChpKXtyZXR1cm4gdGhpcy54Kj1pLHRoaXMueSo9aSx0aGlzfSxfZGl2KGkpe3JldHVybiB0aGlzLngvPWksdGhpcy55Lz1pLHRoaXN9LF9tdWx0QnlQb2ludChpKXtyZXR1cm4gdGhpcy54Kj1pLngsdGhpcy55Kj1pLnksdGhpc30sX2RpdkJ5UG9pbnQoaSl7cmV0dXJuIHRoaXMueC89aS54LHRoaXMueS89aS55LHRoaXN9LF91bml0KCl7cmV0dXJuIHRoaXMuX2Rpdih0aGlzLm1hZygpKSx0aGlzfSxfcGVycCgpe2NvbnN0IGk9dGhpcy55O3JldHVybiB0aGlzLnk9dGhpcy54LHRoaXMueD0taSx0aGlzfSxfcm90YXRlKGkpe2NvbnN0IHQ9TWF0aC5jb3MoaSksZT1NYXRoLnNpbihpKSxyPXQqdGhpcy54LWUqdGhpcy55LHM9ZSp0aGlzLngrdCp0aGlzLnk7cmV0dXJuIHRoaXMueD1yLHRoaXMueT1zLHRoaXN9LF9yb3RhdGVBcm91bmQoaSx0KXtjb25zdCBlPU1hdGguY29zKGkpLHI9TWF0aC5zaW4oaSkscz10LngrZSoodGhpcy54LXQueCktcioodGhpcy55LXQueSksbj10LnkrcioodGhpcy54LXQueCkrZSoodGhpcy55LXQueSk7cmV0dXJuIHRoaXMueD1zLHRoaXMueT1uLHRoaXN9LF9yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc30sY29uc3RydWN0b3I6eH0seC5jb252ZXJ0PWZ1bmN0aW9uKGkpe2lmKGkgaW5zdGFuY2VvZiB4KXJldHVybiBpO2lmKEFycmF5LmlzQXJyYXkoaSkpcmV0dXJuIG5ldyB4KCtpWzBdLCtpWzFdKTtpZihpLnghPT12b2lkIDAmJmkueSE9PXZvaWQgMClyZXR1cm4gbmV3IHgoK2kueCwraS55KTt0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIFt4LCB5XSBvciB7eCwgeX0gcG9pbnQgZm9ybWF0Iil9O2NsYXNzIGt7Y29uc3RydWN0b3IodCxlLHIscyxuKXt0aGlzLnByb3BlcnRpZXM9e30sdGhpcy5leHRlbnQ9cix0aGlzLnR5cGU9MCx0aGlzLmlkPXZvaWQgMCx0aGlzLl9wYmY9dCx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPXMsdGhpcy5fdmFsdWVzPW4sdC5yZWFkRmllbGRzKGosdGhpcyxlKX1sb2FkR2VvbWV0cnkoKXtjb25zdCB0PXRoaXMuX3BiZjt0LnBvcz10aGlzLl9nZW9tZXRyeTtjb25zdCBlPXQucmVhZFZhcmludCgpK3QucG9zLHI9W107bGV0IHMsbj0xLG89MCxoPTAsYT0wO2Zvcig7dC5wb3M8ZTspe2lmKG88PTApe2NvbnN0IGQ9dC5yZWFkVmFyaW50KCk7bj1kJjcsbz1kPj4zfWlmKG8tLSxuPT09MXx8bj09PTIpaCs9dC5yZWFkU1ZhcmludCgpLGErPXQucmVhZFNWYXJpbnQoKSxuPT09MSYmKHMmJnIucHVzaChzKSxzPVtdKSxzJiZzLnB1c2gobmV3IHgoaCxhKSk7ZWxzZSBpZihuPT09NylzJiZzLnB1c2goc1swXS5jbG9uZSgpKTtlbHNlIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBjb21tYW5kICR7bn1gKX1yZXR1cm4gcyYmci5wdXNoKHMpLHJ9YmJveCgpe2NvbnN0IHQ9dGhpcy5fcGJmO3QucG9zPXRoaXMuX2dlb21ldHJ5O2NvbnN0IGU9dC5yZWFkVmFyaW50KCkrdC5wb3M7bGV0IHI9MSxzPTAsbj0wLG89MCxoPTEvMCxhPS0xLzAsZD0xLzAsdT0tMS8wO2Zvcig7dC5wb3M8ZTspe2lmKHM8PTApe2NvbnN0IHc9dC5yZWFkVmFyaW50KCk7cj13Jjcscz13Pj4zfWlmKHMtLSxyPT09MXx8cj09PTIpbis9dC5yZWFkU1ZhcmludCgpLG8rPXQucmVhZFNWYXJpbnQoKSxuPGgmJihoPW4pLG4+YSYmKGE9biksbzxkJiYoZD1vKSxvPnUmJih1PW8pO2Vsc2UgaWYociE9PTcpdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIGNvbW1hbmQgJHtyfWApfXJldHVybltoLGQsYSx1XX10b0dlb0pTT04odCxlLHIpe2NvbnN0IHM9dGhpcy5leHRlbnQqTWF0aC5wb3coMixyKSxuPXRoaXMuZXh0ZW50KnQsbz10aGlzLmV4dGVudCplLGg9dGhpcy5sb2FkR2VvbWV0cnkoKTtmdW5jdGlvbiBhKGwpe3JldHVyblsobC54K24pKjM2MC9zLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoKDEtKGwueStvKSoyL3MpKk1hdGguUEkpKS05MF19ZnVuY3Rpb24gZChsKXtyZXR1cm4gbC5tYXAoYSl9bGV0IHU7aWYodGhpcy50eXBlPT09MSl7Y29uc3QgbD1bXTtmb3IoY29uc3QgViBvZiBoKWwucHVzaChWWzBdKTtjb25zdCBjPWQobCk7dT1sLmxlbmd0aD09PTE/e3R5cGU6IlBvaW50Iixjb29yZGluYXRlczpjWzBdfTp7dHlwZToiTXVsdGlQb2ludCIsY29vcmRpbmF0ZXM6Y319ZWxzZSBpZih0aGlzLnR5cGU9PT0yKXtjb25zdCBsPWgubWFwKGQpO3U9bC5sZW5ndGg9PT0xP3t0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpsWzBdfTp7dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpsfX1lbHNlIGlmKHRoaXMudHlwZT09PTMpe2NvbnN0IGw9VyhoKSxjPVtdO2Zvcihjb25zdCBWIG9mIGwpYy5wdXNoKFYubWFwKGQpKTt1PWMubGVuZ3RoPT09MT97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6Y1swXX06e3R5cGU6Ik11bHRpUG9seWdvbiIsY29vcmRpbmF0ZXM6Y319ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gZmVhdHVyZSB0eXBlIik7Y29uc3Qgdz17dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6dSxwcm9wZXJ0aWVzOnRoaXMucHJvcGVydGllc307cmV0dXJuIHRoaXMuaWQhPW51bGwmJih3LmlkPXRoaXMuaWQpLHd9fWsudHlwZXM9WyJVbmtub3duIiwiUG9pbnQiLCJMaW5lU3RyaW5nIiwiUG9seWdvbiJdO2Z1bmN0aW9uIGooaSx0LGUpe2k9PT0xP3QuaWQ9ZS5yZWFkVmFyaW50KCk6aT09PTI/TyhlLHQpOmk9PT0zP3QudHlwZT1lLnJlYWRWYXJpbnQoKTppPT09NCYmKHQuX2dlb21ldHJ5PWUucG9zKX1mdW5jdGlvbiBPKGksdCl7Y29uc3QgZT1pLnJlYWRWYXJpbnQoKStpLnBvcztmb3IoO2kucG9zPGU7KXtjb25zdCByPXQuX2tleXNbaS5yZWFkVmFyaW50KCldLHM9dC5fdmFsdWVzW2kucmVhZFZhcmludCgpXTt0LnByb3BlcnRpZXNbcl09c319ZnVuY3Rpb24gVyhpKXtjb25zdCB0PWkubGVuZ3RoO2lmKHQ8PTEpcmV0dXJuW2ldO2NvbnN0IGU9W107bGV0IHIscztmb3IobGV0IG49MDtuPHQ7bisrKXtjb25zdCBvPUooaVtuXSk7byE9PTAmJihzPT09dm9pZCAwJiYocz1vPDApLHM9PT1vPDA/KHImJmUucHVzaChyKSxyPVtpW25dXSk6ciYmci5wdXNoKGlbbl0pKX1yZXR1cm4gciYmZS5wdXNoKHIpLGV9ZnVuY3Rpb24gSihpKXtsZXQgdD0wO2ZvcihsZXQgZT0wLHI9aS5sZW5ndGgscz1yLTEsbixvO2U8cjtzPWUrKyluPWlbZV0sbz1pW3NdLHQrPShvLngtbi54KSoobi55K28ueSk7cmV0dXJuIHR9Y2xhc3MgWHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudmVyc2lvbj0xLHRoaXMubmFtZT0iIix0aGlzLmV4dGVudD00MDk2LHRoaXMubGVuZ3RoPTAsdGhpcy5fcGJmPXQsdGhpcy5fa2V5cz1bXSx0aGlzLl92YWx1ZXM9W10sdGhpcy5fZmVhdHVyZXM9W10sdC5yZWFkRmllbGRzKCQsdGhpcyxlKSx0aGlzLmxlbmd0aD10aGlzLl9mZWF0dXJlcy5sZW5ndGh9ZmVhdHVyZSh0KXtpZih0PDB8fHQ+PXRoaXMuX2ZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcyIpO3RoaXMuX3BiZi5wb3M9dGhpcy5fZmVhdHVyZXNbdF07Y29uc3QgZT10aGlzLl9wYmYucmVhZFZhcmludCgpK3RoaXMuX3BiZi5wb3M7cmV0dXJuIG5ldyBrKHRoaXMuX3BiZixlLHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX19ZnVuY3Rpb24gJChpLHQsZSl7aT09PTE1P3QudmVyc2lvbj1lLnJlYWRWYXJpbnQoKTppPT09MT90Lm5hbWU9ZS5yZWFkU3RyaW5nKCk6aT09PTU/dC5leHRlbnQ9ZS5yZWFkVmFyaW50KCk6aT09PTI/dC5fZmVhdHVyZXMucHVzaChlLnBvcyk6aT09PTM/dC5fa2V5cy5wdXNoKGUucmVhZFN0cmluZygpKTppPT09NCYmdC5fdmFsdWVzLnB1c2goYihlKSl9ZnVuY3Rpb24gYihpKXtsZXQgdD1udWxsO2NvbnN0IGU9aS5yZWFkVmFyaW50KCkraS5wb3M7Zm9yKDtpLnBvczxlOyl7Y29uc3Qgcj1pLnJlYWRWYXJpbnQoKT4+Mzt0PXI9PT0xP2kucmVhZFN0cmluZygpOnI9PT0yP2kucmVhZEZsb2F0KCk6cj09PTM/aS5yZWFkRG91YmxlKCk6cj09PTQ/aS5yZWFkVmFyaW50NjQoKTpyPT09NT9pLnJlYWRWYXJpbnQoKTpyPT09Nj9pLnJlYWRTVmFyaW50KCk6cj09PTc/aS5yZWFkQm9vbGVhbigpOm51bGx9aWYodD09bnVsbCl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gZmVhdHVyZSB2YWx1ZSIpO3JldHVybiB0fWNsYXNzIHp7Y29uc3RydWN0b3IodCxlKXt0aGlzLmxheWVycz10LnJlYWRGaWVsZHMoWSx7fSxlKX19ZnVuY3Rpb24gWShpLHQsZSl7aWYoaT09PTMpe2NvbnN0IHI9bmV3IFgoZSxlLnJlYWRWYXJpbnQoKStlLnBvcyk7ci5sZW5ndGgmJih0W3IubmFtZV09cil9fWFzeW5jIGZ1bmN0aW9uIEsoaSx0LGUscil7dHJ5e2NvbnN0IHM9UShpLHQsZSxyKTtyZXR1cm57eDp0LHk6ZSx6OnIsbGF5ZXJzOnMsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YUZvcm1hdDoibXZ0In19Y2F0Y2gocyl7dGhyb3cgY29uc29sZS5lcnJvcigi6Kej5p6Q55+i6YeP55Om54mH5pWw5o2u5pe25Ye66ZSZOiIscyksc319ZnVuY3Rpb24gUShpLHQsZSxyKXtjb25zdCBzPW5ldyBNKGkpLG49bmV3IHoocyksbz17fTtmb3IoY29uc3QgaCBpbiBuLmxheWVycyl7Y29uc3QgYT1uLmxheWVyc1toXSxkPVtdO2ZvcihsZXQgdT0wO3U8YS5sZW5ndGg7dSsrKXtjb25zdCBsPWEuZmVhdHVyZSh1KS50b0dlb0pTT04odCxlLHIpO2QucHVzaChsKX1vW2hdPWR9cmV0dXJuIG99c2VsZi5vbm1lc3NhZ2U9YXN5bmMgaT0+e2NvbnN0IHQ9aS5kYXRhO3RyeXtjb25zdCBlPWF3YWl0IEsodC5hcnJheUJ1ZmZlcix0LngsdC55LHQueik7c2VsZi5wb3N0TWVzc2FnZShlKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKCJXb3JrZXIgTVZUIOino+aekOWksei0pToiLGUpLHNlbGYucG9zdE1lc3NhZ2Uoe2Vycm9yOmUubWVzc2FnZX0pfX19KSgpOwo=",av=r=>Uint8Array.from(atob(r),e=>e.charCodeAt(0)),Wh=typeof self<"u"&&self.Blob&&new Blob([av(Gh)],{type:"text/javascript;charset=utf-8"});function lv(r){let e;try{if(e=Wh&&(self.URL||self.webkitURL).createObjectURL(Wh),!e)throw"";const t=new Worker(e,{name:r?.name});return t.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),t}catch{return new Worker("data:text/javascript;base64,"+Gh,{name:r?.name})}finally{e&&(self.URL||self.webkitURL).revokeObjectURL(e)}}var cv=Object.defineProperty,hv=(r,e,t)=>e in r?cv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Ws=(r,e,t)=>hv(r,typeof e!="symbol"?e+"":e,t);const uv=10;class dv{constructor(){Ws(this,"info",{version:"1.0.0",description:"Vector Tile loader for Mapbox Vector Tile format. It can load and parse MVT data."}),Ws(this,"dataType","VectorTile"),Ws(this,"fileLoader",new p.FileLoader(De.manager)),Ws(this,"_workerPool",new $o(0)),this.fileLoader.setResponseType("arraybuffer"),this._workerPool.setWorkerCreator(()=>new lv)}async load(e){const{source:t,x:i,y:n,z:s}=e,a=typeof t._getUrl=="function"?t._getUrl(i,n,s):this.buildTileUrl(t.url,i,n,s);if(!a)return this.createErrorGeometry(i,n,s,new Error("VectorTileLoader: source._getUrl 返回空 URL"));this._workerPool.pool===0&&this._workerPool.setWorkerLimit(uv);try{const c=await this.fetchVectorData(a),h={arrayBuffer:c,x:i,y:n,z:s},m=(await this._workerPool.postMessage(h,[c])).data;if(m.error)throw new Error(m.error);const f=this.createGeometryWithVectorData(m,e);return De.manager.parseEnd(a),f}catch(c){return this.createErrorGeometry(i,n,s,c)}}async fetchVectorData(e){try{const t=await this.fileLoader.loadAsync(e);if(!t||t.byteLength===0)throw new Error("Empty response");return t}catch(t){throw new Error(`Failed to fetch vector tile: ${t.message}`)}}calculateTileBounds(e,t,i){const n=4007501668557849e-8/Math.pow(2,i),s=-20037508342789244e-9+e*n,a=s+n,c=20037508342789244e-9-(t+1)*n,h=c+n;return{min:new p.Vector2(s,c),max:new p.Vector2(a,h),world:new p.Vector2(n,n)}}buildTileUrl(e,t,i,n){return e.replace("{x}",t.toString()).replace("{y}",i.toString()).replace("{z}",n.toString()).replace("{-y}",(Math.pow(2,n)-1-i).toString())}createGeometryWithVectorData(e,t){const i=new jn;return i.userData={vectorData:e,tileInfo:{x:t.x,y:t.y,z:t.z,bounds:t.bounds},metadata:{dataType:"vector-tile",version:"1.0.0",loadedAt:Date.now()}},i}createErrorGeometry(e,t,i,n){const s=new jn;return s.userData={vectorData:{x:e,y:t,z:i,layers:{},totalFeatures:0,bounds:this.calculateTileBounds(e,t,i),error:n.message,timestamp:Date.now(),dataFormat:"error"},tileInfo:{x:e,y:t,z:i,bounds:[0,0,0,0]},metadata:{dataType:"vector-tile-error",error:!0,errorMessage:n.message}},s}unload(e){e.userData?.vectorData&&(e.userData.vectorData=null),e.dispose&&e.dispose()}static getVectorData(e){return e.userData?.vectorData||null}static hasValidVectorData(e){const t=this.getVectorData(e);return t&&!t.error&&t.totalFeatures>0}static getLayerNames(e){const t=this.getVectorData(e);return t?Object.keys(t.layers||{}):[]}static getFeaturesByLayer(e,t){return this.getVectorData(e)?.layers?.[t]?.convertedFeatures||[]}}wh(new dv);var fv=Object.defineProperty,pv=(r,e,t)=>e in r?fv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,qi=(r,e,t)=>pv(r,typeof e!="symbol"?e+"":e,t);class wa extends hh{constructor(e,t){if(super(e,t),qi(this,"layerType","vector"),qi(this,"_tileDataMap",new Map),qi(this,"_renderer"),qi(this,"_style"),qi(this,"_feaList",[]),qi(this,"_collision",!1),qi(this,"_renderAltitude",0),qi(this,"_eventsBound",!1),!t.style)throw new Error("VectorTileLayer must provide style configuration! VectorTileLayer 必须提供样式配置");this._style=t.style,this._collision=t.collision||!1,this._featureFilter=t.featureFilter,this._renderAltitude=t.altitude||0,this._rootTile.setDataOnlyMode(!0),this._setupDataModeAndListenersForChildren(),this._setupLifeCycleListeners()}_setupDataModeAndListenersForChildren(){const e=t=>{t!==this._rootTile&&t.setDataOnlyMode(!0),this._addShownListenerToTile(t),this._addUnloadListenerToTile(t)};this._rootTile.addEventListener("tile-created",t=>{const i=t.tile;e(i)}),this._rootTile.traverse(t=>{t.isTile&&e(t)})}_addShownListenerToTile(e){const t=i=>{const n=i.tile,s=`${n.z}-${n.x}-${n.y}`,a=!!this._renderer,c=this._tileDataMap.get(s);a&&c&&this._renderer.processTileData(n,c.data)};e.addEventListener("tile-shown",t)}_addUnloadListenerToTile(e){const t=i=>{const n=i.tile||i.target,s=`${n.z}-${n.x}-${n.y}`;if(this._renderer)try{this._renderer.removeFeaturesByTileKey(s)}catch{}this._tileDataMap.delete(s)};e.addEventListener("unload",t)}setAltitude(e){return super.setAltitude(0),this._renderAltitude=e,this._renderer&&this._renderer.setAltitude(e),this}getAltitude(){return this._renderAltitude}_addHiddenListenerToTile(e){const t=i=>{const n=i.tile,s=`${n.z}-${n.x}-${n.y}`;if(this._renderer)try{this._renderer.hideFeaturesByTileKey(s)}catch{}};e.addEventListener("tile-hidden",t)}_setupLifeCycleListeners(){this._rootTile.addEventListener("tile-loaded",e=>{const t=e.tile,i=`${t.z}-${t.x}-${t.y}`,n=this.getVectorDataFromTile(t);if(!n){console.warn(`[VectorTileLayer] Tile ${i} loaded but has no vector data.`);return}if(n.vectorData?.dataFormat==="mvt"&&this._tileDataMap.set(i,{data:n,tile:t,timestamp:Date.now(),pending:!1}),t.showing&&this._renderer&&n.vectorData?.dataFormat==="mvt")try{this._renderer.processTileData(t,n)}catch{}})}getVectorDataFromTile(e){return!e.geometry||!e.getVectorData()?null:e.getVectorData()}createLoader(){const e=new Ls;return e.vtSource=this.source,e}getVisibleVectorTiles(){const e=[];return this._rootTile.traverse(t=>{if(t.isTile&&t.loaded&&t.inFrustum){const i=`${t.z}-${t.x}-${t.y}`,n=this._tileDataMap.get(i);n&&e.push({tileKey:i,data:n.data,tile:n.tile})}}),e}getAllVectorData(){return new Map(this._tileDataMap)}getVectorData(e,t,i){const n=`${i}-${e}-${t}`,s=this._tileDataMap.get(n);return s?s.data:null}setFeatureFilter(e){this._featureFilter=e,this._renderer&&this._renderer.setFeatureFilter(e)}clearFeatureFilter(){this._featureFilter=void 0,this._renderer&&this._renderer.clearFeatureFilter()}setOpacity(e){this.opacity=e,this._renderer&&this._renderer.setOpacity(e)}hide(){return super.hide(),this._renderer&&this._renderer.hide(),this}show(){return super.show(),this._renderer&&this._renderer.show(),this}update(e){!this.enabled||!this.visible||super.update(e)}dispose(){this._renderer&&this._renderer.dispose(),super.dispose()}setFeaturePickingEnabled(e){this.options.enableFeaturePicking=e,this._renderer&&(this._renderer.interactive=e,e&&!this._eventsBound&&this._bindRendererEvents(this._renderer))}_bindRendererEvents(e){if(this._eventsBound)return;["click","dblclick","mousedown","mouseup","mousemove","mouseenter","mouseleave","mouseover","mouseout","contextmenu"].forEach(i=>{const n="feature"+i;e.on(n,s=>{this.trigger(n,s)})}),this._eventsBound=!0}_setRenderer(e){this._renderer=e,this._eventsBound=!1,this.options.enableFeaturePicking&&this._bindRendererEvents(e)}_getRenderer(){return this._renderer||null}getProcessStats(){return this._renderer?this._renderer.getProcessStats():null}resetProcessStats(){this._renderer?.resetProcessStats()}getStyle(){return this._style}setStyle(e){if(this._style=e,this._renderer){this._renderer.style=e;const t=performance.now();let i=0;this._tileDataMap.forEach((a,c)=>{this._renderer.removeFeaturesByTileKey(c)}),this.getVisibleVectorTiles().forEach(({tile:a,data:c})=>{this._renderer.processTileData(a,c),i++});const s=performance.now()-t;console.log(`[setStyle] 重新处理 ${i} 个瓦片 耗时: ${s.toFixed(2)}ms`)}return this}setSymbol(e){return this.setStyle(e)}}var mv=Object.defineProperty,gv=(r,e,t)=>e in r?mv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Be=(r,e,t)=>gv(r,typeof e!="symbol"?e+"":e,t);class yv{constructor(...e){}}const _v={};let Pn=class ff extends Qo(Yi(xn(yv))){constructor(e,t){Ko(e,"container","Map container element must be specified");const i=["center","basemap"];for(const W of i)wc(t,W);const s={...t,viewer:{...{viewer:{antialias:!0,stencil:!0,logarithmicDepthBuffer:!0}}.viewer,...t.viewer}};super(s),Be(this,"viewer"),Be(this,"tilemap"),Be(this,"center"),Be(this,"prjcenter"),Be(this,"_layerContainer"),Be(this,"_EventMap",{loaded:{listened:!1}}),Be(this,"_canvasManager",new $g),Be(this,"collisionEngine"),Be(this,"_onLoadHooks"),Be(this,"_minZoom",0),Be(this,"_maxZoom",22),Be(this,"_ZOOM_MIN_CONST",0),Be(this,"_ZOOM_MAX_CONST",22),Be(this,"_minZoomDistance",500),Be(this,"_maxZoomDistance",8e4),Be(this,"_isZooming",!1),Be(this,"_zoomStartValue",0),Be(this,"_lastZoomForControls",0),Be(this,"_overZoom",0),Be(this,"_lastCameraDistance",0),this.tilemap=this.initTileMap(s.basemap),this.center=this.options.center,this.viewer=new Cc(e,{...s.viewer,map:this}),this.tilemap.receiveShadow=!0,this.viewer.scene.add(this.tilemap);const a=this.tilemap.geo2world(new p.Vector3(this.center[0],this.center[1],0));this.prjcenter=a;const c=this.options.viewer??{};this.viewer.flyToPoint({center:this.center,distance:typeof this.center[2]=="number"?this.center[2]:void 0,polarDeg:typeof c.polarDeg=="number"?c.polarDeg:void 0,azimuthDeg:typeof c.azimuthDeg=="number"?c.azimuthDeg:void 0,polarAngle:c.polarAngle,azimuthAngle:c.azimuthAngle,duration:0,curvePath:!1}),this._minZoomDistance=this.viewer.controls.minDistance,this._maxZoomDistance=this.viewer.controls.maxDistance;const h=this._getCameraDistance();this._lastCameraDistance=h,this._layerContainer=new jg,this.viewer.scene.add(this._layerContainer);const d=this.viewer.controls;this._minZoomDistance=typeof d?.minDistance=="number"?d.minDistance:500,this._maxZoomDistance=typeof d?.maxDistance=="number"?d.maxDistance:8e4;const f=this.tilemap.getLayers().find(W=>W.isBaseLayer===!0)?.minLevel??this.tilemap.minLevel;this._minZoom=Math.max(this._ZOOM_MIN_CONST,Math.min(this._ZOOM_MAX_CONST,f)),this._maxZoom=this._ZOOM_MAX_CONST;const g=this.prjcenter,w=this.viewer.camera.position.clone().clone().sub(g).normalize(),x=us(t.zoom)?13:t.zoom,L=Math.max(this._minZoom,Math.min(this._maxZoom,x)),M=this._computeDistanceFromZoom(L);a.clone().addScaledVector(w,M);const C=this.getZoom();this._lastZoomForControls=C,this._zoomStartValue=C,this.collisionEngine=new C0(this.viewer.renderer,{padding:8,updateInterval:16,animationDuration:200,maxFeaturesPerFrame:2e4,strategies:{priority:!0,grouping:!0,proximity:!0}}),this.on("control-change",T0.debounce(W=>{if(!this.tilemap||!this.collisionEngine)return;const D=this.tilemap,z=D.getDataZoom(),I=D.getLayers().find(H=>H.isBaseLayer===!0)?.maxLevel??D.maxLevel,U=this._getCameraDistance(),V=U-this._lastCameraDistance;this._lastCameraDistance=U;const{max:G}=this._getViewZoomRange(),N=Math.max(0,G-I);z<I?this._overZoom=0:V<-.001?this._overZoom=Math.min(this._overZoom+1,N):V>.001&&(this._overZoom=Math.max(this._overZoom-1,0));const j=this.getZoom();Math.abs(j-this._lastZoomForControls)>.001&&(this._isZooming?this.trigger("zooming",{from:this._zoomStartValue,to:j}):(this._isZooming=!0,this._zoomStartValue=this._lastZoomForControls,this.trigger("zoomstart",{from:this._zoomStartValue,to:j})),this._lastZoomForControls=j),this.collisionEngine.update(W.camera)},10,{leading:!1,trailing:!0})),this.on("control-end",()=>{this._isZooming&&(this._isZooming=!1,this.trigger("zoomend",{from:this._zoomStartValue,to:this.getZoom()}))}),this._callOnLoadHooks()}static addOnLoadHook(e,...t){const i=typeof e=="function"?e:function(){this[e].apply(this,t)},n=this.prototype;return n._onLoadHooks=n._onLoadHooks||[],n._onLoadHooks.push(i),this}_callOnLoadHooks(){const e=ff.prototype;if(e._onLoadHooks)for(let t=0,i=e._onLoadHooks.length;t<i;t++)e._onLoadHooks[t].call(this)}getZoom(){const e=this.tilemap,t=e.getDataZoom(),n=e.getLayers().find(s=>s.isBaseLayer===!0)?.maxLevel??e.maxLevel;return t<n?t:n+this._overZoom}getDataZoom(){return this.tilemap.getDataZoom()}getMinZoom(){return this._minZoom}getMaxZoom(){return this._maxZoom}setZoomRange(e,t){if(e>t){const n=e;e=t,t=n}this._minZoom=e,this._maxZoom=t;const i=this.viewer.controls;if(i){const n=this._computeDistanceFromZoom(this._maxZoom),s=this._computeDistanceFromZoom(this._minZoom);i.minDistance=n,i.maxDistance=s}return this}setMinZoom(e){return this.setZoomRange(e,this._maxZoom)}setMaxZoom(e){return this.setZoomRange(this._minZoom,e)}setZoom(e){const t=this.getMinZoom(),i=this.getMaxZoom(),n=Math.max(t,Math.min(i,e)),s=this.getZoom(),a=this._computeDistanceFromZoom(n),c=this.viewer.controls,h=c?.target??this.prjcenter,d=this.viewer.camera,m=d.position.clone().sub(h).normalize();return d.position.copy(h).addScaledVector(m,a),d.updateProjectionMatrix(),typeof c?.update=="function"&&c.update(),this._lastZoomForControls=n,this.trigger("zoomend",{from:s,to:this.getZoom()}),this}zoomIn(e=1){return this.setZoom(this.getZoom()+e)}zoomOut(e=1){return this.setZoom(this.getZoom()-e)}_computeDistanceFromZoom(e){const t=this._ZOOM_MIN_CONST,i=this._ZOOM_MAX_CONST,n=this._minZoomDistance,s=this._maxZoomDistance;if(n<=0||n>=s){const m=Math.max(t,Math.min(i,e)),f=(i-m)/(i-t);return n+f*(s-n)}const c=(Math.max(t,Math.min(i,e))-t)/(i-t),h=n/s;return s*Math.pow(h,c)}initTileMap(e){const t=new gs({...e});try{if(e.Baselayers?.length)for(const i of e.Baselayers)i.isBaseLayer=!0,t.addLayer(i)}catch(i){console.error("💥 Diagnostic failed 诊断失败:",i)}return t.rotateX(-Math.PI/2),t.receiveShadow=!0,setTimeout(()=>{const i={timestamp:xc(),targrt:this};this._EventMap.loaded={listened:!0},this.trigger("loaded",i)},0),t}addLayer(e,...t){if(!e)return this;Array.isArray(e)||(e=[e]),t?.length&&(e=e.concat(t)),t?.length&&(e=e.concat(t));for(let i=0,n=e.length;i<n;i++){const s=e[i],a=s.getId();if(us(a))throw new Error("Invalid id for the layer: "+a);s.isTileLayer?this.addTileLayer(s):this.addRegularLayer(s)}return this}removeLayer(e){const t=typeof e=="string"?e:e.getId(),i=this.tilemap.getLayer(t);if(i){if(i instanceof wa){const s=i._getRenderer();s&&this._layerContainer.remove(s)}return this.tilemap.removeLayer(t),!0}const n=this._layerContainer.getLayerById(t);return n?(this._layerContainer.remove(n),n instanceof ji&&n?._collision,!0):(console.warn(`⚠️ Layer does not exist 图层不存在: ${t}`),!1)}addRegularLayer(e){this._layerContainer.add(e),e._bindMap(this),e instanceof ji&&e?._collision&&(this.collisionEngine.registerLayer(e),e.setCollisionEngine(this.collisionEngine))}addTileLayer(e){if(this.tilemap.addLayer(e),e._bindMap(this),e instanceof wa){const t=e.options||{},i=new Ms(e.getId()+"-vtrender",{altitude:e.getAltitude(),style:e.getStyle(),collision:e._collision,zIndex:typeof t.zIndex=="number"?t.zIndex:void 0,depthOffset:typeof t.depthOffset=="number"?t.depthOffset:void 0});t.enableFeaturePicking&&(i.interactive=!0),e._setRenderer(i),this.addRegularLayer(i)}return this}clearLayers(){return this._layerContainer.clear(),this.tilemap.clearLayers(),this}getLayers(){const e=this._layerContainer.getLayers().filter(i=>!(i instanceof Ms)),t=this.tilemap.getLayers();return[...e,...t]}getLayerById(e){const t=this._layerContainer.getLayerById(e);return t?t instanceof Ms?void 0:t:this.tilemap.getLayer(e)}geo2world(e){return this.tilemap.geo2world(e)}world2geo(e){return this.tilemap.world2geo(e)}geo2map(e){return this.tilemap.geo2map(e)}_getCanvas(e=40,t=30,i){return this._canvasManager.getCanvas(e,t,1,i)}getContainer(){return this.viewer.container}getRenderer(){return this.viewer.renderer}getCamera(){return this.viewer.camera}_findFeaturesAt(e){const t=this,i=t.getRenderer(),n=t.getCamera(),s=i.domElement.getBoundingClientRect(),a=e.x/s.width*2-1,c=-(e.y/s.height)*2+1,h=new p.Raycaster;h.setFromCamera(new p.Vector2(a,c),n);const d=[...t.getLayers(),...t._layerContainer.getLayers().filter(g=>g instanceof Ms&&g.interactive)].filter(g=>!g?.isSceneLayer&&g?.visible===!0),f=h.intersectObjects(d,!0).map(g=>{let _=g.object,w=null;for(;_;){if(_ instanceof dt){w=_;break}_=_.parent}if(!w||w.visible===!1)return null;const b=t.world2geo(g.point);return{feature:w,distance:g.distance,object:g.object,intersectcoordinate:[b.x,b.y,b.z]}}).filter(g=>!!g);return f.length?f.sort((g,_)=>(g?.distance??0)-(_?.distance??0)):[]}getCenter(){const e=this.viewer.controls.target.clone(),t=this.world2geo(e);return[t.x,t.y,t.z]}_getEventPosition(e){let t,i;if("touches"in e){if(e.touches.length===0)return null;t=e.touches[0].clientX,i=e.touches[0].clientY}else t=e.clientX,i=e.clientY;const n=this.getContainer();if(!n)return null;const s=n.getBoundingClientRect();return{x:t-s.left,y:i-s.top}}get isInteracting(){return this.viewer?this.viewer.isInteracting:!1}_getCameraDistance(){const e=this.viewer.controls,t=this.viewer.camera,i=e?.target??this.prjcenter;return e&&typeof e.getDistance=="function"?e.getDistance():t.position.distanceTo(i)}_getViewZoomRange(){const e=this.viewer.controls,t=typeof e?.minDistance=="number"?e.minDistance:this._minZoomDistance,i=typeof e?.maxDistance=="number"?e.maxDistance:this._maxZoomDistance;if(t<=0||t>=i){const f=this.tilemap.getDataZoom();return{min:f,max:f}}const n=i/t,s=Math.log2(n),a=this.tilemap.getLayers().find(f=>f.isBaseLayer===!0),c=a?.minLevel??this.tilemap.minLevel,h=a?.maxLevel??this.tilemap.maxLevel,d=c,m=h+s;return{min:d,max:m}}flyTo(e){this.viewer.flyToAdvanced(e)}flyToPoint(e){this.viewer.flyToPoint(e)}destroy(){try{this._clearHandlers(),["control-change","control-start","control-end","zoomstart","zooming","zoomend","loaded"].forEach(t=>{const i=this._listenerMap?.get(t);i&&i.forEach((n,s)=>{this.off(t,s)})}),this.clearLayers(),Ac.clearCache(),this.collisionEngine&&(this.collisionEngine=null),this._layerContainer&&(this._layerContainer.clear(),this._layerContainer=null),this.tilemap&&(this.tilemap.dispose(),this.tilemap=null),this._canvasManager&&(this._canvasManager=null),this.viewer&&(this.viewer.destroy(),this.viewer=null),this._EventMap={loaded:{listened:!1}}}catch(e){console.error("Error destroying map 销毁地图时出错:",e)}}};Pn.mergeOptions(_v);const vv=["click","dblclick","mousedown","mouseup","mousemove","mouseenter","mouseleave","mouseover","mouseout"];Pn.prototype._removeDomEvents=function(){},Pn.prototype._registerDomEvents=function(){const r=this.viewer.container;if(r){let t=null;vv.forEach(i=>{r.addEventListener(i,n=>{if(!this.viewer||!this.tilemap)return;if(i==="mousedown"&&(t={x:n.clientX,y:n.clientY}),i==="click"&&t){const c=n.clientX-t.x,h=n.clientY-t.y;if(Math.sqrt(c*c+h*h)>5)return}let s=sa(n,this.tilemap,this.viewer.camera),a={target:this,originEvent:n,eventName:i,screenXY:{X:n.screenX,Y:n.screenY}};if(s){let c=[s.x,s.y,s.z];a={target:this,originEvent:n,coordinate:c,eventName:i,screenXY:{X:n.screenX,Y:n.screenY}}}this.trigger(i,a)})})}},Pn.addOnLoadHook("_registerDomEvents");var wv=Object.defineProperty,bv=(r,e,t)=>e in r?wv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,ba=(r,e,t)=>bv(r,typeof e!="symbol"?e+"":e,t);const xv=["click","dblclick","mousedown","mouseup","mousemove","mouseenter","mouseleave","mouseover","mouseout","contextmenu","touchstart","touchmove","touchend"];class Mv extends ds{constructor(){super(...arguments),ba(this,"_registeredEvents",[]),ba(this,"_mouseDownTime",0),ba(this,"_eventCommon",e=>{(e.type==="mousedown"||e.type==="touchstart")&&(this._mouseDownTime=Date.now()),!(e.type==="click"&&Date.now()-this._mouseDownTime>300)&&this._handleEvent(e,e.type)})}addHooks(){const t=this.target.getContainer();t&&xv.forEach(i=>{t.addEventListener(i,this._eventCommon),this._registeredEvents.push(i)})}removeHooks(){const t=this.target.getContainer();t&&this._registeredEvents.length>0&&(this._registeredEvents.forEach(i=>{const n=i;t.removeEventListener(n,this._eventCommon)}),this._registeredEvents=[])}_handleEvent(e,t){const i=this.target;if(!i||!i.viewer||this._shouldIgnoreEvent(t)||(t==="mousemove"||t==="mouseenter"||t==="mouseleave"||t==="mouseover"||t==="mouseout"||t==="touchmove")&&!i.getLayers().some(h=>!h.isSceneLayer&&h._feaList?.length>0))return;const n=i._getEventPosition(e);if(!n)return;const s=i._findFeaturesAt(n);if(s.length===0)return;const a=s[0].feature;switch(t){case"click":this._handleClickEvent(a,e);break;case"mousemove":case"mouseenter":case"mouseleave":case"mouseover":case"mouseout":case"touchmove":this.handleMoveEvent(a,e);break;default:if(a){this._fireFeatureEvent(a,t,e);const c=a.getLayer();c&&c.trigger("feature"+t,{feature:a,domEvent:e,type:"feature"+t})}}}_handleClickEvent(e,t){if(!e)return;this._fireFeatureEvent(e,"click",t);const i=e.getLayer();i&&i.trigger("featureclick",{feature:e,domEvent:t,type:"featureclick"})}handleMoveEvent(e,t){if(!e)return;this._fireFeatureEvent(e,t.type,t);const i=e.getLayer();i&&i.trigger("feature"+t.type,{feature:e,domEvent:t,type:"feature"+t.type})}_fireFeatureEvent(e,t,i){const n=this.target;if(!n||!n.tilemap||!n.viewer)return;let s=i,a,c;if("touches"in i){const f=i.touches[0]||i.changedTouches[0];if(!f)return;s={currentTarget:i.currentTarget,clientX:f.clientX,clientY:f.clientY},a=f.screenX,c=f.screenY}else{const f=i;s=f,a=f.screenX,c=f.screenY}const h=sa(s,n.tilemap,n.viewer.camera);if(!h)return;const d=[h.x,h.y,h.z],m={target:e,originEvent:i,coordinate:d,eventName:t,screenXY:{X:a,Y:c}};e.trigger(t,m)}_shouldIgnoreEvent(e){const t=this.target;return t.viewer?e==="mousedown"||e==="touchstart"?!1:!!t.isInteracting:!0}}Pn.mergeOptions({FeatureEvents:!0,onlyVisibleFeatureEvents:!0}),Pn.addOnLoadHook("addHandler","FeatureEvents",Mv);var Sv=Object.defineProperty,Lv=(r,e,t)=>e in r?Sv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,bi=(r,e,t)=>Lv(r,typeof e!="symbol"?e+"":e,t);let Pv=class{constructor(...e){}};const Zh=class mr extends Yi(xn(Pv)){constructor(e={}){super(e),bi(this,"_owner"),bi(this,"_map"),bi(this,"_worldPosition"),bi(this,"_coordinate"),bi(this,"_dom"),bi(this,"_visible",!1),bi(this,"_boundMapHandlers",new Map),bi(this,"_viewerUpdateHandler"),bi(this,"_positionedOnce",!1)}_getClassName(){return"UIComponent"}getOffset(){return{x:this.options.dx??0,y:this.options.dy??0}}addTo(e){if(!e)return this;this._owner=e;const t=typeof e.getMap=="function"?e.getMap():e;return t?(this._map=t,this._bindMapEvents(!0),this.options.single&&(mr._singletons.forEach(i=>{i!==this&&i.options.single&&i._map===t&&i.hide()}),mr._singletons.add(this)),this.onAdd&&this.onAdd(),this.trigger("add",{owner:e,map:t}),this):this}remove(){const e=this._map;return this.hideDom(),this._bindMapEvents(!1),this.options.single&&mr._singletons.delete(this),this.onRemove&&this.onRemove(),this.trigger("remove",{owner:this._owner,map:e}),this._owner=void 0,this._map=void 0,this}show(e){const t=this._map??(this._owner&&typeof this._owner.getMap=="function"?this._owner.getMap():void 0);if(!t)return this;if(this._map=t,this.options.single&&(mr._singletons.forEach(i=>{i!==this&&i.options.single&&i._map===t&&i.isVisible()&&i.hide()}),mr._singletons.add(this)),!this._dom){const i=this.buildOn();this._dom=i,i.style.position="absolute",typeof this.options.zIndex=="number"&&(i.style.zIndex=String(this.options.zIndex));const n=t.getContainer();if(!n)return this;n.appendChild(i)}return this._coordinate=e?[...e]:void 0,this._visible=!0,this._positionedOnce=!1,this._dom&&(this._dom.style.display="none"),this.trigger("show",{owner:this._owner,map:t}),this}hide(){return this._visible=!1,this._dom&&(this._dom.style.display="none"),this._coordinate=void 0,this.trigger("hide",{owner:this._owner,map:this._map}),this}hideDom(){return this._dom&&this._dom.parentElement&&(this._dom.parentElement.removeChild(this._dom),this.onDomRemove&&this.onDomRemove()),this._dom=void 0,this._visible=!1,this._coordinate=void 0,this}getMap(){return this._map}isVisible(){return this._visible}_bindMapEvents(e){const t=this._map;if(!t)return;const i=t,n=e?"on":"off",s=(a,c)=>{e?this._boundMapHandlers.set(a,c):this._boundMapHandlers.delete(a)};if(e){const a=()=>{this._visible&&this._updatePosition()};i[n]("control-change",a),s("control-change",a);const c=t.viewer;if(c&&!this._viewerUpdateHandler){const h=()=>{this._visible&&this._updatePosition()};this._viewerUpdateHandler=h,c.addEventListener("update",h)}}else{this._boundMapHandlers.forEach((c,h)=>{i[n](h,c)}),this._boundMapHandlers.clear();const a=t.viewer;a&&this._viewerUpdateHandler&&(a.removeEventListener("update",this._viewerUpdateHandler),this._viewerUpdateHandler=void 0)}}_resolveWorldPosition(){const e=this._map;if(!e)return;if(this._coordinate){const[i,n,s=0]=this._coordinate,a=new p.Vector3(i,n,s);return e.geo2world(a)}const t=this._owner;if(t&&t._geometry){const i=t._geometry;if(i&&(i.type==="Point"||i.type==="MultiPoint")){let n;if(i.type==="Point"?n=i.coordinates:i.type==="MultiPoint"&&Array.isArray(i.coordinates)&&i.coordinates.length>0&&(n=i.coordinates[0]),n&&n.length>=2){const s=new p.Vector3(n[0],n[1],n[2]??0);return e.geo2world(s)}}if(t._threeGeometry&&typeof t._threeGeometry.getWorldPosition=="function"){const n=new p.Vector3;if(t._threeGeometry.getWorldPosition(n),!(n.x===0&&n.y===0&&n.z===0))return n}if(t._position instanceof p.Vector3){const n=t._position;if(!(n.x===0&&n.y===0&&n.z===0))return n.clone()}}if(t&&typeof t.getWorldPosition=="function"){const i=new p.Vector3;return t.getWorldPosition(i),i}return e.prjcenter?.clone?.()??void 0}_updatePosition(){if(!this._dom||!this._map)return;if(this._visible){const h=this._resolveWorldPosition();if(!h){this._dom.style.display="none";return}this._worldPosition=h}if(!this._worldPosition)return;const e=this._map.viewer,t=e.camera,i=this._dom.style.display==="none";i&&(this._dom.style.visibility="hidden",this._dom.style.display=""),t.updateMatrixWorld();const n=this._worldPosition.clone().project(t);if(n.x<-1.1||n.x>1.1||n.y<-1.1||n.y>1.1||n.z<-1||n.z>1){this._dom.style.display="none",i&&(this._dom.style.visibility="");return}const s=(n.x*.5+.5)*e.width,a=(-n.y*.5+.5)*e.height,c=this.getOffset();if(this._dom.style.left=`${s+c.x}px`,this._dom.style.top=`${a+c.y}px`,i&&(this._dom.style.visibility=""),!this._positionedOnce){this._positionedOnce=!0,this._dom.style.display="none";return}this._dom.style.display=""}};bi(Zh,"_singletons",new Set);let xa=Zh;var Cv=Object.defineProperty,Tv=(r,e,t)=>e in r?Cv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Vh=(r,e,t)=>Tv(r,typeof e!="symbol"?e+"":e,t);class Ma extends xa{constructor(e){super({single:!0,...e}),Vh(this,"_titleEl"),Vh(this,"_contentEl")}_getClassName(){return"InfoWindow"}buildOn(){if(this.options.custom){let c;this.options.content instanceof HTMLElement?c=this.options.content:(c=document.createElement("div"),typeof this.options.content=="string"&&(c.innerHTML=this.options.content));const h=this.options.containerClass;return h&&(Array.isArray(h)?h:[h]).forEach(m=>{c.classList.add(m)}),this.options.minWidth&&(c.style.minWidth=`${this.options.minWidth}px`),this.options.minHeight&&(c.style.minHeight=`${this.options.minHeight}px`),this._titleEl=void 0,this._contentEl=c,c}const e=document.createElement("div");e.className="terra-infowindow";const t=this.options.containerClass;t&&(Array.isArray(t)?t:[t]).forEach(h=>{e.classList.add(h)}),typeof this.options.zIndex=="number"&&(e.style.zIndex=String(this.options.zIndex)),this.options.minWidth&&(e.style.minWidth=`${this.options.minWidth}px`),this.options.minHeight&&(e.style.minHeight=`${this.options.minHeight}px`);const i=document.createElement("div");i.className="terra-infowindow-header";const n=document.createElement("div");n.className="terra-infowindow-title",this.options.title&&(n.innerText=this.options.title);const s=document.createElement("span");s.className="terra-infowindow-close",s.innerHTML="×",s.title="关闭",s.addEventListener("click",c=>{c.stopPropagation(),c.preventDefault(),this.close()}),s.addEventListener("mousedown",c=>{c.preventDefault()}),s.style.cursor="pointer",s.style.userSelect="none",i.appendChild(n),i.appendChild(s);const a=document.createElement("div");return a.className="terra-infowindow-content",this.options.content instanceof HTMLElement?a.appendChild(this.options.content):typeof this.options.content=="string"&&(a.innerHTML=this.options.content),e.appendChild(i),e.appendChild(a),this._titleEl=n,this._contentEl=a,e}getOffset(){const e=super.getOffset(),t=this._dom;if(!t)return e;const i=t.offsetWidth,n=t.offsetHeight,s=10;let a=e.x-i/2,c=e.y-n-s;const h=this._owner,d=this.getMap();if(h&&typeof h.getStyle=="function"&&d?.viewer){const f=h.getStyle?.()?.config,g=f?.type;if(f&&(g==="icon-point"||g==="icon-label-point")){const _=Array.isArray(f.anchor)?f.anchor:[.5,.5],w=typeof _[1]=="number"?_[1]:.5;let b=0;const x=h._threeGeometry;if(x&&x instanceof p.Sprite&&(b=this._getSpriteScreenHeight(x,d.viewer)),b<=0){let L=0;if(g==="icon-point"){const M=f.size;Array.isArray(M)?L=M[1]:typeof M=="number"&&(L=M)}else if(g==="icon-label-point"){const M=f.size??f.iconSize;Array.isArray(M)?L=M[1]:typeof M=="number"&&(L=M)}b=L*(1-w)}else b=b*(1-w);b>0&&(c-=b)}}return{x:a,y:c}}_getSpriteScreenHeight(e,t){try{const i=t.camera,n=t.renderer;if(!i||!n)return 0;const s=t.height||n.domElement.clientHeight;if(!(e.material.sizeAttenuation!==!1)){const D=i.projectionMatrix.elements[5];return e.scale.y*D*s/2}const h=new p.Vector3;e.getWorldPosition(h);const d=i.position.clone(),m=h.clone().sub(d).normalize(),f=new p.Vector3;f.crossVectors(i.up,m).normalize();const g=new p.Vector3;g.crossVectors(m,f).normalize();const _=e.scale.y*(1-e.center.y),w=e.scale.y*e.center.y,b=h.clone().add(g.clone().multiplyScalar(_)),x=h.clone().sub(g.clone().multiplyScalar(w)),L=b.clone().project(i),M=x.clone().project(i),C=(-L.y*.5+.5)*s,W=(-M.y*.5+.5)*s;return Math.abs(W-C)}catch(i){return console.warn("Failed to calculate sprite screen height: // 计算 sprite 屏幕高度失败:",i),0}}setTitle(e){return this.options.title=e,this._titleEl&&(this._titleEl.innerText=e??""),this}setContent(e){return this.options.content=e,this._contentEl?(this._contentEl.innerHTML="",e instanceof HTMLElement?this._contentEl.appendChild(e):this._contentEl.innerHTML=e,this):this}open(e){super.show(e);const t=this,i=()=>{!t._dom||!t._map||!t._visible||(t._positionedOnce=!0,t._updatePosition())},s=this.getMap()?.viewer;if(s&&typeof s.addEventListener=="function"){const a=()=>{s.removeEventListener("update",a),i()};s.addEventListener("update",a)}else requestAnimationFrame(i);return this}close(){return this.hide()}}dt.include({setInfoWindow(r){this.removeInfoWindow();let e;return r instanceof Ma?e=r:e=new Ma(r),this._infoWindow=e,this.getMap()&&e.addTo(this),this},getInfoWindow(){return this._infoWindow},openInfoWindow(r){const e=this._infoWindow;return e?(e.getMap()||this.getMap()&&e.addTo(this),requestAnimationFrame(()=>{e.open(r)}),this):this},closeInfoWindow(){return this._infoWindow&&this._infoWindow.close(),this},removeInfoWindow(){return this._infoWindow&&(this._infoWindow.remove(),this._infoWindow=void 0),this}});var Gv=Object.defineProperty,Wv=(r,e,t)=>e in r?Gv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Sa=(r,e,t)=>Wv(r,typeof e!="symbol"?e+"":e,t);class Zv{constructor(...e){}}class Ih extends Yi(xn(Zv)){constructor(e={}){super(e),Sa(this,"_map"),Sa(this,"_enabled",!1),Sa(this,"_boundHandlers",new Map)}addTo(e){if(!e)return this;const t=e;return t._activeMapTool&&t._activeMapTool!==this&&t._activeMapTool.disable(),t._activeMapTool=this,this._map=e,this.onAdd&&this.onAdd(),this.enable(),this.trigger("add",{map:e}),this}getMap(){return this._map}enable(){return!this._map||this._enabled?this:(this._enabled=!0,this._bindEvents(),this.onEnable&&this.onEnable(),this.trigger("enable",{map:this._map}),this)}disable(){return!this._map||!this._enabled?this:(this._enabled=!1,this._unbindEvents(),this.onDisable&&this.onDisable(),this.trigger("disable",{map:this._map}),this)}isEnabled(){return!!this._enabled}remove(){if(!this._map)return this;this.disable();const e=this._map;return e._activeMapTool===this&&delete e._activeMapTool,this._map=void 0,this.trigger("remove"),this}_bindEvents(){const e=this._map;if(!e)return;const t=this.getEvents()||{};Object.keys(t).forEach(i=>{const n=t[i];if(!n)return;const s=a=>n.call(this,a);this._boundHandlers.set(i,s),e.on(i,s)})}_unbindEvents(){const e=this._map;e&&(this._boundHandlers.forEach((t,i)=>{e.off(i,t)}),this._boundHandlers.clear())}}var Vv=Object.defineProperty,Iv=(r,e,t)=>e in r?Vv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Fr=(r,e,t)=>Iv(r,typeof e!="symbol"?e+"":e,t);class Av extends ji{constructor(e){super(e,{altitude:1})}validateFeature(e){return!!e}}const Ah={};class Qn extends Ih{constructor(e){super(e),Fr(this,"_modeDef"),Fr(this,"_clickCoords",[]),Fr(this,"_isDrawing",!1),Fr(this,"_geometry"),Fr(this,"_draftLayer"),this.options.once=this.options.once??!1,this._ensureMode()}static registerMode(e,t){Ah[e.toLowerCase()]=t}static getModeDefinition(e){return Ah[e.toLowerCase()]}getMode(){return(this.options.mode||"").toLowerCase()}setMode(e){return this._finishDrawingSilently(),this.options.mode=e,this._ensureMode(),this}setStyle(e){return e.geometryStyle!==void 0&&(this.options.geometryStyle=e.geometryStyle),Object.prototype.hasOwnProperty.call(e,"vertexStyle")&&(this.options.vertexStyle=e.vertexStyle??null),this}getEvents(){return{click:this._handleClick.bind(this),mousemove:this._handleMouseMove.bind(this),dblclick:this._handleDblClick.bind(this)}}onEnable(){this._ensureMode()}onDisable(){this._finishDrawingSilently(),this._destroyDraftLayer()}_ensureMode(){const e=this.getMode(),t=Qn.getModeDefinition(e);if(!t)throw new Error(`DrawTool: mode "${e}" 未注册,请先调用 DrawTool.registerMode`);this._modeDef=t}_handleClick(e){if(!this._modeDef||!e.coordinate)return;const t=e.coordinate,i=this._modeDef,n={...e,drawTool:this};this._isDrawing?(this._clickCoords.push(t),i.update(this._clickCoords,this._geometry,n),this.trigger("drawvertex",{coordinate:t,geometry:this._geometry,coords:[...this._clickCoords],originEvent:n})):(this._isDrawing=!0,this._clickCoords=[t],this._geometry=i.create(t,n),this.trigger("drawstart",{coordinate:t,geometry:this._geometry,coords:[...this._clickCoords],originEvent:n})),i.clickLimit&&this._clickCoords.length>=i.clickLimit&&this._finishDrawing(n)}_handleMouseMove(e){if(!this._modeDef||!this._isDrawing||!e.coordinate)return;const t=this._modeDef,i=[...this._clickCoords,e.coordinate],n={...e,drawTool:this};t.update(i,this._geometry,n),this.trigger("drawing",{coordinate:e.coordinate,geometry:this._geometry,coords:i,originEvent:n})}_handleDblClick(e){if(!this._modeDef||!this._isDrawing)return;const t={...e,drawTool:this};this._finishDrawing(t)}_finishDrawing(e){if(!this._modeDef||!this._isDrawing)return;const i=this._modeDef.generate(this._geometry,[...this._clickCoords]);this.trigger("drawend",{geometry:i,coords:[...this._clickCoords],originEvent:e}),this._isDrawing=!1,this._clickCoords=[],this._geometry=void 0,this.options.once&&this.disable()}_finishDrawingSilently(){this._isDrawing=!1,this._clickCoords=[],this._geometry=void 0}_getOrCreateDraftLayer(){if(this._draftLayer)return this._draftLayer;const e=this.getMap();if(!e)throw new Error("DrawTool: 尚未绑定地图,请先调用 addTo(map)");const t=`__draw_draft_${Date.now().toString(36)}`,i=new Av(t);return e.addLayer(i),this._draftLayer=i,i}_destroyDraftLayer(){const e=this.getMap();e&&this._draftLayer&&e.removeLayer(this._draftLayer.getId()),this._draftLayer=void 0}}const Fv={actions:["click","mousemove"],create(r,e){const t=e.drawTool,i=t._getOrCreateDraftLayer(),n=en(t.options.geometryStyle,{type:"basic-point",size:10,color:"#00ffff"}),s={type:"Point",coordinates:r},a=new Ti({geometry:s,style:n});return a.addTo(i),a.initializeGeometry(),{tool:t,draftLayer:i,draftMarker:a}},update(r,e,t){const i=e?.draftMarker;if(!i)return;const n=r[r.length-1];i._geometry={type:"Point",coordinates:n},i._position=i._coordsTransform(),i._toThreeJSGeometry&&i._toThreeJSGeometry()},generate(r,e){const t=r.tool;if(!e.length)return null;r.draftMarker&&(r.draftMarker._remove(),r.draftMarker=null);const i=en(t.options.geometryStyle,{type:"basic-point",size:10,color:"#00ffff"}),n=e[e.length-1];return new Ti({geometry:{type:"Point",coordinates:n},style:i})},clickLimit:1},Ov={actions:["click","mousemove","dblclick"],create(r,e){const t=e.drawTool,i=t._getOrCreateDraftLayer(),n=en(t.options.geometryStyle,{type:"basic-line",color:"#ff0000",width:2}),s=t.options.vertexStyle===null?void 0:en(t.options.vertexStyle,{type:"basic-point",size:8,color:"#00ffff"}),a={type:"LineString",coordinates:[r]},c=new Lt({geometry:a,style:n});c.addTo(i);const h=[];if(s){const d={type:"Point",coordinates:r},m=new Ti({geometry:d,style:s});m.addTo(i),h.push(m)}return{tool:t,draftLayer:i,draftLine:c,draftAnchors:h,lineStyle:n,vertexStyle:s}},update(r,e,t){if(!e)return;const i=e.draftLayer;if(!r||r.length<2)return;e.draftLine&&(e.draftLine._remove(),e.draftLine=null);const n={type:"LineString",coordinates:r},s=new Lt({geometry:n,style:e.lineStyle});if(s.addTo(i),e.draftLine=s,t.eventName==="click"&&e.vertexStyle){const c={type:"Point",coordinates:r[r.length-1]},h=new Ti({geometry:c,style:e.vertexStyle});h.addTo(i),e.draftAnchors.push(h)}},generate(r,e){const t=r.tool;if(!e.length)return null;if(r.draftLine&&(r.draftLine._remove(),r.draftLine=null),Array.isArray(r.draftAnchors)){for(const s of r.draftAnchors)s?._remove();r.draftAnchors=[]}const i=en(t.options.geometryStyle,{type:"basic-line",color:"#ff0000",width:2});return new Lt({geometry:{type:"LineString",coordinates:e},style:i})}},zv={actions:["click","mousemove","dblclick"],create(r,e){const t=e.drawTool,i=t._getOrCreateDraftLayer(),n=en(t.options.geometryStyle,{type:"basic-polygon",color:"#00ff00",opacity:.5}),s=t.options.vertexStyle===null?void 0:en(t.options.vertexStyle,{type:"basic-point",size:8,color:"#00ffff"}),a=[];if(s){const c={type:"Point",coordinates:r},h=new Ti({geometry:c,style:s});h.addTo(i),h.initializeGeometry(),a.push(h)}return{tool:t,draftLayer:i,draftPolygon:null,draftEdgeLine:null,draftAnchors:a,polygonStyle:n,vertexStyle:s}},update(r,e,t){if(!e)return;const i=e.draftLayer;if(t.eventName==="click"&&e.vertexStyle){const m={type:"Point",coordinates:r[r.length-1]},f=new Ti({geometry:m,style:e.vertexStyle});f.addTo(i),f.initializeGeometry(),e.draftAnchors.push(f)}if(!r||r.length<2){e.draftEdgeLine&&(e.draftEdgeLine._remove(),e.draftEdgeLine=null),e.draftPolygon&&(e.draftPolygon._remove(),e.draftPolygon=null);return}if(r.length===2){e.draftPolygon&&(e.draftPolygon._remove(),e.draftPolygon=null),e.draftEdgeLine&&(e.draftEdgeLine._remove(),e.draftEdgeLine=null);const d={type:"LineString",coordinates:r},m=e.polygonStyle?.config&&e.polygonStyle.config.color||"#00ff00",f=new St({type:"basic-line",color:m,width:2}),g=new Lt({geometry:d,style:f});g.addTo(i),e.draftEdgeLine=g;return}e.draftEdgeLine&&(e.draftEdgeLine._remove(),e.draftEdgeLine=null);const n=r.slice(),s=n[0],a=n[n.length-1];(s[0]!==a[0]||s[1]!==a[1]||(s[2]||0)!==(a[2]||0))&&n.push(s),e.draftPolygon&&(e.draftPolygon._remove(),e.draftPolygon=null);const c={type:"Polygon",coordinates:[n]},h=new wi({geometry:c,style:e.polygonStyle});h.addTo(i),e.draftPolygon=h},generate(r,e){const t=r.tool;if(e.length<3)return null;if(r.draftPolygon&&(r.draftPolygon._remove(),r.draftPolygon=null),r.draftEdgeLine&&(r.draftEdgeLine._remove(),r.draftEdgeLine=null),Array.isArray(r.draftAnchors)){for(const h of r.draftAnchors)h?._remove();r.draftAnchors=[]}const i=en(t.options.geometryStyle,{type:"basic-polygon",color:"#00ff00",opacity:.5}),n=e.slice(),s=n[0],a=n[n.length-1];return(s[0]!==a[0]||s[1]!==a[1]||(s[2]||0)!==(a[2]||0))&&n.push(s),new wi({geometry:{type:"Polygon",coordinates:[n]},style:i})}};Qn.registerMode("point",Fv),Qn.registerMode("line",Ov),Qn.registerMode("polygon",zv);function en(r,e){return St.create(r||e)}var Dv=Object.defineProperty,Xv=(r,e,t)=>e in r?Dv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,oi=(r,e,t)=>Xv(r,typeof e!="symbol"?e+"":e,t);class kv extends si{constructor(e){if(super(e),oi(this,"dataType","image"),oi(this,"attribution","天地图"),oi(this,"token",""),oi(this,"style","img_w"),oi(this,"subdomains","01234"),oi(this,"url","https://t{s}.tianditu.gov.cn/DataServer?T={style}&x={x}&y={y}&l={z}&tk={token}"),Object.assign(this,e),!this.token)throw new Error("天地图访问令牌(token)是必填参数")}}class Uv extends si{constructor(e){if(super(e),oi(this,"dataType","quantized-mesh"),oi(this,"attribution","天地图"),oi(this,"token",""),oi(this,"subdomains","01234"),oi(this,"url","https://t{s}.tianditu.gov.cn/mapservice/swdx?T=elv_c&tk={token}&x={x}&y={y}&l={z}"),Object.assign(this,e),!this.token)throw new Error("天地图访问令牌(token)是必填参数")}}var Nv=Object.defineProperty,Kv=(r,e,t)=>e in r?Nv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Fh=(r,e,t)=>Kv(r,typeof e!="symbol"?e+"":e,t);class Bv extends si{constructor(e){super({...e,url:e.urlTemplate,isTMS:e.isTMS||!1}),Fh(this,"minLevel",2),Fh(this,"maxLevel",24)}getUrl(e,t,i){const n=this.isTMS?Math.pow(2,i)-1-t:t;return mm(this.url,{...this,x:e,y:n,z:i,tileMatrix:i,tileRow:n,tileCol:e})}}var Yv=Object.defineProperty,Rv=(r,e,t)=>e in r?Yv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Gi=(r,e,t)=>Rv(r,typeof e!="symbol"?e+"":e,t);class jv extends si{constructor(e){super(e),Gi(this,"dataType","image"),Gi(this,"attribution","ArcGIS"),Gi(this,"style","World_Imagery"),Gi(this,"url","https://services.arcgisonline.com/arcgis/rest/services/{style}/MapServer/tile/{z}/{y}/{x}"),Object.assign(this,e)}}class Jv extends si{constructor(e){super(e),Gi(this,"dataType","lerc"),Gi(this,"attribution","ArcGIS"),Gi(this,"minLevel",6),Gi(this,"maxLevel",13),Gi(this,"url","https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer/tile/{z}/{y}/{x}"),Object.assign(this,e)}}var Qv=Object.defineProperty,Hv=(r,e,t)=>e in r?Qv(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Hn=(r,e,t)=>Hv(r,typeof e!="symbol"?e+"":e,t);class $v extends si{constructor(e){if(super(e),Hn(this,"token",""),Hn(this,"format","webp"),Hn(this,"style","cm2myr6qx001t01pi0sf7estf"),Hn(this,"attribution","MapBox"),Hn(this,"maxLevel",25),Hn(this,"url","https://api.mapbox.com/styles/v1/criska/cm2myr6qx001t01pi0sf7estf/tiles/256/{z}/{x}/{y}?access_token={token}&format={format}"),Object.assign(this,e),!this.token)throw new Error("MapBox访问令牌(token)是必填参数")}}var Ev=Object.defineProperty,qv=(r,e,t)=>e in r?Ev(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Oh=(r,e,t)=>qv(r,typeof e!="symbol"?e+"":e,t);class ew extends si{constructor(e){super(e),Oh(this,"dataType","mvt"),Oh(this,"style",{layer:[]}),Object.assign(this,e)}}var tw=Object.defineProperty,iw=(r,e,t)=>e in r?tw(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Or=(r,e,t)=>iw(r,typeof e!="symbol"?e+"":e,t);class nw extends si{constructor(e){super(e),Or(this,"dataType","VectorTile"),Or(this,"attribution","ArcGIS"),Or(this,"minLevel",1),Or(this,"maxLevel",21),Or(this,"url","https://api.maptiler.com/tiles/v3/{z}/{x}/{y}.pbf?key=uKYsZQZpm72WlbSgH9B7"),Object.assign(this,e)}}class rw extends ji{constructor(e,t){super(e,t)}validateFeature(e){return e._baseType==="Line"}}class sw extends ji{constructor(e,t){super(e,t)}validateFeature(e){return e._baseType==="Point"}}class ow extends ji{constructor(e,t){super(e,t)}validateFeature(e){return e._baseType==="Surface"}}var aw=Object.defineProperty,lw=(r,e,t)=>e in r?aw(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,cw=(r,e,t)=>lw(r,e+"",t);class hw extends ji{constructor(e,t){super(e,t),cw(this,"_clouds",null);const i=["texture"];for(const n of i)wc(t,n);this._createClouds(t.texture)}async _createClouds(e){const t=await St._loadTexture(e),i=new dg({texture:t,material:p.MeshBasicMaterial});i.castShadow=!0,this._clouds=i}validateFeature(e){return e._type==="Cloud"}animate(e,t){this._clouds&&this._clouds.update(this.map.viewer.camera,t,e)}}var uw=Object.defineProperty,dw=(r,e,t)=>e in r?uw(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,zh=(r,e,t)=>dw(r,typeof e!="symbol"?e+"":e,t);class fw extends xa{constructor(e){super({single:!1,...e}),zh(this,"_markerCoord"),zh(this,"_content"),this._markerCoord=[...e.coordinate],this._content=e.content}_getClassName(){return"UIMarker"}buildOn(){const e=document.createElement("div"),{width:t,height:i}=this.options;typeof t=="number"&&(e.style.width=`${t}px`),typeof i=="number"&&(e.style.height=`${i}px`);const n=this.options.containerClass;n&&(Array.isArray(n)?n:[n]).forEach(c=>e.classList.add(c));const s=this._content;return typeof s=="function"?s(e):s instanceof HTMLElement?e.appendChild(s):typeof s=="string"&&(e.innerHTML=s),e}getOffset(){const e=super.getOffset(),t=this._dom;if(!t)return e;const i=t.offsetWidth,n=t.offsetHeight;return{x:e.x-i/2,y:e.y-n/2}}show(e){return e&&(this._markerCoord=[...e]),super.show(this._markerCoord)}setCoordinates(e){return this._markerCoord=[...e],this.isVisible()&&super.show(this._markerCoord),this}getCoordinates(){return[...this._markerCoord]}getCenter(){return this.getCoordinates()}getAltitude(){const e=this._markerCoord;return typeof e[2]=="number"?e[2]:typeof this.options.altitude=="number"?this.options.altitude:0}setAltitude(e){const t=[...this._markerCoord];return t[2]=e,this._markerCoord=t,this.isVisible()&&super.show(this._markerCoord),this}setContent(e){this._content=e,this.options.content=e;const t=this._dom;return t?(t.innerHTML="",typeof e=="function"?e(t):e instanceof HTMLElement?t.appendChild(e):typeof e=="string"&&(t.innerHTML=e),this):this}getContent(){return this._content}addTo(e){return super.addTo(e),this.options.visible!==!1&&this.show(this.options.coordinate),this}}var pw=Object.defineProperty,mw=(r,e,t)=>e in r?pw(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,He=(r,e,t)=>mw(r,typeof e!="symbol"?e+"":e,t);function gw(r){const e=new Date(r),t=e.getHours().toString().padStart(2,"0"),i=e.getMinutes().toString().padStart(2,"0"),n=e.getSeconds().toString().padStart(2,"0");return`${t}:${i}:${n}`}class yw extends Pr{constructor(e,t,i){super(e,i),He(this,"_trailLine",null),He(this,"_activeLine",null),He(this,"_marker",null),He(this,"_controlPointGroup",new p.Group),He(this,"_timeLabels",[]),He(this,"_points",[]),He(this,"_worldPoints",[]),He(this,"_timestamps",[]),He(this,"_totalDuration",0),He(this,"_state","idle"),He(this,"_currentTime",0),He(this,"_playbackSpeed",1),He(this,"_loop",!1),He(this,"_cameraMode","none"),He(this,"_cameraConfig",{mode:"none"}),He(this,"_prevControlsEnabled",!0),He(this,"_options"),He(this,"_gifStates",[]),this._options=i||{},this._playbackSpeed=i?.speed??1,this._loop=i?.loop??!1,i?.cameraFollow&&(this._cameraConfig={...i.cameraFollow},this._cameraMode=i.cameraFollow.mode),this.add(this._controlPointGroup),t&&t.points.length>0&&this._setDataInternal(t)}_bindMap(e){super._bindMap(e),this._points.length>0&&e&&this._buildAll().catch(t=>console.error("TrajectoryLayer build error:",t))}setData(e){this._disposeAll(),this._setDataInternal(e),this.map&&this._buildAll().catch(t=>console.error("TrajectoryLayer build error:",t))}_setDataInternal(e){this._points=[...e.points].sort((t,i)=>t.timestamp-i.timestamp),this._timestamps=this._points.map(t=>t.timestamp),e.duration!==void 0?this._totalDuration=e.duration:this._points.length>=2?this._totalDuration=this._timestamps[this._timestamps.length-1]-this._timestamps[0]:this._totalDuration=0,this._currentTime=0,this._state="idle"}play(){if(!(this._points.length<2)&&(this._state==="idle"&&this._currentTime>=this._totalDuration&&(this._currentTime=0),this._state="playing",this._cameraMode!=="none")){const e=this.getMap()?.viewer;e&&(e.controls.enabled=!1)}}pause(){if(this._state==="playing"&&(this._state="paused",this._cameraMode!=="none")){const e=this.getMap()?.viewer;e&&(e.controls.enabled=this._prevControlsEnabled)}}stop(){if(this._state="idle",this._currentTime=0,this._marker&&(this._marker.visible=!1),this._activeLine&&(this._activeLine.visible=!1),this._cameraMode!=="none"){const t=this.getMap()?.viewer;t&&(t.controls.enabled=this._prevControlsEnabled),this._cameraMode="none",this._cameraConfig={mode:"none"}}}seekTo(e){this._currentTime=Math.max(0,Math.min(e,this._totalDuration)),this._updateVisuals()}setSpeed(e){this._playbackSpeed=Math.max(.1,e)}setLoop(e){this._loop=e}setShowControlPoints(e){this._controlPointGroup.visible=e}setShowTimeLabels(e){for(const t of this._timeLabels)if(e){const i=this.getMap();i&&t.addTo(i)}else t.hide()}setCameraMode(e,t){const i=this._cameraMode;this._cameraMode=e;const n={"first-person":{distance:15,polarAngle:80,smoothing:.08},"third-person":{distance:500,polarAngle:5,smoothing:.08},none:{}};this._cameraConfig={...n[e],mode:e,...t};const a=this.getMap()?.viewer;a&&(i!=="none"&&e==="none"?a.controls.enabled=this._prevControlsEnabled:i==="none"&&e!=="none"&&(this._prevControlsEnabled=a.controls.enabled,a.controls.enabled=!1))}getCurrentTime(){return this._currentTime}getDuration(){return this._totalDuration}getPlaybackState(){return this._state}getSpeed(){return this._playbackSpeed}animate(e,t,i){this._updateGifTextures(),this._state==="playing"&&(this._points.length<2||(this._currentTime+=e*1e3*this._playbackSpeed,this._currentTime>=this._totalDuration&&(this._loop?this._currentTime=this._currentTime%this._totalDuration:(this._currentTime=this._totalDuration,this._state="idle",this._emitEvent("playback-end"))),this._updateVisuals(),this._updateCamera(i)))}async _buildAll(){const e=this.getMap();if(e){this._worldPoints=this._transformCoordinates(e),console.log("TrajectoryLayer: worldPoints count =",this._worldPoints.length),this._buildTrailLine(),this._buildActiveLine();try{await this._buildMarker()}catch(t){console.error("TrajectoryLayer: _buildMarker failed:",t)}try{await this._buildControlPoints()}catch(t){console.error("TrajectoryLayer: _buildControlPoints failed:",t)}this._buildTimeLabels(),this._updateTrailLine()}}_transformCoordinates(e){const t=e.prjcenter;return this._points.map(i=>{const n=new p.Vector3(i.coordinate[0],i.coordinate[1],i.coordinate[2]||0);return e.geo2world(n).sub(t)})}_buildTrailLine(){if(this._worldPoints.length<2)return;const e=this._options.trailStyle||{},t=new Ni;t.setPositions([0,0,0,0,0,0]);const i=new vn({color:new p.Color(e.color??"#4a90d9").getHex(),linewidth:e.width??2,transparent:!0,opacity:e.opacity??.5,resolution:new p.Vector2(window.innerWidth,window.innerHeight),depthTest:!0,depthWrite:!0}),n=()=>i.resolution.set(window.innerWidth,window.innerHeight);window.addEventListener("resize",n),i.__resizeHandler=n,this._trailLine=new bn(t,i),this._trailLine.computeLineDistances(),this._trailLine.position.copy(this.map.prjcenter),this.add(this._trailLine)}_buildActiveLine(){const e=this._options.activeTrailStyle||{},t=new Ni;t.setPositions([0,0,0,0,0,0]);const i=new vn({color:new p.Color(e.color??"#ff4444").getHex(),linewidth:e.width??3,transparent:!0,opacity:e.opacity??1,resolution:new p.Vector2(window.innerWidth,window.innerHeight),depthTest:!0,depthWrite:!0}),n=()=>i.resolution.set(window.innerWidth,window.innerHeight);window.addEventListener("resize",n),i.__resizeHandler=n,this._activeLine=new bn(t,i),this._activeLine.computeLineDistances(),this._activeLine.position.copy(this.map.prjcenter),this._activeLine.visible=!1,this.add(this._activeLine)}async _buildMarker(){const e=this._options.markerStyle||{},t=this.map.prjcenter;if(e.type==="icon"&&e.url){const i=await new Promise((h,d)=>{new p.TextureLoader().load(e.url,m=>h(m),void 0,m=>d(m))});i.colorSpace=p.SRGBColorSpace,i.needsUpdate=!0;const n=e.size??32,s=new p.SpriteMaterial({map:i,transparent:!0,depthTest:!1,depthWrite:!1,sizeAttenuation:!1}),a=new p.Sprite(s);a.scale.set(n,n,1),a.renderOrder=999;const c=e.anchor??[.5,.5];a.center.set(c[0],c[1]),this._marker=a,console.log("TrajectoryLayer: marker sprite created manually",{texWidth:i.image?.width,texHeight:i.image?.height,spriteScale:`(${a.scale.x}, ${a.scale.y}, ${a.scale.z})`})}else this._marker=Sn({color:e.color??"#ff0000",size:e.size??16,sizeAttenuation:!1},new p.Vector3(0,0,0));this._worldPoints.length>0&&this._marker.position.copy(this._worldPoints[0]),this._marker.position.add(t),this._marker.visible=!1,this.add(this._marker)}async _buildControlPoints(){if(!this._options.showControlPoints)return;const e=this._options.controlPointStyle||{},t=e.type??"point",i=this.map.prjcenter;for(;this._controlPointGroup.children.length>0;){const n=this._controlPointGroup.children[0];this._controlPointGroup.remove(n),n.traverse(s=>{"geometry"in s&&s.geometry&&s.geometry.dispose(),"material"in s&&s.material&&(Array.isArray(s.material)?s.material:[s.material]).forEach(c=>c.dispose())})}this._controlPointGroup.position.copy(i);for(let n=0;n<this._worldPoints.length;n++){const s=this._worldPoints[n].clone();let a;if(t==="icon"&&e.url)try{const c=await Dc({type:"icon-point",url:e.url,size:e.size??24,color:"#ffffff",sizeAttenuation:!0},s);if(c.material.map){const d=e.anchor??[.5,.5];c.center.set(d[0],d[1]),a=c}else console.warn("TrajectoryLayer: icon texture failed, fallback to basic point:",e.url),a=Sn({type:"basic-point",color:e.color??"#00ff00",size:e.size??12,sizeAttenuation:!1},s)}catch(c){console.warn("TrajectoryLayer: _createIconPoint error, fallback to basic point:",c),a=Sn({color:e.color??"#00ff00",size:e.size??12,sizeAttenuation:!1},s)}else t==="gif"&&e.url?a=await this._createGifControlPoint(e.url,s,e.size??32):a=Sn({color:e.color??"#00ff00",size:e.size??12,sizeAttenuation:!1},s);this._controlPointGroup.add(a)}}async _createGifControlPoint(e,t,i){return new Promise(n=>{const s=new Image;s.crossOrigin="anonymous",s.onload=()=>{const a=document.createElement("canvas");a.width=s.naturalWidth||s.width,a.height=s.naturalHeight||s.height;const c=a.getContext("2d");c.drawImage(s,0,0);const h=new p.CanvasTexture(a);h.colorSpace=p.SRGBColorSpace,h.needsUpdate=!0;const d=new p.SpriteMaterial({map:h,transparent:!0,sizeAttenuation:!0}),m=new p.Sprite(d),f=.002;m.scale.set(i*f,i*f,1),m.position.copy(t),this._gifStates.push({canvas:a,ctx:c,img:s,texture:h,lastFrameTime:performance.now(),frameIndex:0,loaded:!0}),n(m)},s.onerror=()=>{const a=Sn({color:"#ff0000",size:12,sizeAttenuation:!0},t);n(a)},s.src=e})}_updateGifTextures(){if(this._gifStates.length===0)return;const e=performance.now();for(const t of this._gifStates)t.loaded&&e-t.lastFrameTime>33&&(t.ctx.clearRect(0,0,t.canvas.width,t.canvas.height),t.ctx.drawImage(t.img,0,0),t.texture.needsUpdate=!0,t.lastFrameTime=e)}_buildTimeLabels(){if(!this._options.showTimeLabels)return;const e=this.getMap();if(!e)return;const t=this._options.timeFormat??gw,i=this._options.timeLabelContent;this._disposeTimeLabels();for(let n=0;n<this._points.length;n++){const s=this._points[n],a=i?i(s.timestamp):`<div style="
|
|
1191
1191
|
background: rgba(0,0,0,0.7);
|
|
1192
1192
|
color: #fff;
|
|
1193
1193
|
padding: 2px 6px;
|