@aibee/crc-bmap 0.0.114 → 0.0.116

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/lib/bmap.esm.js CHANGED
@@ -454,7 +454,7 @@ var require_Graph = __commonJS({
454
454
  });
455
455
 
456
456
  // src/bmap.ts
457
- import { EventDispatcher as EventDispatcher7, Vector3 as Vector314 } from "three";
457
+ import { EventDispatcher as EventDispatcher7, Vector3 as Vector318 } from "three";
458
458
 
459
459
  // src/utils/timer.ts
460
460
  var Timer = class {
@@ -527,11 +527,14 @@ import {
527
527
  DirectionalLight,
528
528
  AmbientLight,
529
529
  Path,
530
- Vector2
530
+ Vector2,
531
+ AxesHelper
531
532
  } from "three";
532
533
  import { MapControls } from "three/examples/jsm/controls/MapControls";
533
534
  function initScene() {
534
535
  const scene = new Scene();
536
+ const axes = new AxesHelper(1e3);
537
+ scene.add(axes);
535
538
  scene.background = new Color(16777215);
536
539
  return scene;
537
540
  }
@@ -1619,10 +1622,10 @@ function toWebWorker(obj) {
1619
1622
  import {
1620
1623
  EventDispatcher as EventDispatcher6,
1621
1624
  Box2,
1622
- Vector3 as Vector313,
1623
- Vector2 as Vector25,
1625
+ Vector3 as Vector317,
1626
+ Vector2 as Vector26,
1624
1627
  Raycaster as Raycaster3,
1625
- Box3 as Box38,
1628
+ Box3 as Box39,
1626
1629
  Color as Color5,
1627
1630
  AmbientLight as AmbientLight2
1628
1631
  } from "three";
@@ -2613,20 +2616,141 @@ var Poi = class extends EventDispatcher2 {
2613
2616
  };
2614
2617
 
2615
2618
  // src/elements/floor.ts
2616
- import { Box3 as Box35, Group as Group2, Object3D as Object3D9, Vector3 as Vector38 } from "three";
2619
+ import { Box3 as Box35, Object3D as Object3D8, Vector3 as Vector38 } from "three";
2620
+
2621
+ // src/elements/heatmap.ts
2622
+ import {
2623
+ MeshBasicMaterial as MeshBasicMaterial2,
2624
+ Object3D as Object3D5,
2625
+ PlaneGeometry as PlaneGeometry2,
2626
+ Texture,
2627
+ DoubleSide as DoubleSide3,
2628
+ Mesh as Mesh3,
2629
+ Matrix3,
2630
+ Vector2 as Vector24
2631
+ } from "three";
2632
+ import { create } from "@mars3d/heatmap.js";
2633
+ import { featureCollection as featureCollection2, point as point2, bbox, center as getCenter2 } from "@turf/turf";
2634
+ var HeatmapElement = class extends Object3D5 {
2635
+ constructor(context) {
2636
+ super();
2637
+ this.context = context;
2638
+ this.div = document.createElement("div");
2639
+ }
2640
+ heatmap;
2641
+ div;
2642
+ plane;
2643
+ clearHeatmap() {
2644
+ if (this.div.firstChild) {
2645
+ this.div.removeChild(this.div.firstChild);
2646
+ }
2647
+ this.heatmap = void 0;
2648
+ }
2649
+ loadData(data) {
2650
+ this.clearHeatmap();
2651
+ const { width, height, leftTop, center: center2 } = this.getBox(data);
2652
+ this.heatmap = create({
2653
+ width,
2654
+ height,
2655
+ container: this.div,
2656
+ ...this.context.config.heatMap
2657
+ });
2658
+ this.heatmap.setData(this.transformData(data, leftTop));
2659
+ this.initPlane(width, height);
2660
+ this.position.set(center2[0], center2[1], this.position.z);
2661
+ }
2662
+ initPlane(width, height) {
2663
+ if (this.plane) {
2664
+ this.remove(this.plane);
2665
+ }
2666
+ const geometry = new PlaneGeometry2(width, height);
2667
+ const texture = new Texture(this.div.firstChild);
2668
+ texture.needsUpdate = true;
2669
+ const material = new MeshBasicMaterial2({
2670
+ transparent: true,
2671
+ side: DoubleSide3,
2672
+ map: texture
2673
+ });
2674
+ material.needsUpdate = true;
2675
+ this.plane = new Mesh3(geometry, material);
2676
+ this.add(this.plane);
2677
+ }
2678
+ getTransMatrix({ x, y }) {
2679
+ return new Matrix3().makeScale(1, -1).multiply(new Matrix3().makeTranslation(0 - x, 0 - y));
2680
+ }
2681
+ /**
2682
+ * 所有点的坐标减去左上角从00点开始画canvas
2683
+ * @param data
2684
+ * @param leftTop
2685
+ * @returns
2686
+ */
2687
+ transformData(data, leftTop) {
2688
+ const matrix = this.getTransMatrix(leftTop);
2689
+ const $data = data.data.map((item) => {
2690
+ const vector = new Vector24(item.x, item.y).applyMatrix3(matrix);
2691
+ return {
2692
+ x: vector.x,
2693
+ y: vector.y,
2694
+ value: item.value
2695
+ };
2696
+ });
2697
+ return {
2698
+ data: $data,
2699
+ max: data.max,
2700
+ min: data.min
2701
+ };
2702
+ }
2703
+ getBox(data) {
2704
+ const features = featureCollection2(data.data.map((item) => point2([item.x, item.y])));
2705
+ const box = bbox(features);
2706
+ const width = box[2] - box[0];
2707
+ const height = box[3] - box[1];
2708
+ const leftTop = { x: box[0], y: box[3] };
2709
+ const center2 = getCenter2(features);
2710
+ return { width, height, leftTop, center: center2.geometry.coordinates };
2711
+ }
2712
+ dispose() {
2713
+ this.div = null;
2714
+ this.heatmap = void 0;
2715
+ }
2716
+ };
2717
+
2718
+ // src/elements/model.ts
2719
+ import { Object3D as Object3D6, Vector3 as Vector36 } from "three";
2720
+ var Model = class extends Object3D6 {
2721
+ constructor(context, options) {
2722
+ super();
2723
+ this.context = context;
2724
+ this.options = options;
2725
+ this.position.copy(options.position || new Vector36(0, 0, 0));
2726
+ this.loadModel();
2727
+ }
2728
+ model = null;
2729
+ async loadModel() {
2730
+ const object = await loadModel(this.options.modelUrl);
2731
+ object.scene.rotation.set(Math.PI / 2, Math.PI / 2, 0);
2732
+ this.add(object.scene);
2733
+ this.model = object;
2734
+ }
2735
+ dispose() {
2736
+ dispose(this);
2737
+ this.model = null;
2738
+ }
2739
+ };
2617
2740
 
2618
2741
  // src/layer/graphic-layer.ts
2619
- import { Box3 as Box33, Vector3 as Vector36 } from "three";
2742
+ import { Box3 as Box34, Vector3 as Vector37 } from "three";
2620
2743
 
2621
2744
  // src/layer/layer.ts
2622
- import { Object3D as Object3D5 } from "three";
2623
- var Layer = class extends Object3D5 {
2745
+ import { Object3D as Object3D7 } from "three";
2746
+ var Layer = class extends Object3D7 {
2624
2747
  constructor(context) {
2625
2748
  super();
2626
2749
  this.context = context;
2627
2750
  }
2628
2751
  dispose() {
2629
2752
  dispose(this);
2753
+ this.children.forEach((item) => item.dispose?.());
2630
2754
  this.clear();
2631
2755
  }
2632
2756
  };
@@ -2638,8 +2762,8 @@ var GraphicLayer = class extends Layer {
2638
2762
  super(context);
2639
2763
  }
2640
2764
  getCenter() {
2641
- const box = new Box33().setFromObject(this);
2642
- return box.getCenter(new Vector36());
2765
+ const box = new Box34().setFromObject(this);
2766
+ return box.getCenter(new Vector37());
2643
2767
  }
2644
2768
  createGraphic(options) {
2645
2769
  const graphic = new Graphic(this.context, options);
@@ -2823,215 +2947,38 @@ var PoiLayer = class extends Layer {
2823
2947
  }
2824
2948
  };
2825
2949
 
2826
- // src/elements/heatmap.ts
2827
- import {
2828
- MeshBasicMaterial as MeshBasicMaterial2,
2829
- Object3D as Object3D6,
2830
- PlaneGeometry as PlaneGeometry2,
2831
- Texture,
2832
- DoubleSide as DoubleSide3,
2833
- Mesh as Mesh3,
2834
- Matrix3,
2835
- Vector2 as Vector24
2836
- } from "three";
2837
- import { create } from "@mars3d/heatmap.js";
2838
- import { featureCollection as featureCollection2, point as point2, bbox, center as getCenter2 } from "@turf/turf";
2839
- var HeatmapElement = class extends Object3D6 {
2840
- constructor(context) {
2841
- super();
2842
- this.context = context;
2843
- this.div = document.createElement("div");
2844
- }
2845
- heatmap;
2846
- div;
2847
- plane;
2848
- clearHeatmap() {
2849
- if (this.div.firstChild) {
2850
- this.div.removeChild(this.div.firstChild);
2851
- }
2852
- this.heatmap = void 0;
2853
- }
2854
- loadData(data) {
2855
- this.clearHeatmap();
2856
- const { width, height, leftTop, center: center2 } = this.getBox(data);
2857
- this.heatmap = create({
2858
- width,
2859
- height,
2860
- container: this.div,
2861
- ...this.context.config.heatMap
2862
- });
2863
- this.heatmap.setData(this.transformData(data, leftTop));
2864
- this.initPlane(width, height);
2865
- this.position.set(center2[0], center2[1], this.position.z);
2866
- }
2867
- initPlane(width, height) {
2868
- if (this.plane) {
2869
- this.remove(this.plane);
2870
- }
2871
- const geometry = new PlaneGeometry2(width, height);
2872
- const texture = new Texture(this.div.firstChild);
2873
- texture.needsUpdate = true;
2874
- const material = new MeshBasicMaterial2({
2875
- transparent: true,
2876
- side: DoubleSide3,
2877
- map: texture
2878
- });
2879
- material.needsUpdate = true;
2880
- this.plane = new Mesh3(geometry, material);
2881
- this.add(this.plane);
2882
- }
2883
- getTransMatrix({ x, y }) {
2884
- return new Matrix3().makeScale(1, -1).multiply(new Matrix3().makeTranslation(0 - x, 0 - y));
2885
- }
2886
- /**
2887
- * 所有点的坐标减去左上角从00点开始画canvas
2888
- * @param data
2889
- * @param leftTop
2890
- * @returns
2891
- */
2892
- transformData(data, leftTop) {
2893
- const matrix = this.getTransMatrix(leftTop);
2894
- const $data = data.data.map((item) => {
2895
- const vector = new Vector24(item.x, item.y).applyMatrix3(matrix);
2896
- return {
2897
- x: vector.x,
2898
- y: vector.y,
2899
- value: item.value
2900
- };
2901
- });
2902
- return {
2903
- data: $data,
2904
- max: data.max,
2905
- min: data.min
2906
- };
2907
- }
2908
- getBox(data) {
2909
- const features = featureCollection2(data.data.map((item) => point2([item.x, item.y])));
2910
- const box = bbox(features);
2911
- const width = box[2] - box[0];
2912
- const height = box[3] - box[1];
2913
- const leftTop = { x: box[0], y: box[3] };
2914
- const center2 = getCenter2(features);
2915
- return { width, height, leftTop, center: center2.geometry.coordinates };
2916
- }
2917
- dispose() {
2918
- this.div = null;
2919
- this.heatmap = void 0;
2920
- }
2921
- };
2922
-
2923
- // src/elements/model.ts
2924
- import { Box3 as Box34, Object3D as Object3D7, Vector3 as Vector37 } from "three";
2925
- var Model = class extends Object3D7 {
2926
- constructor(context, options) {
2927
- super();
2928
- this.context = context;
2929
- this.options = options;
2930
- this.position.copy(options.position || new Vector37(0, 0, 0));
2931
- this.loadModel();
2932
- }
2933
- poi = null;
2934
- model = null;
2935
- async loadModel() {
2936
- const object = await loadModel(this.options.modelUrl);
2937
- object.scene.rotation.set(Math.PI / 2, Math.PI / 2, 0);
2938
- this.add(object.scene);
2939
- this.model = object;
2940
- this.initPoi();
2941
- }
2942
- initPoi() {
2943
- if (!this.options.icon) {
2944
- return;
2945
- }
2946
- const poi = this.context.currentFloor?.addPoi({
2947
- icon: this.options.icon,
2948
- icon_size: this.options.icon_size,
2949
- built_in: true,
2950
- level: 0
2951
- });
2952
- this.poi = poi || null;
2953
- if (this.model && poi) {
2954
- poi.position = new Box34().setFromObject(this).getCenter(new Vector37());
2955
- }
2956
- }
2957
- dispose() {
2958
- dispose(this);
2959
- this.model = null;
2960
- if (this.poi) {
2961
- this.context.currentFloor?.poiLayer.removePoi(this.poi);
2962
- this.poi = null;
2963
- }
2964
- }
2965
- };
2966
-
2967
- // src/elements/ground-texture.ts
2968
- import { Euler, Mesh as Mesh4, Object3D as Object3D8, PlaneGeometry as PlaneGeometry3 } from "three";
2969
- var defaultOptions4 = {
2970
- uuid: "",
2971
- url: "",
2972
- name: "",
2973
- angleX: 0,
2974
- angleY: 0,
2975
- angleZ: 0,
2976
- width: 0,
2977
- height: 0,
2978
- center: [0, 0],
2979
- opacity: 1,
2980
- visible: true
2981
- };
2982
- var GroundTexture = class extends Object3D8 {
2983
- constructor(context, options) {
2984
- super();
2985
- this.context = context;
2986
- this.options = proxyOptions(
2987
- { ...defaultOptions4, ...options },
2988
- this
2989
- );
2990
- this.init();
2991
- }
2992
- options;
2993
- mesh;
2994
- async init() {
2995
- const { width, height, center: center2, url, opacity, angleX, angleY, angleZ } = this.options;
2996
- const planeGeometry = new PlaneGeometry3(width, height);
2997
- const planeMaterial = await this.context.materialFactory.createGroundTextureMaterial({
2998
- url,
2999
- opacity
3000
- });
3001
- const mesh = new Mesh4(planeGeometry, planeMaterial);
3002
- this.mesh = mesh;
3003
- this.mesh.position.set(center2[0], center2[1], 0);
3004
- mesh.setRotationFromEuler(new Euler(angleX, angleY, angleZ));
3005
- this.add(mesh);
3006
- }
3007
- dispose() {
3008
- this.mesh?.geometry.dispose();
3009
- this.clear();
3010
- }
3011
- };
3012
-
3013
2950
  // src/elements/floor.ts
3014
- var Floor = class extends Object3D9 {
2951
+ var Floor = class extends Object3D8 {
3015
2952
  constructor(context) {
3016
2953
  super();
3017
2954
  this.context = context;
3018
2955
  this.graphicLayer = new GraphicLayer(this.context);
3019
2956
  this.poiLayer = new PoiLayer(this.context);
2957
+ this.wallLayer = new Layer(this.context);
2958
+ this.textureLayer = new Layer(this.context);
2959
+ this.glbModelLayer = new Layer(this.context);
2960
+ this.laneLayer = new Layer(this.context);
3020
2961
  this.groundUpper.add(this.graphicLayer);
3021
2962
  this.groundUpper.add(this.poiLayer);
3022
- this.groundUpper.add(this.groundTextures);
2963
+ this.groundUpper.add(this.wallLayer);
2964
+ this.groundUpper.add(this.textureLayer);
2965
+ this.groundUpper.add(this.glbModelLayer);
2966
+ this.groundUpper.add(this.laneLayer);
3023
2967
  this.add(this.groundUpper);
3024
2968
  this.add(this.models);
3025
2969
  }
3026
2970
  graphicLayer;
3027
2971
  poiLayer;
2972
+ wallLayer;
2973
+ textureLayer;
2974
+ glbModelLayer;
2975
+ laneLayer;
3028
2976
  grounds = /* @__PURE__ */ new Set();
3029
2977
  shadow = new Shadow();
3030
2978
  heatmap;
3031
- groundUpper = new Object3D9();
3032
- models = new Object3D9();
2979
+ groundUpper = new Object3D8();
2980
+ models = new Object3D8();
3033
2981
  modelMap = /* @__PURE__ */ new Map();
3034
- groundTextures = new Group2();
3035
2982
  groundMaxHeight = 0;
3036
2983
  name = "";
3037
2984
  key = "";
@@ -3084,10 +3031,6 @@ var Floor = class extends Object3D9 {
3084
3031
  addPoi(poiOptions) {
3085
3032
  return this.poiLayer.createPoi(poiOptions);
3086
3033
  }
3087
- addGroundTexture(options) {
3088
- const groundTexture = new GroundTexture(this.context, options);
3089
- this.groundTextures.add(groundTexture);
3090
- }
3091
3034
  addHeatmap(data) {
3092
3035
  if (!this.heatmap) {
3093
3036
  this.heatmap = new HeatmapElement(this.context);
@@ -3115,9 +3058,11 @@ var Floor = class extends Object3D9 {
3115
3058
  this.shadow.dispose();
3116
3059
  this.graphicLayer.dispose();
3117
3060
  this.poiLayer.dispose();
3061
+ this.wallLayer.dispose();
3062
+ this.textureLayer.dispose();
3063
+ this.glbModelLayer.dispose();
3064
+ this.laneLayer.dispose();
3118
3065
  this.grounds.forEach((ground) => ground.dispose());
3119
- this.groundTextures.children.forEach((groundTexture) => groundTexture.dispose());
3120
- this.groundTextures.clear();
3121
3066
  this.heatmap?.dispose();
3122
3067
  this.groundUpper.clear();
3123
3068
  this.models.children.forEach((model) => model.dispose());
@@ -3393,126 +3338,453 @@ var SvgPolygon = class extends BaseSvg {
3393
3338
  const cy = +circle.getAttribute("cy");
3394
3339
  return Math.sqrt((x - cx) ** 2 + (y - cy) ** 2) <= 5;
3395
3340
  }
3396
- addPoint(vector) {
3397
- this.points.push(vector);
3398
- if (this.isClose) {
3399
- const area = this.calculatedArea();
3400
- this.dispatchEvent({ type: "area", area });
3401
- }
3341
+ addPoint(vector) {
3342
+ this.points.push(vector);
3343
+ if (this.isClose) {
3344
+ const area = this.calculatedArea();
3345
+ this.dispatchEvent({ type: "area", area });
3346
+ }
3347
+ }
3348
+ // 计算面积
3349
+ calculatedArea() {
3350
+ const cds = this.points.map((item) => [item.x, item.y]);
3351
+ let area = 0;
3352
+ const numPoints = cds.length;
3353
+ for (let i = 0; i < numPoints; i++) {
3354
+ const j = (i + 1) % numPoints;
3355
+ area += cds[i][0] * cds[j][1] - cds[j][0] * cds[i][1];
3356
+ }
3357
+ return Math.abs(area / 2);
3358
+ }
3359
+ dispose() {
3360
+ super.dispose();
3361
+ this.unRegistryEvent();
3362
+ this.lines = [];
3363
+ this.circles = [];
3364
+ }
3365
+ };
3366
+
3367
+ // src/elements/select-box.ts
3368
+ import { Box3 as Box36 } from "three";
3369
+ var SelectBox = class extends BaseSvg {
3370
+ constructor(context) {
3371
+ super(context);
3372
+ this.context = context;
3373
+ const { config: { svg: { line } } } = context;
3374
+ this.rect = createRect(line.stroke, "transparent");
3375
+ this.svg.appendChild(this.rect);
3376
+ for (let i = 0; i < 4; i++) {
3377
+ this.cornerRect[i] = createRect(line.stroke, "#ffffff");
3378
+ this.centerRect[i] = createRect(line.stroke, "#ffffff");
3379
+ this.svg.appendChild(this.cornerRect[i]);
3380
+ this.svg.appendChild(this.centerRect[i]);
3381
+ }
3382
+ this.registryEvent();
3383
+ }
3384
+ rect;
3385
+ cornerRect = [];
3386
+ // 四个角上的方块
3387
+ centerRect = [];
3388
+ // 四个线中间的方块
3389
+ graphic;
3390
+ setEnable(enable) {
3391
+ super.setEnable(enable);
3392
+ if (enable) {
3393
+ this.registryEvent();
3394
+ } else {
3395
+ this.unRegistryEvent();
3396
+ }
3397
+ }
3398
+ registryEvent() {
3399
+ this.context.addEventListener("update", this.onUpdate);
3400
+ }
3401
+ unRegistryEvent() {
3402
+ this.context.removeEventListener("update", this.onUpdate);
3403
+ }
3404
+ onUpdate = () => {
3405
+ if (!this.graphic) {
3406
+ setRectPosition(this.rect, 0, 0, 0, 0);
3407
+ for (let i = 0; i < this.cornerRect.length; i++) {
3408
+ setRectPosition(this.cornerRect[i], 0, 0, 0, 0);
3409
+ setRectPosition(this.centerRect[i], 0, 0, 0, 0);
3410
+ }
3411
+ } else {
3412
+ const box = new Box36().setFromObject(this.graphic);
3413
+ const { camera, container: { clientWidth: w, clientHeight: h } } = this.context;
3414
+ const { min, max } = box;
3415
+ const leftBottom = vector3ToDevice(min, camera, w, h);
3416
+ const rightTop = vector3ToDevice(max, camera, w, h);
3417
+ setRectPosition(this.rect, leftBottom.x, rightTop.y, Math.abs(rightTop.x - leftBottom.x), Math.abs(rightTop.y - leftBottom.y));
3418
+ const { x: left, y: bottom } = leftBottom;
3419
+ const { x: right, y: top } = rightTop;
3420
+ const halfWidth = 5;
3421
+ const corners = [
3422
+ { x: left - halfWidth, y: top - halfWidth },
3423
+ // 左上角
3424
+ { x: right - halfWidth, y: top - halfWidth },
3425
+ // 右上角
3426
+ { x: left - halfWidth, y: bottom - halfWidth },
3427
+ // 左下角
3428
+ { x: right - halfWidth, y: bottom - halfWidth }
3429
+ // 右下角
3430
+ ];
3431
+ for (let i = 0; i < corners.length; i++) {
3432
+ setRectPosition(this.cornerRect[i], corners[i].x, corners[i].y, halfWidth * 2, halfWidth * 2);
3433
+ }
3434
+ const centerHalfWidth = 4;
3435
+ const centerX = (left + right) / 2;
3436
+ const centerY = (bottom + top) / 2;
3437
+ const centers = [
3438
+ { x: centerX - centerHalfWidth, y: top - centerHalfWidth },
3439
+ // 上
3440
+ { x: left - centerHalfWidth, y: centerY - centerHalfWidth },
3441
+ // 左
3442
+ { x: right - centerHalfWidth, y: centerY - centerHalfWidth },
3443
+ // 右
3444
+ { x: centerX - centerHalfWidth, y: bottom - centerHalfWidth }
3445
+ // 下
3446
+ ];
3447
+ for (let i = 0; i < centers.length; i++) {
3448
+ setRectPosition(this.centerRect[i], centers[i].x, centers[i].y, centerHalfWidth * 2, centerHalfWidth * 2);
3449
+ }
3450
+ }
3451
+ };
3452
+ selectGraphic(graphic) {
3453
+ this.graphic = graphic;
3454
+ }
3455
+ dispose() {
3456
+ super.dispose();
3457
+ this.unRegistryEvent();
3458
+ this.rect = null;
3459
+ this.cornerRect = [];
3460
+ this.centerRect = [];
3461
+ }
3462
+ };
3463
+
3464
+ // src/elements/wall.ts
3465
+ import { BufferGeometry as BufferGeometry2, ExtrudeGeometry as ExtrudeGeometry2, LineSegments as LineSegments2, Mesh as Mesh4, Object3D as Object3D9, Vector3 as Vector310 } from "three";
3466
+ import { mergeGeometries } from "three/examples/jsm/utils/BufferGeometryUtils";
3467
+ var Wall = class extends Object3D9 {
3468
+ constructor(context, options) {
3469
+ super();
3470
+ this.context = context;
3471
+ this.options = options;
3472
+ if (!options.length) {
3473
+ return;
3474
+ }
3475
+ this.init();
3476
+ }
3477
+ geometry;
3478
+ material;
3479
+ lineMaterial;
3480
+ lineGeometry;
3481
+ Mesh;
3482
+ LineMesh;
3483
+ initGeometry() {
3484
+ const geometries = this.options.map((option) => {
3485
+ const shape = initShape(
3486
+ option.geometry.coords[0],
3487
+ option.geometry.coords.slice(1)
3488
+ );
3489
+ const geometry = new ExtrudeGeometry2(shape, {
3490
+ steps: 1,
3491
+ bevelEnabled: false,
3492
+ depth: option.height,
3493
+ curveSegments: 4
3494
+ });
3495
+ return geometry;
3496
+ });
3497
+ this.geometry = mergeGeometries(geometries);
3498
+ }
3499
+ initMaterial() {
3500
+ const { fillColor, fillOpacity, height } = this.options[0];
3501
+ const material = this.context.materialFactory.createMeshBasicMaterial({
3502
+ color: fillColor,
3503
+ opacity: fillOpacity
3504
+ });
3505
+ const material1 = this.context.materialFactory.createMeshBasicMaterial({
3506
+ color: darkenColor(fillColor),
3507
+ opacity: fillOpacity
3508
+ });
3509
+ this.material = [material, material1];
3510
+ return [material, material1];
3511
+ }
3512
+ initLineMaterial() {
3513
+ const { strokeColor, strokeOpacity } = this.options[0];
3514
+ const lineMaterial = this.context.materialFactory.createLineMaterial({
3515
+ color: strokeColor,
3516
+ opacity: strokeOpacity
3517
+ });
3518
+ this.lineMaterial = lineMaterial;
3519
+ return lineMaterial;
3520
+ }
3521
+ getBorderPoints(option) {
3522
+ const { height, deltaHeight, geometry } = option;
3523
+ const points = [];
3524
+ const _height = height + (deltaHeight || 0);
3525
+ const { coords } = geometry;
3526
+ for (let j = 0; j < coords.length; j++) {
3527
+ const curCds = coords[j];
3528
+ for (let i = 0; i < curCds.length; i++) {
3529
+ const cur = curCds[i];
3530
+ const next = i + 1 === curCds.length ? curCds[0] : curCds[i + 1];
3531
+ points.push(new Vector310(cur[0], cur[1], _height));
3532
+ points.push(new Vector310(next[0], next[1], _height));
3533
+ }
3534
+ }
3535
+ return points;
3536
+ }
3537
+ initLineGeometry() {
3538
+ const geometries = this.options.map((option) => {
3539
+ const points = this.getBorderPoints(option);
3540
+ return new BufferGeometry2().setFromPoints(points);
3541
+ });
3542
+ this.lineGeometry = mergeGeometries(geometries);
3543
+ }
3544
+ createBorder() {
3545
+ const line = new LineSegments2(this.lineGeometry, this.lineMaterial);
3546
+ this.LineMesh = line;
3547
+ this.add(line);
3548
+ return line;
3549
+ }
3550
+ init() {
3551
+ this.initGeometry();
3552
+ this.initMaterial();
3553
+ const mesh = new Mesh4(this.geometry, this.material);
3554
+ this.add(mesh);
3555
+ this.initLineMaterial();
3556
+ this.initLineGeometry();
3557
+ this.createBorder();
3558
+ }
3559
+ dispose() {
3560
+ this.geometry?.dispose();
3561
+ this.lineGeometry?.dispose();
3562
+ this.clear();
3563
+ }
3564
+ };
3565
+
3566
+ // src/elements/ground-texture.ts
3567
+ import { ExtrudeGeometry as ExtrudeGeometry3, Mesh as Mesh5, Object3D as Object3D10 } from "three";
3568
+ var defaultOptions4 = {
3569
+ uuid: "",
3570
+ iconUrl: "",
3571
+ name: "",
3572
+ secondRotate: 0,
3573
+ airHeight: 0,
3574
+ deltaHeight: 0,
3575
+ height: 0,
3576
+ geometry: { cds: [], type: "polygon", coords: [], curveCpt: [], curveIndex: [] },
3577
+ opacity: 1,
3578
+ visible: true
3579
+ };
3580
+ var GroundTexture = class extends Object3D10 {
3581
+ constructor(context, options) {
3582
+ super();
3583
+ this.context = context;
3584
+ this.options = proxyOptions(
3585
+ { ...defaultOptions4, ...options },
3586
+ this
3587
+ );
3588
+ this.init();
3589
+ }
3590
+ options;
3591
+ mesh;
3592
+ async init() {
3593
+ const { deltaHeight, airHeight, geometry, iconUrl, opacity } = this.options;
3594
+ const shape = initShape(
3595
+ geometry.coords[0],
3596
+ geometry.coords.slice(1)
3597
+ );
3598
+ const extrudeGeometry = new ExtrudeGeometry3(shape, {
3599
+ steps: 1,
3600
+ bevelEnabled: false,
3601
+ depth: 0,
3602
+ curveSegments: 4
3603
+ });
3604
+ const planeMaterial = await this.context.materialFactory.createGroundTextureMaterial({
3605
+ url: iconUrl,
3606
+ opacity
3607
+ });
3608
+ const mesh = new Mesh5(extrudeGeometry, planeMaterial);
3609
+ this.mesh = mesh;
3610
+ this.mesh.position.z = airHeight + deltaHeight;
3611
+ this.add(mesh);
3612
+ }
3613
+ dispose() {
3614
+ this.mesh?.geometry.dispose();
3615
+ this.clear();
3616
+ }
3617
+ };
3618
+
3619
+ // src/elements/glb-model.ts
3620
+ import { Box3 as Box37, Object3D as Object3D11, Vector3 as Vector312 } from "three";
3621
+ var defaultGlbOptions = {
3622
+ url: "",
3623
+ geometry: { type: "polygon", cds: [], coords: [], curveCpt: [], curveIndex: [] },
3624
+ id: "",
3625
+ width: 0,
3626
+ rotate: 1,
3627
+ airHeight: 1,
3628
+ deltaHeight: 0
3629
+ };
3630
+ var GlbModel = class extends Object3D11 {
3631
+ constructor(context, options) {
3632
+ super();
3633
+ this.context = context;
3634
+ this.options = Object.assign({}, defaultGlbOptions, options);
3635
+ this.loadModel();
3402
3636
  }
3403
- // 计算面积
3404
- calculatedArea() {
3405
- const cds = this.points.map((item) => [item.x, item.y]);
3406
- let area = 0;
3407
- const numPoints = cds.length;
3408
- for (let i = 0; i < numPoints; i++) {
3409
- const j = (i + 1) % numPoints;
3410
- area += cds[i][0] * cds[j][1] - cds[j][0] * cds[i][1];
3411
- }
3412
- return Math.abs(area / 2);
3637
+ model = null;
3638
+ options;
3639
+ async loadModel() {
3640
+ const object = await loadModel(this.options.url);
3641
+ object.scene.rotation.set(Math.PI / 2, Math.PI / 2, 0);
3642
+ const box = new Box37().setFromObject(object.scene);
3643
+ const size = box.getSize(new Vector312());
3644
+ const max = Math.max(size.x, size.y);
3645
+ const scale = this.options.width / max;
3646
+ this.scale.set(scale, scale, scale);
3647
+ this.add(object.scene);
3648
+ this.position.copy(box.getCenter(new Vector312()));
3649
+ this.position.z += this.options.airHeight + this.options.deltaHeight;
3650
+ this.model = object;
3413
3651
  }
3414
3652
  dispose() {
3415
- super.dispose();
3416
- this.unRegistryEvent();
3417
- this.lines = [];
3418
- this.circles = [];
3653
+ dispose(this);
3654
+ this.model = null;
3419
3655
  }
3420
3656
  };
3421
3657
 
3422
- // src/elements/select-box.ts
3423
- import { Box3 as Box36 } from "three";
3424
- var SelectBox = class extends BaseSvg {
3425
- constructor(context) {
3426
- super(context);
3658
+ // src/elements/lane.ts
3659
+ import { BufferGeometry as BufferGeometry3, ExtrudeGeometry as ExtrudeGeometry4, LineSegments as LineSegments3, Mesh as Mesh6, Object3D as Object3D12, Vector3 as Vector313 } from "three";
3660
+ import { mergeGeometries as mergeGeometries2 } from "three/examples/jsm/utils/BufferGeometryUtils";
3661
+ import { Line2 } from "three/examples/jsm/lines/line2";
3662
+ import { LineGeometry } from "three/examples/jsm/lines/lineGeometry";
3663
+ var Lane = class extends Object3D12 {
3664
+ constructor(context, options) {
3665
+ super();
3427
3666
  this.context = context;
3428
- const { config: { svg: { line } } } = context;
3429
- this.rect = createRect(line.stroke, "transparent");
3430
- this.svg.appendChild(this.rect);
3431
- for (let i = 0; i < 4; i++) {
3432
- this.cornerRect[i] = createRect(line.stroke, "#ffffff");
3433
- this.centerRect[i] = createRect(line.stroke, "#ffffff");
3434
- this.svg.appendChild(this.cornerRect[i]);
3435
- this.svg.appendChild(this.centerRect[i]);
3667
+ this.options = options;
3668
+ if (!options.length) {
3669
+ return;
3436
3670
  }
3437
- this.registryEvent();
3671
+ this.init();
3438
3672
  }
3439
- rect;
3440
- cornerRect = [];
3441
- // 四个角上的方块
3442
- centerRect = [];
3443
- // 四个线中间的方块
3444
- graphic;
3445
- setEnable(enable) {
3446
- super.setEnable(enable);
3447
- if (enable) {
3448
- this.registryEvent();
3449
- } else {
3450
- this.unRegistryEvent();
3451
- }
3673
+ geometry;
3674
+ material;
3675
+ lineMaterial;
3676
+ lineGeometry;
3677
+ Mesh;
3678
+ LineMesh;
3679
+ initGeometry() {
3680
+ const geometries = this.options.map((option) => {
3681
+ const shape = initShape(
3682
+ option.geometry.coords[0],
3683
+ option.geometry.coords.slice(1)
3684
+ );
3685
+ const geometry = new ExtrudeGeometry4(shape, {
3686
+ steps: 1,
3687
+ bevelEnabled: false,
3688
+ depth: 0,
3689
+ curveSegments: 4
3690
+ });
3691
+ return geometry;
3692
+ });
3693
+ this.geometry = mergeGeometries2(geometries);
3452
3694
  }
3453
- registryEvent() {
3454
- this.context.addEventListener("update", this.onUpdate);
3695
+ initMaterial() {
3696
+ const { fillColor, fillOpacity } = this.options[0];
3697
+ const material = this.context.materialFactory.createMeshBasicMaterial({
3698
+ color: fillColor,
3699
+ opacity: fillOpacity
3700
+ });
3701
+ this.material = material;
3702
+ return material;
3455
3703
  }
3456
- unRegistryEvent() {
3457
- this.context.removeEventListener("update", this.onUpdate);
3704
+ initLineMaterial() {
3705
+ const { strokeColor, strokeOpacity } = this.options[0];
3706
+ const lineMaterial = this.context.materialFactory.createLineMaterial({
3707
+ color: strokeColor,
3708
+ opacity: strokeOpacity
3709
+ });
3710
+ this.lineMaterial = lineMaterial;
3711
+ return lineMaterial;
3458
3712
  }
3459
- onUpdate = () => {
3460
- if (!this.graphic) {
3461
- setRectPosition(this.rect, 0, 0, 0, 0);
3462
- for (let i = 0; i < this.cornerRect.length; i++) {
3463
- setRectPosition(this.cornerRect[i], 0, 0, 0, 0);
3464
- setRectPosition(this.centerRect[i], 0, 0, 0, 0);
3713
+ getBorderPoints(option) {
3714
+ const { deltaHeight, geometry } = option;
3715
+ const points = [];
3716
+ const _height = deltaHeight || 0;
3717
+ const { coords } = geometry;
3718
+ for (let j = 0; j < coords.length; j++) {
3719
+ const curCds = coords[j];
3720
+ for (let i = 0; i < curCds.length; i++) {
3721
+ const cur = curCds[i];
3722
+ const next = i + 1 === curCds.length ? curCds[0] : curCds[i + 1];
3723
+ points.push(new Vector313(cur[0], cur[1], _height));
3724
+ points.push(new Vector313(next[0], next[1], _height));
3465
3725
  }
3466
- } else {
3467
- const box = new Box36().setFromObject(this.graphic);
3468
- const { camera, container: { clientWidth: w, clientHeight: h } } = this.context;
3469
- const { min, max } = box;
3470
- const leftBottom = vector3ToDevice(min, camera, w, h);
3471
- const rightTop = vector3ToDevice(max, camera, w, h);
3472
- setRectPosition(this.rect, leftBottom.x, rightTop.y, Math.abs(rightTop.x - leftBottom.x), Math.abs(rightTop.y - leftBottom.y));
3473
- const { x: left, y: bottom } = leftBottom;
3474
- const { x: right, y: top } = rightTop;
3475
- const halfWidth = 5;
3476
- const corners = [
3477
- { x: left - halfWidth, y: top - halfWidth },
3478
- // 左上角
3479
- { x: right - halfWidth, y: top - halfWidth },
3480
- // 右上角
3481
- { x: left - halfWidth, y: bottom - halfWidth },
3482
- // 左下角
3483
- { x: right - halfWidth, y: bottom - halfWidth }
3484
- // 右下角
3485
- ];
3486
- for (let i = 0; i < corners.length; i++) {
3487
- setRectPosition(this.cornerRect[i], corners[i].x, corners[i].y, halfWidth * 2, halfWidth * 2);
3726
+ }
3727
+ return points;
3728
+ }
3729
+ initDoubleLine() {
3730
+ const options = this.options.filter((option) => option.double && option.geometry.otherCoords?.[1]?.length);
3731
+ if (!options.length) {
3732
+ return;
3733
+ }
3734
+ const group = options.reduce((obj, cur) => {
3735
+ const key = `${cur.secondColor}-${cur.dashed}`;
3736
+ if (obj[key]) {
3737
+ obj[key].push(cur);
3488
3738
  }
3489
- const centerHalfWidth = 4;
3490
- const centerX = (left + right) / 2;
3491
- const centerY = (bottom + top) / 2;
3492
- const centers = [
3493
- { x: centerX - centerHalfWidth, y: top - centerHalfWidth },
3494
- // 上
3495
- { x: left - centerHalfWidth, y: centerY - centerHalfWidth },
3496
- // 左
3497
- { x: right - centerHalfWidth, y: centerY - centerHalfWidth },
3498
- // 右
3499
- { x: centerX - centerHalfWidth, y: bottom - centerHalfWidth }
3500
- // 下
3501
- ];
3502
- for (let i = 0; i < centers.length; i++) {
3503
- setRectPosition(this.centerRect[i], centers[i].x, centers[i].y, centerHalfWidth * 2, centerHalfWidth * 2);
3739
+ if (!obj[key]) {
3740
+ obj[key] = [cur];
3504
3741
  }
3505
- }
3506
- };
3507
- selectGraphic(graphic) {
3508
- this.graphic = graphic;
3742
+ return obj;
3743
+ }, {});
3744
+ Object.values(group).map((options2) => {
3745
+ const material = this.context.materialFactory.createLine2MaterialMap({
3746
+ color: options2[0].secondColor,
3747
+ width: 0.2,
3748
+ dashed: options2[0].dashed
3749
+ });
3750
+ options2.map((option) => {
3751
+ const geometry = new LineGeometry();
3752
+ const vec = option.geometry.otherCoords[1].map((item) => [...item, 0]).flat(2);
3753
+ geometry.setPositions(vec);
3754
+ const line = new Line2(geometry, material);
3755
+ line.computeLineDistances();
3756
+ line.position.z += 1e-4;
3757
+ this.add(line);
3758
+ });
3759
+ });
3760
+ }
3761
+ initLineGeometry() {
3762
+ const geometries = this.options.map((option) => {
3763
+ const points = this.getBorderPoints(option);
3764
+ return new BufferGeometry3().setFromPoints(points);
3765
+ });
3766
+ this.lineGeometry = mergeGeometries2(geometries);
3767
+ }
3768
+ createBorder() {
3769
+ const line = new LineSegments3(this.lineGeometry, this.lineMaterial);
3770
+ this.LineMesh = line;
3771
+ this.add(line);
3772
+ return line;
3773
+ }
3774
+ init() {
3775
+ this.initGeometry();
3776
+ this.initMaterial();
3777
+ const mesh = new Mesh6(this.geometry, this.material);
3778
+ this.add(mesh);
3779
+ this.initLineMaterial();
3780
+ this.initLineGeometry();
3781
+ this.createBorder();
3782
+ this.initDoubleLine();
3509
3783
  }
3510
3784
  dispose() {
3511
- super.dispose();
3512
- this.unRegistryEvent();
3513
- this.rect = null;
3514
- this.cornerRect = [];
3515
- this.centerRect = [];
3785
+ this.geometry?.dispose();
3786
+ this.lineGeometry?.dispose();
3787
+ this.clear();
3516
3788
  }
3517
3789
  };
3518
3790
 
@@ -3874,13 +4146,15 @@ var HoverHelper = class extends EventDispatcher5 {
3874
4146
  };
3875
4147
 
3876
4148
  // src/factory/material.ts
4149
+ import { LineMaterial } from "three/examples/jsm/lines/LineMaterial";
3877
4150
  import {
3878
4151
  Color as Color4,
3879
- LineBasicMaterial as LineBasicMaterial2,
4152
+ LineBasicMaterial as LineBasicMaterial4,
3880
4153
  MeshStandardMaterial as MeshStandardMaterial2,
3881
- MeshBasicMaterial as MeshBasicMaterial4,
4154
+ MeshBasicMaterial as MeshBasicMaterial6,
3882
4155
  ShaderMaterial as ShaderMaterial2,
3883
- DoubleSide as DoubleSide4
4156
+ DoubleSide as DoubleSide4,
4157
+ Vector2 as Vector25
3884
4158
  } from "three";
3885
4159
  function vectorToString(vector) {
3886
4160
  return `${vector.x}-${vector.y}-${vector.z}`;
@@ -3894,6 +4168,7 @@ var MaterialFactory = class {
3894
4168
  meshBasicMaterialMap = /* @__PURE__ */ new Map();
3895
4169
  shaderMaterialMap = /* @__PURE__ */ new Map();
3896
4170
  groundTextureMaterialMap = /* @__PURE__ */ new Map();
4171
+ line2MaterialMap = /* @__PURE__ */ new Map();
3897
4172
  generateLineMaterialKey({ color, opacity }) {
3898
4173
  return `${color}-${opacity}`;
3899
4174
  }
@@ -3902,7 +4177,7 @@ var MaterialFactory = class {
3902
4177
  if (this.lineMaterialMap.has(key)) {
3903
4178
  return this.lineMaterialMap.get(key);
3904
4179
  }
3905
- const lineMaterial = new LineBasicMaterial2({
4180
+ const lineMaterial = new LineBasicMaterial4({
3906
4181
  color: new Color4(color).convertLinearToSRGB(),
3907
4182
  transparent: true,
3908
4183
  opacity
@@ -3930,7 +4205,7 @@ var MaterialFactory = class {
3930
4205
  if (this.meshBasicMaterialMap.has(key)) {
3931
4206
  return this.meshBasicMaterialMap.get(key);
3932
4207
  }
3933
- const material = new MeshBasicMaterial4({
4208
+ const material = new MeshBasicMaterial6({
3934
4209
  color,
3935
4210
  transparent: true,
3936
4211
  opacity,
@@ -4033,7 +4308,7 @@ var MaterialFactory = class {
4033
4308
  return this.groundTextureMaterialMap.get(key);
4034
4309
  }
4035
4310
  const texture = await this.context.textureFactory.getTexture(url);
4036
- const material = new MeshBasicMaterial4({
4311
+ const material = new MeshBasicMaterial6({
4037
4312
  map: texture,
4038
4313
  transparent: true,
4039
4314
  opacity
@@ -4041,6 +4316,24 @@ var MaterialFactory = class {
4041
4316
  this.groundTextureMaterialMap.set(key, material);
4042
4317
  return material;
4043
4318
  }
4319
+ createLine2MaterialMap({ color, width, dashed }) {
4320
+ const key = `${color}-${width}-${dashed}`;
4321
+ if (this.line2MaterialMap.has(key)) {
4322
+ return this.line2MaterialMap.get(key);
4323
+ }
4324
+ const material = new LineMaterial({
4325
+ color: parseInt(color.slice(1), 16),
4326
+ dashed,
4327
+ linewidth: width,
4328
+ worldUnits: true,
4329
+ dashSize: 1,
4330
+ gapSize: 3,
4331
+ dashScale: 1,
4332
+ resolution: new Vector25(this.context.clientSize.width, this.context.clientSize.height)
4333
+ });
4334
+ this.line2MaterialMap.set(key, material);
4335
+ return material;
4336
+ }
4044
4337
  dispose() {
4045
4338
  this.lineMaterialMap.forEach((val, _) => {
4046
4339
  val.dispose();
@@ -4063,11 +4356,15 @@ var MaterialFactory = class {
4063
4356
  val.map?.dispose();
4064
4357
  });
4065
4358
  this.groundTextureMaterialMap.clear();
4359
+ this.line2MaterialMap.forEach((val, _) => {
4360
+ val.dispose();
4361
+ });
4362
+ this.line2MaterialMap.clear();
4066
4363
  }
4067
4364
  };
4068
4365
 
4069
4366
  // src/utils/camera-bound.ts
4070
- import { Box3 as Box37, Vector3 as Vector312 } from "three";
4367
+ import { Box3 as Box38, Vector3 as Vector316 } from "three";
4071
4368
  var CameraBound = class {
4072
4369
  constructor(context) {
4073
4370
  this.context = context;
@@ -4075,9 +4372,9 @@ var CameraBound = class {
4075
4372
  this.changePrevCamera();
4076
4373
  }
4077
4374
  prevCamera = {
4078
- position: new Vector312(),
4375
+ position: new Vector316(),
4079
4376
  zoom: 1,
4080
- target: new Vector312()
4377
+ target: new Vector316()
4081
4378
  };
4082
4379
  enable = true;
4083
4380
  setEnable(enable) {
@@ -4110,16 +4407,17 @@ var CameraBound = class {
4110
4407
  this.context.removeEventListener("control-change", this.onCameraChange);
4111
4408
  }
4112
4409
  getCurFloorScreenPosition() {
4113
- if (!this.context.currentFloor) {
4410
+ const floors = this.context.scene.children.filter((el) => el instanceof Floor);
4411
+ if (!floors.length) {
4114
4412
  return null;
4115
4413
  }
4116
- const box = new Box37().setFromObject(this.context.currentFloor.groundUpper);
4117
- const { camera, container: { clientWidth: w, clientHeight: h } } = this.context;
4414
+ const box = new Box38().setFromObject(this.context.scene);
4415
+ const { camera, clientSize: { width: w, height: h } } = this.context;
4118
4416
  const { min, max } = box;
4119
4417
  const lb = vector3ToDevice(min, camera, w, h);
4120
4418
  const rt = vector3ToDevice(max, camera, w, h);
4121
- const lt = vector3ToDevice(new Vector312(min.x, max.y, max.z), camera, w, h);
4122
- const rb = vector3ToDevice(new Vector312(max.x, min.y, min.z), camera, w, h);
4419
+ const lt = vector3ToDevice(new Vector316(min.x, max.y, max.z), camera, w, h);
4420
+ const rb = vector3ToDevice(new Vector316(max.x, min.y, min.z), camera, w, h);
4123
4421
  const left = Math.min(lb.x, rt.x, lt.x, rb.x);
4124
4422
  const right = Math.max(lb.x, rt.x, lt.x, rb.x);
4125
4423
  const top = Math.min(lb.y, rt.y, lt.y, rb.y);
@@ -4134,9 +4432,23 @@ var CameraBound = class {
4134
4432
  checkDistanceToScreenEdge({ left, right, top, bottom }) {
4135
4433
  const { width, height } = this.context.clientSize;
4136
4434
  const [pt, pr, pb, pl] = this.context.config.cameraBound.padding;
4137
- return left <= pl && width - right <= pr && top <= pt && height - bottom <= pb;
4435
+ const checkedRight = right >= pl;
4436
+ const checkedLeft = width - left >= pr;
4437
+ const checkedTop = height - top >= pb;
4438
+ const checkedBottom = bottom >= pt;
4439
+ return checkedRight && checkedLeft && checkedTop && checkedBottom;
4138
4440
  }
4139
4441
  onCameraChange = () => {
4442
+ const bound = this.getCurFloorScreenPosition();
4443
+ if (bound) {
4444
+ const { left, right, top, bottom } = bound;
4445
+ const isInBound = this.checkDistanceToScreenEdge({ left, right, top, bottom });
4446
+ if (isInBound) {
4447
+ this.changePrevCamera();
4448
+ } else {
4449
+ this.backToPrevCamera();
4450
+ }
4451
+ }
4140
4452
  };
4141
4453
  dispose() {
4142
4454
  this.unRegistryEvent();
@@ -4235,7 +4547,7 @@ var Context = class extends EventDispatcher6 {
4235
4547
  /**
4236
4548
  * 获取两个点之间的像素数
4237
4549
  */
4238
- getRatio(point1 = new Vector313(0, 0, 0), point22 = new Vector313(100, 0, 0)) {
4550
+ getRatio(point1 = new Vector317(0, 0, 0), point22 = new Vector317(100, 0, 0)) {
4239
4551
  const { clientWidth, clientHeight } = this.container;
4240
4552
  const device1 = vector3ToDevice(point1, this.camera, clientWidth, clientHeight);
4241
4553
  const device2 = vector3ToDevice(point22, this.camera, clientWidth, clientHeight);
@@ -4296,7 +4608,7 @@ var Context = class extends EventDispatcher6 {
4296
4608
  * @returns
4297
4609
  */
4298
4610
  getGraphicsByDeviceXy(x, y) {
4299
- const point3 = new Vector25();
4611
+ const point3 = new Vector26();
4300
4612
  point3.x = x / this.clientSize.width * 2 - 1;
4301
4613
  point3.y = y / this.clientSize.height * -2 + 1;
4302
4614
  const raycaster = new Raycaster3();
@@ -4436,7 +4748,7 @@ var Context = class extends EventDispatcher6 {
4436
4748
  );
4437
4749
  }
4438
4750
  getCameraLookAt() {
4439
- return new Vector313().subVectors(this.control.target, this.camera.position);
4751
+ return new Vector317().subVectors(this.control.target, this.camera.position);
4440
4752
  }
4441
4753
  /**
4442
4754
  * 按照一个中心点设置相机的放大缩小
@@ -4488,28 +4800,28 @@ var Context = class extends EventDispatcher6 {
4488
4800
  if (force2DView) {
4489
4801
  this.setPolarAngle(0, 0);
4490
4802
  }
4491
- const boundingBox = new Box38().setFromObject(object);
4803
+ const boundingBox = new Box39().setFromObject(object);
4492
4804
  this.setPolarAngle(polar, 0);
4493
4805
  const { max, min } = boundingBox;
4494
- const leftTop = new Vector313(min.x, max.y, max.z);
4495
- const rightTop = new Vector313(max.x, max.y, max.z);
4496
- const rightBottom = new Vector313(max.x, min.y, min.z);
4497
- const leftBottom = new Vector313(min.x, min.y, min.z);
4806
+ const leftTop = new Vector317(min.x, max.y, max.z);
4807
+ const rightTop = new Vector317(max.x, max.y, max.z);
4808
+ const rightBottom = new Vector317(max.x, min.y, min.z);
4809
+ const leftBottom = new Vector317(min.x, min.y, min.z);
4498
4810
  const leftTop2d = vector3ToDevice(leftTop, this.camera, width, height);
4499
4811
  const rightTop2d = vector3ToDevice(rightTop, this.camera, width, height);
4500
4812
  const leftBottom2d = vector3ToDevice(leftBottom, this.camera, width, height);
4501
4813
  const rightBottom2d = vector3ToDevice(rightBottom, this.camera, width, height);
4502
4814
  const boundingBox2d = new Box2().setFromPoints([
4503
- new Vector25(leftTop2d.x, leftTop2d.y),
4504
- new Vector25(rightTop2d.x, rightTop2d.y),
4505
- new Vector25(leftBottom2d.x, leftBottom2d.y),
4506
- new Vector25(rightBottom2d.x, rightBottom2d.y)
4815
+ new Vector26(leftTop2d.x, leftTop2d.y),
4816
+ new Vector26(rightTop2d.x, rightTop2d.y),
4817
+ new Vector26(leftBottom2d.x, leftBottom2d.y),
4818
+ new Vector26(rightBottom2d.x, rightBottom2d.y)
4507
4819
  ]);
4508
- const size = boundingBox2d.getSize(new Vector25());
4820
+ const size = boundingBox2d.getSize(new Vector26());
4509
4821
  const xScale = (width - right - left) / size.x;
4510
4822
  const yScale = (height - top - bottom) / size.y;
4511
4823
  const scale = Math.min(xScale, yScale);
4512
- const center2 = new Vector313((max.x + min.x) / 2, (max.y + min.y) / 2, (max.z + min.z) / 2);
4824
+ const center2 = new Vector317((max.x + min.x) / 2, (max.y + min.y) / 2, (max.z + min.z) / 2);
4513
4825
  return { zoom: scale * this.camera.zoom, center: center2 };
4514
4826
  }
4515
4827
  /**
@@ -4969,6 +5281,7 @@ var BMap = class extends EventDispatcher7 {
4969
5281
  this.context.control.addEventListener("change", this.onControlChange);
4970
5282
  this.onControlChange();
4971
5283
  this.context.cameraBound.setEnable(true);
5284
+ this.context.cameraBound.changePrevCamera();
4972
5285
  }
4973
5286
  onControlChange = () => {
4974
5287
  const {
@@ -5059,7 +5372,7 @@ var BMap = class extends EventDispatcher7 {
5059
5372
  } = this.context;
5060
5373
  const device = vector3ToDevice(position, camera, width, height);
5061
5374
  const offsetX = device.x - width / 2;
5062
- const v3 = new Vector314();
5375
+ const v3 = new Vector318();
5063
5376
  v3.setFromMatrixColumn(this.context.camera.matrix, 0);
5064
5377
  v3.normalize();
5065
5378
  v3.multiplyScalar(offsetX / this.context.camera.zoom);
@@ -5432,32 +5745,32 @@ function Worker2() {
5432
5745
 
5433
5746
  // src/plugins/navigation/path.ts
5434
5747
  import {
5435
- Mesh as Mesh5,
5436
- Object3D as Object3D12,
5748
+ Mesh as Mesh7,
5749
+ Object3D as Object3D15,
5437
5750
  TextureLoader as TextureLoader2,
5438
5751
  Color as Color7,
5439
- Vector2 as Vector27,
5440
- Vector3 as Vector316,
5752
+ Vector2 as Vector28,
5753
+ Vector3 as Vector320,
5441
5754
  NormalBlending,
5442
5755
  RepeatWrapping
5443
5756
  } from "three";
5444
5757
 
5445
5758
  // src/external/meshLine.js
5446
5759
  import {
5447
- BufferGeometry as BufferGeometry2,
5760
+ BufferGeometry as BufferGeometry4,
5448
5761
  Matrix4,
5449
- Vector3 as Vector315,
5762
+ Vector3 as Vector319,
5450
5763
  Ray as Ray2,
5451
5764
  Sphere,
5452
- LineSegments as LineSegments2,
5765
+ LineSegments as LineSegments4,
5453
5766
  BufferAttribute,
5454
5767
  ShaderChunk,
5455
5768
  ShaderMaterial as ShaderMaterial3,
5456
5769
  UniformsLib,
5457
5770
  Color as Color6,
5458
- Vector2 as Vector26
5771
+ Vector2 as Vector27
5459
5772
  } from "three";
5460
- var MeshLine = class extends BufferGeometry2 {
5773
+ var MeshLine = class extends BufferGeometry4 {
5461
5774
  constructor() {
5462
5775
  super();
5463
5776
  this.isMeshLine = true;
@@ -5526,7 +5839,7 @@ MeshLine.prototype.setPoints = function(points, wcb) {
5526
5839
  this.widthCallback = wcb;
5527
5840
  this.positions = [];
5528
5841
  this.counters = [];
5529
- if (points.length && points[0] instanceof Vector315) {
5842
+ if (points.length && points[0] instanceof Vector319) {
5530
5843
  for (var j = 0; j < points.length; j++) {
5531
5844
  var p = points[j];
5532
5845
  var c = j / points.length;
@@ -5550,7 +5863,7 @@ function MeshLineRaycast(raycaster, intersects) {
5550
5863
  var inverseMatrix = new Matrix4();
5551
5864
  var ray = new Ray2();
5552
5865
  var sphere = new Sphere();
5553
- var interRay = new Vector315();
5866
+ var interRay = new Vector319();
5554
5867
  var geometry = this.geometry;
5555
5868
  if (!geometry.boundingSphere) geometry.computeBoundingSphere();
5556
5869
  sphere.copy(geometry.boundingSphere);
@@ -5560,10 +5873,10 @@ function MeshLineRaycast(raycaster, intersects) {
5560
5873
  }
5561
5874
  inverseMatrix.copy(this.matrixWorld).invert();
5562
5875
  ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
5563
- var vStart = new Vector315();
5564
- var vEnd = new Vector315();
5565
- var interSegment = new Vector315();
5566
- var step = this instanceof LineSegments2 ? 2 : 1;
5876
+ var vStart = new Vector319();
5877
+ var vEnd = new Vector319();
5878
+ var interSegment = new Vector319();
5879
+ var step = this instanceof LineSegments4 ? 2 : 1;
5567
5880
  var index = geometry.index;
5568
5881
  var attributes = geometry.attributes;
5569
5882
  if (index !== null) {
@@ -5616,8 +5929,8 @@ MeshLine.prototype.getDistance = function(i) {
5616
5929
  let maxLength = 0;
5617
5930
  for (let k = 0; k < i; k++) {
5618
5931
  const index = 6 * k;
5619
- const p0 = new Vector315(this.positions[index], this.positions[index + 1], this.positions[index + 2]);
5620
- const p1 = new Vector315(this.positions[index + 6], this.positions[index + 7], this.positions[index + 8]);
5932
+ const p0 = new Vector319(this.positions[index], this.positions[index + 1], this.positions[index + 2]);
5933
+ const p1 = new Vector319(this.positions[index + 6], this.positions[index + 7], this.positions[index + 8]);
5621
5934
  const distance = p0.distanceTo(p1);
5622
5935
  maxLength += distance;
5623
5936
  }
@@ -5885,7 +6198,7 @@ var MeshLineMaterial = class extends ShaderMaterial3 {
5885
6198
  useAlphaMap: { value: 0 },
5886
6199
  color: { value: new Color6(16777215) },
5887
6200
  opacity: { value: 1 },
5888
- resolution: { value: new Vector26(1, 1) },
6201
+ resolution: { value: new Vector27(1, 1) },
5889
6202
  sizeAttenuation: { value: 1 },
5890
6203
  dashArray: { value: 0 },
5891
6204
  dashOffset: { value: 0 },
@@ -5893,7 +6206,7 @@ var MeshLineMaterial = class extends ShaderMaterial3 {
5893
6206
  useDash: { value: 0 },
5894
6207
  visibility: { value: 1 },
5895
6208
  alphaTest: { value: 0 },
5896
- repeat: { value: new Vector26(1, 1) }
6209
+ repeat: { value: new Vector27(1, 1) }
5897
6210
  }),
5898
6211
  vertexShader: ShaderChunk.meshline_vert,
5899
6212
  fragmentShader: ShaderChunk.meshline_frag
@@ -6080,7 +6393,7 @@ var defaultConfig2 = {
6080
6393
  lineWidth: 8,
6081
6394
  color: 16777215
6082
6395
  };
6083
- var Path2 = class extends Object3D12 {
6396
+ var Path2 = class extends Object3D15 {
6084
6397
  constructor(navigation, config) {
6085
6398
  super();
6086
6399
  this.navigation = navigation;
@@ -6129,7 +6442,7 @@ var Path2 = class extends Object3D12 {
6129
6442
  }
6130
6443
  } = this;
6131
6444
  const screenPoints = points.map(
6132
- ([x, y]) => vector3ToDevice(new Vector316(x, y, 0), camera, width, height)
6445
+ ([x, y]) => vector3ToDevice(new Vector320(x, y, 0), camera, width, height)
6133
6446
  ).map(({ x, y }) => [x, y]);
6134
6447
  const pointLength = getPathLength(screenPoints);
6135
6448
  return pointLength / 32;
@@ -6139,7 +6452,7 @@ var Path2 = class extends Object3D12 {
6139
6452
  return;
6140
6453
  }
6141
6454
  const repeat = this.getRepeat();
6142
- this.material.repeat = new Vector27(repeat, 1);
6455
+ this.material.repeat = new Vector28(repeat, 1);
6143
6456
  }
6144
6457
  loadTexture(url) {
6145
6458
  return new Promise((r, j) => {
@@ -6174,7 +6487,7 @@ var Path2 = class extends Object3D12 {
6174
6487
  useMap: true,
6175
6488
  color: new Color7(this.config.color),
6176
6489
  transparent: true,
6177
- resolution: new Vector27(
6490
+ resolution: new Vector28(
6178
6491
  this.navigation.bmap.context.clientSize.width,
6179
6492
  this.navigation.bmap.context.clientSize.height
6180
6493
  ),
@@ -6183,9 +6496,9 @@ var Path2 = class extends Object3D12 {
6183
6496
  lineWidth: this.config.lineWidth * 2,
6184
6497
  map: this.texture,
6185
6498
  blending: NormalBlending,
6186
- repeat: new Vector27(this.getRepeat(), 1)
6499
+ repeat: new Vector28(this.getRepeat(), 1)
6187
6500
  });
6188
- const mesh = this.mesh = new Mesh5(lineGeometry, material);
6501
+ const mesh = this.mesh = new Mesh7(lineGeometry, material);
6189
6502
  this.add(mesh);
6190
6503
  return mesh;
6191
6504
  }
@@ -6579,21 +6892,355 @@ var SplitLoad = class extends Plugin {
6579
6892
  return Array.from(this.bmap.context.currentFloor.userData.graphicMap.values());
6580
6893
  }
6581
6894
  };
6895
+
6896
+ // src/plugins/mul-floors/mul-floors.ts
6897
+ import { Group as Group4 } from "three";
6898
+ var MulFloors = class extends Plugin {
6899
+ poiLayer;
6900
+ floors = [];
6901
+ group = new Group4();
6902
+ constructor(bmap) {
6903
+ super(bmap);
6904
+ this.poiLayer = new PoiLayer(bmap.context);
6905
+ }
6906
+ show(floors) {
6907
+ let height = floors[0].userData.height;
6908
+ floors.forEach((floor) => {
6909
+ floor.poiLayer.pois.forEach((poi) => {
6910
+ this.poiLayer.pushPoi(poi);
6911
+ });
6912
+ floor.poiLayer.pois.length = 0;
6913
+ floor.poiLayer.dispose();
6914
+ floor.position.z = height;
6915
+ height += floor.userData.height;
6916
+ });
6917
+ const { scene, currentFloor } = this.bmap.context;
6918
+ if (currentFloor) {
6919
+ scene.remove(currentFloor);
6920
+ currentFloor.dispose();
6921
+ }
6922
+ this.group.add(this.poiLayer, ...floors);
6923
+ scene.add(this.group);
6924
+ this.floors = floors;
6925
+ }
6926
+ hide() {
6927
+ const { scene } = this.bmap.context;
6928
+ scene.remove(this.group);
6929
+ this.poiLayer.clear(true);
6930
+ this.floors.forEach((floor) => {
6931
+ floor.dispose();
6932
+ });
6933
+ this.floors = [];
6934
+ this.group.clear();
6935
+ }
6936
+ fitCamera() {
6937
+ const { context, config, type } = this.bmap;
6938
+ context.cameraBound.setEnable(false);
6939
+ context.control.minZoom = 0;
6940
+ context.control.maxZoom = Infinity;
6941
+ context.camera.zoom = 1;
6942
+ context.setAzimuthalAngle(config.control.defaultAzimuthal, 0);
6943
+ context.setPolarAngle(config.control.defaultPolar, 0);
6944
+ context.fitCameraToObject(this.group, void 0, 0);
6945
+ const basicZoom = context.camera.zoom;
6946
+ context.control.minZoom = basicZoom;
6947
+ context.control.maxZoom = basicZoom * 25;
6948
+ if (type === "3d") {
6949
+ context.fitCameraToObject(this.group, config.defaultPadding, 0, false);
6950
+ }
6951
+ this.bmap.basicZoom = context.camera.zoom;
6952
+ context.control.addEventListener(
6953
+ "change",
6954
+ this.bmap.onControlChange.bind(this.bmap)
6955
+ );
6956
+ this.bmap.onControlChange();
6957
+ context.cameraBound.setEnable(true);
6958
+ }
6959
+ dispose() {
6960
+ this.poiLayer.dispose();
6961
+ this.floors.forEach((item) => item.dispose());
6962
+ this.floors = [];
6963
+ }
6964
+ };
6965
+
6966
+ // src/utils/index-db.ts
6967
+ var _db;
6968
+ function createDb(database = "aibee_map") {
6969
+ return new Promise((resolve, reject) => {
6970
+ if (_db) {
6971
+ return resolve(_db);
6972
+ }
6973
+ const request = indexedDB.open(database);
6974
+ request.onupgradeneeded = function(event) {
6975
+ _db = event.target.result;
6976
+ resolve(_db);
6977
+ };
6978
+ request.onsuccess = (event) => {
6979
+ _db = event.target.result;
6980
+ };
6981
+ request.onerror = (event) => {
6982
+ reject(event);
6983
+ };
6984
+ });
6985
+ }
6986
+ function createStore(storeName, db = _db) {
6987
+ if (!db) {
6988
+ return;
6989
+ }
6990
+ if (!db.objectStoreNames.contains(storeName)) {
6991
+ db.createObjectStore(storeName, { keyPath: "key" });
6992
+ }
6993
+ }
6994
+ function closeDb() {
6995
+ _db?.close();
6996
+ _db = null;
6997
+ }
6998
+
6999
+ // src/loader/AibeeLoader/zstd.worker.ts
7000
+ function Worker3() {
7001
+ return inlineWorker('var L=Object.defineProperty;var k=(g,A,Q)=>A in g?L(g,A,{enumerable:!0,configurable:!0,writable:!0,value:Q}):g[A]=Q;var s=(g,A,Q)=>k(g,typeof A!="symbol"?A+"":A,Q);function a(g,A){return new Promise((Q,I)=>{let B=new XMLHttpRequest;B.open("GET",g,!0),Object.keys(A.headers||{}).forEach(C=>{B.setRequestHeader(C,A.headers[C])}),A.responseType&&(B.responseType=A.responseType),B.onload=()=>{if(B.status>=200&&B.status<300)if(A.responseType==="arraybuffer")Q(B.response);else try{let C=JSON.parse(B.responseText);Q(C)}catch(C){I(C)}else I(B.statusText)},B.onerror=()=>{I(B.statusText)},B.send()})}function F(g){return g.replace(/[A-Z]/g,A=>"_"+A.toLowerCase()).replace(/^_/,"")}var D=class g{constructor(){s(this,"keySet",new Set)}static createKey(){return Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15)}genUniqueKey(){let A=g.createKey();for(;this.keySet.has(A);)A=g.createKey();return A}removeKey(A){this.keySet.delete(A)}dispose(){this.keySet.clear()}};var H=new D;function h(g){let A={};for(let I in g)I.startsWith("on")&&(A[F(I.slice(2))]=g[I]);let Q=async({data:I})=>{if(A[I.type])try{let B=await A[I.type](I.data);self.postMessage({type:`${I.type}_result`,key:I.key,data:B})}catch(B){self.postMessage({type:`${I.type}_result`,key:I.key,error:B})}else self.postMessage({type:`${I.type}_result`,key:I.key,error:"no_event"})};return self.addEventListener("message",Q),()=>{self.removeEventListener("message",Q)}}var i,E,w,G={env:{emscripten_notify_memory_growth:function(g){w=new Uint8Array(E.exports.memory.buffer)}}},o=class{init(){return i||(typeof fetch!="undefined"?i=fetch("data:application/wasm;base64,"+y).then(A=>A.arrayBuffer()).then(A=>WebAssembly.instantiate(A,G)).then(this._init):i=WebAssembly.instantiate(Buffer.from(y,"base64"),G).then(this._init),i)}_init(A){E=A.instance,G.env.emscripten_notify_memory_growth(0)}decode(A,Q=0){if(!E)throw new Error("ZSTDDecoder: Await .init() before decoding.");let I=A.byteLength,B=E.exports.malloc(I);w.set(A,B),Q=Q||Number(E.exports.ZSTD_findDecompressedSize(B,I));let C=E.exports.malloc(Q),S=E.exports.ZSTD_decompress(C,Q,B,I),N=w.slice(C,C+S);return E.exports.free(B),E.exports.free(C),N}},y="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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQhBSAGQQR2IQRBICAAdCIAQQFyIQkgASgCACEPQQAhAiADIQYCQANAIAlBAkggAiAPS3JFBEAgAiEHAkAgCARAA0AgBEH//wNxQf//A0YEQCAHQRhqIQcgBiAQSQR/IAZBAmoiBigAACAFdgUgBUEQaiEFIARBEHYLIQQMAQsLA0AgBEEDcSIIQQNGBEAgBUECaiEFIARBAnYhBCAHQQNqIQcMAQsLIAcgCGoiByAPSw0EIAVBAmohBQNAIAIgB0kEQCANIAJBAXRqQQA7AQAgAkEBaiECDAELCyAGIA5LQQAgBiAFQQN1aiIHIAxLG0UEQCAHKAAAIAVBB3EiBXYhBAwCCyAEQQJ2IQQLIAYhBwsCfyALQX9qIAQgAEF/anEiBiAAQQF0QX9qIgggCWsiEUkNABogBCAIcSIEQQAgESAEIABIG2shBiALCyEIIA0gAkEBdGogBkF/aiIEOwEAIAlBASAGayAEIAZBAUgbayEJA0AgCSAASARAIABBAXUhACALQX9qIQsMAQsLAn8gByAOS0EAIAcgBSAIaiIFQQN1aiIGIAxLG0UEQCAFQQdxDAELIAUgDCIGIAdrQQN0awshBSACQQFqIQIgBEUhCCAGKAAAIAVBH3F2IQQMAQsLQWwgCUEBRyAFQSBKcg0BGiABIAJBf2o2AgAgBiAFQQdqQQN1aiADawwBC0FQCyEAIApBEGokACAACwkAQQFBBSAAGwsMACAAIAEoAAA2AAALqgMBCn8jAEHwAGsiCiQAIAJBAWohDiAAQQhqIQtBgIAEIAVBf2p0QRB1IQxBACECQQEhBkEBIAV0IglBf2oiDyEIA0AgAiAORkUEQAJAIAEgAkEBdCINai8BACIHQf//A0YEQCALIAhBA3RqIAI2AgQgCEF/aiEIQQEhBwwBCyAGQQAgDCAHQRB0QRB1ShshBgsgCiANaiAHOwEAIAJBAWohAgwBCwsgACAFNgIEIAAgBjYCACAJQQN2IAlBAXZqQQNqIQxBACEAQQAhBkEAIQIDQCAGIA5GBEADQAJAIAAgCUYNACAKIAsgAEEDdGoiASgCBCIGQQF0aiICIAIvAQAiAkEBajsBACABIAUgAhAUayIIOgADIAEgAiAIQf8BcXQgCWs7AQAgASAEIAZBAnQiAmooAgA6AAIgASACIANqKAIANgIEIABBAWohAAwBCwsFIAEgBkEBdGouAQAhDUEAIQcDQCAHIA1ORQRAIAsgAkEDdGogBjYCBANAIAIgDGogD3EiAiAISw0ACyAHQQFqIQcMAQsLIAZBAWohBgwBCwsgCkHwAGokAAsjAEIAIAEQCSAAhUKHla+vmLbem55/fkLj3MqV/M7y9YV/fAsQACAAQn43AwggACABNgIACyQBAX8gAARAIAEoAgQiAgRAIAEoAgggACACEQEADwsgABAmCwsfACAAIAEgAi8BABAINgIAIAEQBBogACACQQRqNgIEC0oBAX9BoCAoAgAiASAAaiIAQX9MBEBBiCBBMDYCAEF/DwsCQCAAPwBBEHRNDQAgABBmDQBBiCBBMDYCAEF/DwtBoCAgADYCACABC9cBAQh/Qbp/IQoCQCACKAIEIgggAigCACIJaiIOIAEgAGtLDQBBbCEKIAkgBCADKAIAIgtrSw0AIAAgCWoiBCACKAIIIgxrIQ0gACABQWBqIg8gCyAJQQAQKSADIAkgC2o2AgACQAJAIAwgBCAFa00EQCANIQUMAQsgDCAEIAZrSw0CIAcgDSAFayIAaiIBIAhqIAdNBEAgBCABIAgQDxoMAgsgBCABQQAgAGsQDyEBIAIgACAIaiIINgIEIAEgAGshBAsgBCAPIAUgCEEBECkLIA4hCgsgCgubAgEBfyMAQYABayINJAAgDSADNgJ8AkAgAkEDSwRAQX8hCQwBCwJAAkACQAJAIAJBAWsOAwADAgELIAZFBEBBuH8hCQwEC0FsIQkgBS0AACICIANLDQMgACAHIAJBAnQiAmooAgAgAiAIaigCABA7IAEgADYCAEEBIQkMAwsgASAJNgIAQQAhCQwCCyAKRQRAQWwhCQwCC0EAIQkgC0UgDEEZSHINAUEIIAR0QQhqIQBBACECA0AgAiAATw0CIAJBQGshAgwAAAsAC0FsIQkgDSANQfwAaiANQfgAaiAFIAYQFSICEAMNACANKAJ4IgMgBEsNACAAIA0gDSgCfCAHIAggAxAYIAEgADYCACACIQkLIA1BgAFqJAAgCQsLACAAIAEgAhALGgsQACAALwAAIAAtAAJBEHRyCy8AAn9BuH8gAUEISQ0AGkFyIAAoAAQiAEF3Sw0AGkG4fyAAQQhqIgAgACABSxsLCwkAIAAgATsAAAsDAAELigYBBX8gACAAKAIAIgVBfnE2AgBBACAAIAVBAXZqQYQgKAIAIgQgAEYbIQECQAJAIAAoAgQiAkUNACACKAIAIgNBAXENACACQQhqIgUgA0EBdkF4aiIDQQggA0EISxtnQR9zQQJ0QYAfaiIDKAIARgRAIAMgAigCDDYCAAsgAigCCCIDBEAgAyACKAIMNgIECyACKAIMIgMEQCADIAIoAgg2AgALIAIgAigCACAAKAIAQX5xajYCAEGEICEAAkACQCABRQ0AIAEgAjYCBCABKAIAIgNBAXENASADQQF2QXhqIgNBCCADQQhLG2dBH3NBAnRBgB9qIgMoAgAgAUEIakYEQCADIAEoAgw2AgALIAEoAggiAwRAIAMgASgCDDYCBAsgASgCDCIDBEAgAyABKAIINgIAQYQgKAIAIQQLIAIgAigCACABKAIAQX5xajYCACABIARGDQAgASABKAIAQQF2akEEaiEACyAAIAI2AgALIAIoAgBBAXZBeGoiAEEIIABBCEsbZ0Efc0ECdEGAH2oiASgCACEAIAEgBTYCACACIAA2AgwgAkEANgIIIABFDQEgACAFNgIADwsCQCABRQ0AIAEoAgAiAkEBcQ0AIAJBAXZBeGoiAkEIIAJBCEsbZ0Efc0ECdEGAH2oiAigCACABQQhqRgRAIAIgASgCDDYCAAsgASgCCCICBEAgAiABKAIMNgIECyABKAIMIgIEQCACIAEoAgg2AgBBhCAoAgAhBAsgACAAKAIAIAEoAgBBfnFqIgI2AgACQCABIARHBEAgASABKAIAQQF2aiAANgIEIAAoAgAhAgwBC0GEICAANgIACyACQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgIoAgAhASACIABBCGoiAjYCACAAIAE2AgwgAEEANgIIIAFFDQEgASACNgIADwsgBUEBdkF4aiIBQQggAUEISxtnQR9zQQJ0QYAfaiICKAIAIQEgAiAAQQhqIgI2AgAgACABNgIMIABBADYCCCABRQ0AIAEgAjYCAAsLDgAgAARAIABBeGoQJQsLgAIBA38CQCAAQQ9qQXhxQYQgKAIAKAIAQQF2ayICEB1Bf0YNAAJAQYQgKAIAIgAoAgAiAUEBcQ0AIAFBAXZBeGoiAUEIIAFBCEsbZ0Efc0ECdEGAH2oiASgCACAAQQhqRgRAIAEgACgCDDYCAAsgACgCCCIBBEAgASAAKAIMNgIECyAAKAIMIgFFDQAgASAAKAIINgIAC0EBIQEgACAAKAIAIAJBAXRqIgI2AgAgAkEBcQ0AIAJBAXZBeGoiAkEIIAJBCEsbZ0Efc0ECdEGAH2oiAygCACECIAMgAEEIaiIDNgIAIAAgAjYCDCAAQQA2AgggAkUNACACIAM2AgALIAELtwIBA38CQAJAIABBASAAGyICEDgiAA0AAkACQEGEICgCACIARQ0AIAAoAgAiA0EBcQ0AIAAgA0EBcjYCACADQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgEoAgAgAEEIakYEQCABIAAoAgw2AgALIAAoAggiAQRAIAEgACgCDDYCBAsgACgCDCIBBEAgASAAKAIINgIACyACECchAkEAIQFBhCAoAgAhACACDQEgACAAKAIAQX5xNgIAQQAPCyACQQ9qQXhxIgMQHSICQX9GDQIgAkEHakF4cSIAIAJHBEAgACACaxAdQX9GDQMLAkBBhCAoAgAiAUUEQEGAICAANgIADAELIAAgATYCBAtBhCAgADYCACAAIANBAXRBAXI2AgAMAQsgAEUNAQsgAEEIaiEBCyABC7kDAQJ/IAAgA2ohBQJAIANBB0wEQANAIAAgBU8NAiAAIAItAAA6AAAgAEEBaiEAIAJBAWohAgwAAAsACyAEQQFGBEACQCAAIAJrIgZBB00EQCAAIAItAAA6AAAgACACLQABOgABIAAgAi0AAjoAAiAAIAItAAM6AAMgAEEEaiACIAZBAnQiBkHAHmooAgBqIgIQFyACIAZB4B5qKAIAayECDAELIAAgAhAMCyACQQhqIQIgAEEIaiEACwJAAkACQAJAIAUgAU0EQCAAIANqIQEgBEEBRyAAIAJrQQ9Kcg0BA0AgACACEAwgAkEIaiECIABBCGoiACABSQ0ACwwFCyAAIAFLBEAgACEBDAQLIARBAUcgACACa0EPSnINASAAIQMgAiEEA0AgAyAEEAwgBEEIaiEEIANBCGoiAyABSQ0ACwwCCwNAIAAgAhAHIAJBEGohAiAAQRBqIgAgAUkNAAsMAwsgACEDIAIhBANAIAMgBBAHIARBEGohBCADQRBqIgMgAUkNAAsLIAIgASAAa2ohAgsDQCABIAVPDQEgASACLQAAOgAAIAFBAWohASACQQFqIQIMAAALAAsLQQECfyAAIAAoArjgASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY0AAQMyIFEAMiBg0AIANBHzYCfCADIANB/ABqIANB+ABqIAQgBCAFaiAGGyIEIAEgAmoiAiAEaxAVIgUQAw0AIAMoAnwiBkEfSw0AIAMoAngiB0EJTw0AIABBiCBqIAMgBkGAC0GADCAHEBggA0E0NgJ8IAMgA0H8AGogA0H4AGogBCAFaiIEIAIgBGsQFSIFEAMNACADKAJ8IgZBNEsNACADKAJ4IgdBCk8NACAAQZAwaiADIAZBgA1B4A4gBxAYIANBIzYCfCADIANB/ABqIANB+ABqIAQgBWoiBCACIARrEBUiBRADDQAgAygCfCIGQSNLDQAgAygCeCIHQQpPDQAgACADIAZBwBBB0BEgBxAYIAQgBWoiBEEMaiIFIAJLDQAgAiAFayEFQQAhAgNAIAJBA0cEQCAEKAAAIgZBf2ogBU8NAiAAIAJBAnRqQZzQAWogBjYCACACQQFqIQIgBEEEaiEEDAELCyAEIAFrIQgLIANBgAFqJAAgCAtGAQN/IABBCGohAyAAKAIEIQJBACEAA0AgACACdkUEQCABIAMgAEEDdGotAAJBFktqIQEgAEEBaiEADAELCyABQQggAmt0C4YDAQV/Qbh/IQcCQCADRQ0AIAItAAAiBEUEQCABQQA2AgBBAUG4fyADQQFGGw8LAn8gAkEBaiIFIARBGHRBGHUiBkF/Sg0AGiAGQX9GBEAgA0EDSA0CIAUvAABBgP4BaiEEIAJBA2oMAQsgA0ECSA0BIAItAAEgBEEIdHJBgIB+aiEEIAJBAmoLIQUgASAENgIAIAVBAWoiASACIANqIgNLDQBBbCEHIABBEGogACAFLQAAIgVBBnZBI0EJIAEgAyABa0HAEEHQEUHwEiAAKAKM4QEgACgCnOIBIAQQHyIGEAMiCA0AIABBmCBqIABBCGogBUEEdkEDcUEfQQggASABIAZqIAgbIgEgAyABa0GAC0GADEGAFyAAKAKM4QEgACgCnOIBIAQQHyIGEAMiCA0AIABBoDBqIABBBGogBUECdkEDcUE0QQkgASABIAZqIAgbIgEgAyABa0GADUHgDkGQGSAAKAKM4QEgACgCnOIBIAQQHyIAEAMNACAAIAFqIAJrIQcLIAcLrQMBCn8jAEGABGsiCCQAAn9BUiACQf8BSw0AGkFUIANBDEsNABogAkEBaiELIABBBGohCUGAgAQgA0F/anRBEHUhCkEAIQJBASEEQQEgA3QiB0F/aiIMIQUDQCACIAtGRQRAAkAgASACQQF0Ig1qLwEAIgZB//8DRgRAIAkgBUECdGogAjoAAiAFQX9qIQVBASEGDAELIARBACAKIAZBEHRBEHVKGyEECyAIIA1qIAY7AQAgAkEBaiECDAELCyAAIAQ7AQIgACADOwEAIAdBA3YgB0EBdmpBA2ohBkEAIQRBACECA0AgBCALRkUEQCABIARBAXRqLgEAIQpBACEAA0AgACAKTkUEQCAJIAJBAnRqIAQ6AAIDQCACIAZqIAxxIgIgBUsNAAsgAEEBaiEADAELCyAEQQFqIQQMAQsLQX8gAg0AGkEAIQIDfyACIAdGBH9BAAUgCCAJIAJBAnRqIgAtAAJBAXRqIgEgAS8BACIBQQFqOwEAIAAgAyABEBRrIgU6AAMgACABIAVB/wFxdCAHazsBACACQQFqIQIMAQsLCyEFIAhBgARqJAAgBQvjBgEIf0FsIQcCQCACQQNJDQACQAJAAkACQCABLQAAIgNBA3EiCUEBaw4DAwEAAgsgACgCiOEBDQBBYg8LIAJBBUkNAkEDIQYgASgAACEFAn8CQAJAIANBAnZBA3EiCEF+aiIEQQFNBEAgBEEBaw0BDAILIAVBDnZB/wdxIQQgBUEEdkH/B3EhAyAIRQwCCyAFQRJ2IQRBBCEGIAVBBHZB//8AcSEDQQAMAQsgBUEEdkH//w9xIgNBgIAISw0DIAEtAARBCnQgBUEWdnIhBEEFIQZBAAshBSAEIAZqIgogAksNAgJAIANBgQZJDQAgACgCnOIBRQ0AQQAhAgNAIAJBg4ABSw0BIAJBQGshAgwAAAsACwJ/IAlBA0YEQCABIAZqIQEgAEHw4gFqIQIgACgCDCEGIAUEQCACIAMgASAEIAYQXwwCCyACIAMgASAEIAYQXQwBCyAAQbjQAWohAiABIAZqIQEgAEHw4gFqIQYgAEGo0ABqIQggBQRAIAggBiADIAEgBCACEF4MAQsgCCAGIAMgASAEIAIQXAsQAw0CIAAgAzYCgOIBIABBATYCiOEBIAAgAEHw4gFqNgLw4QEgCUECRgRAIAAgAEGo0ABqNgIMCyAAIANqIgBBiOMBakIANwAAIABBgOMBakIANwAAIABB+OIBakIANwAAIABB8OIBakIANwAAIAoPCwJ/AkACQAJAIANBAnZBA3FBf2oiBEECSw0AIARBAWsOAgACAQtBASEEIANBA3YMAgtBAiEEIAEvAABBBHYMAQtBAyEEIAEQIUEEdgsiAyAEaiIFQSBqIAJLBEAgBSACSw0CIABB8OIBaiABIARqIAMQCyEBIAAgAzYCgOIBIAAgATYC8OEBIAEgA2oiAEIANwAYIABCADcAECAAQgA3AAggAEIANwAAIAUPCyAAIAM2AoDiASAAIAEgBGo2AvDhASAFDwsCfwJAAkACQCADQQJ2QQNxQX9qIgRBAksNACAEQQFrDgIAAgELQQEhByADQQN2DAILQQIhByABLwAAQQR2DAELIAJBBEkgARAhIgJBj4CAAUtyDQFBAyEHIAJBBHYLIQIgAEHw4gFqIAEgB2otAAAgAkEgahAQIQEgACACNgKA4gEgACABNgLw4QEgB0EBaiEHCyAHC0sAIABC+erQ0OfJoeThADcDICAAQgA3AxggAELP1tO+0ser2UI3AxAgAELW64Lu6v2J9eAANwMIIABCADcDACAAQShqQQBBKBAQGgviAgICfwV+IABBKGoiASAAKAJIaiECAn4gACkDACIDQiBaBEAgACkDECIEQgeJIAApAwgiBUIBiXwgACkDGCIGQgyJfCAAKQMgIgdCEol8IAUQGSAEEBkgBhAZIAcQGQwBCyAAKQMYQsXP2bLx5brqJ3wLIAN8IQMDQCABQQhqIgAgAk0EQEIAIAEpAAAQCSADhUIbiUKHla+vmLbem55/fkLj3MqV/M7y9YV/fCEDIAAhAQwBCwsCQCABQQRqIgAgAksEQCABIQAMAQsgASgAAK1Ch5Wvr5i23puef34gA4VCF4lCz9bTvtLHq9lCfkL5893xmfaZqxZ8IQMLA0AgACACSQRAIAAxAABCxc/ZsvHluuonfiADhUILiUKHla+vmLbem55/fiEDIABBAWohAAwBCwsgA0IhiCADhULP1tO+0ser2UJ+IgNCHYggA4VC+fPd8Zn2masWfiIDQiCIIAOFC+8CAgJ/BH4gACAAKQMAIAKtfDcDAAJAAkAgACgCSCIDIAJqIgRBH00EQCABRQ0BIAAgA2pBKGogASACECAgACgCSCACaiEEDAELIAEgAmohAgJ/IAMEQCAAQShqIgQgA2ogAUEgIANrECAgACAAKQMIIAQpAAAQCTcDCCAAIAApAxAgACkAMBAJNwMQIAAgACkDGCAAKQA4EAk3AxggACAAKQMgIABBQGspAAAQCTcDICAAKAJIIQMgAEEANgJIIAEgA2tBIGohAQsgAUEgaiACTQsEQCACQWBqIQMgACkDICEFIAApAxghBiAAKQMQIQcgACkDCCEIA0AgCCABKQAAEAkhCCAHIAEpAAgQCSEHIAYgASkAEBAJIQYgBSABKQAYEAkhBSABQSBqIgEgA00NAAsgACAFNwMgIAAgBjcDGCAAIAc3AxAgACAINwMICyABIAJPDQEgAEEoaiABIAIgAWsiBBAgCyAAIAQ2AkgLCy8BAX8gAEUEQEG2f0EAIAMbDwtBun8hBCADIAFNBH8gACACIAMQEBogAwVBun8LCy8BAX8gAEUEQEG2f0EAIAMbDwtBun8hBCADIAFNBH8gACACIAMQCxogAwVBun8LC6gCAQZ/IwBBEGsiByQAIABB2OABaikDAEKAgIAQViEIQbh/IQUCQCAEQf//B0sNACAAIAMgBBBCIgUQAyIGDQAgACgCnOIBIQkgACAHQQxqIAMgAyAFaiAGGyIKIARBACAFIAYbayIGEEAiAxADBEAgAyEFDAELIAcoAgwhBCABRQRAQbp/IQUgBEEASg0BCyAGIANrIQUgAyAKaiEDAkAgCQRAIABBADYCnOIBDAELAkACQAJAIARBBUgNACAAQdjgAWopAwBCgICACFgNAAwBCyAAQQA2ApziAQwBCyAAKAIIED8hBiAAQQA2ApziASAGQRRPDQELIAAgASACIAMgBSAEIAgQOSEFDAELIAAgASACIAMgBSAEIAgQOiEFCyAHQRBqJAAgBQtnACAAQdDgAWogASACIAAoAuzhARAuIgEQAwRAIAEPC0G4fyECAkAgAQ0AIABB7OABaigCACIBBEBBYCECIAAoApjiASABRw0BC0EAIQIgAEHw4AFqKAIARQ0AIABBkOEBahBDCyACCycBAX8QVyIERQRAQUAPCyAEIAAgASACIAMgBBBLEE8hACAEEFYgAAs/AQF/AkACQAJAIAAoAqDiAUEBaiIBQQJLDQAgAUEBaw4CAAECCyAAEDBBAA8LIABBADYCoOIBCyAAKAKU4gELvAMCB38BfiMAQRBrIgkkAEG4fyEGAkAgBCgCACIIQQVBCSAAKALs4QEiBRtJDQAgAygCACIHQQFBBSAFGyAFEC8iBRADBEAgBSEGDAELIAggBUEDakkNACAAIAcgBRBJIgYQAw0AIAEgAmohCiAAQZDhAWohCyAIIAVrIQIgBSAHaiEHIAEhBQNAIAcgAiAJECwiBhADDQEgAkF9aiICIAZJBEBBuH8hBgwCCyAJKAIAIghBAksEQEFsIQYMAgsgB0EDaiEHAn8CQAJAAkAgCEEBaw4CAgABCyAAIAUgCiAFayAHIAYQSAwCCyAFIAogBWsgByAGEEcMAQsgBSAKIAVrIActAAAgCSgCCBBGCyIIEAMEQCAIIQYMAgsgACgC8OABBEAgCyAFIAgQRQsgAiAGayECIAYgB2ohByAFIAhqIQUgCSgCBEUNAAsgACkD0OABIgxCf1IEQEFsIQYgDCAFIAFrrFINAQsgACgC8OABBEBBaiEGIAJBBEkNASALEEQhDCAHKAAAIAynRw0BIAdBBGohByACQXxqIQILIAMgBzYCACAEIAI2AgAgBSABayEGCyAJQRBqJAAgBgsuACAAECsCf0EAQQAQAw0AGiABRSACRXJFBEBBYiAAIAEgAhA9EAMNARoLQQALCzcAIAEEQCAAIAAoAsTgASABKAIEIAEoAghqRzYCnOIBCyAAECtBABADIAFFckUEQCAAIAEQWwsL0QIBB38jAEEQayIGJAAgBiAENgIIIAYgAzYCDCAFBEAgBSgCBCEKIAUoAgghCQsgASEIAkACQANAIAAoAuzhARAWIQsCQANAIAQgC0kNASADKAAAQXBxQdDUtMIBRgRAIAMgBBAiIgcQAw0EIAQgB2shBCADIAdqIQMMAQsLIAYgAzYCDCAGIAQ2AggCQCAFBEAgACAFEE5BACEHQQAQA0UNAQwFCyAAIAogCRBNIgcQAw0ECyAAIAgQUCAMQQFHQQAgACAIIAIgBkEMaiAGQQhqEEwiByIDa0EAIAMQAxtBCkdyRQRAQbh/IQcMBAsgBxADDQMgAiAHayECIAcgCGohCEEBIQwgBigCDCEDIAYoAgghBAwBCwsgBiADNgIMIAYgBDYCCEG4fyEHIAQNASAIIAFrIQcMAQsgBiADNgIMIAYgBDYCCAsgBkEQaiQAIAcLRgECfyABIAAoArjgASICRwRAIAAgAjYCxOABIAAgATYCuOABIAAoArzgASEDIAAgATYCvOABIAAgASADIAJrajYCwOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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";var R=new o,J=R.init();h({async onDecode(g){try{let A=await a(g,{responseType:"arraybuffer"}),Q=new Uint8Array(A);await J;let I=R.decode(Q),B=new TextDecoder().decode(I);return JSON.parse(B)}catch(A){return console.error(A),"error"}}});\n');
7002
+ }
7003
+
7004
+ // src/loader/AibeeLoader/utils.ts
7005
+ function transformGraphicData(data, center2, baseIndex = 0) {
7006
+ data.forEach((item) => {
7007
+ item.geometry.coords = JSON.parse(JSON.stringify(item.geometry.cds));
7008
+ if (item.geometry.type === "polygon") {
7009
+ item.geometry.coords.map((cds) => {
7010
+ if (Array.isArray(cds)) {
7011
+ cds.forEach((coord) => {
7012
+ coord[0] -= center2[0];
7013
+ coord[1] -= center2[1];
7014
+ });
7015
+ }
7016
+ });
7017
+ if (item.geometry.otherCds) {
7018
+ item.geometry.otherCoords = item.geometry.otherCds.map(
7019
+ (cds) => cds.map((item2) => translatePosToCenter(item2, center2))
7020
+ );
7021
+ }
7022
+ } else {
7023
+ item.geometry.coords = translatePosToCenter(item.geometry.cds, center2);
7024
+ }
7025
+ });
7026
+ for (let i = 0; i < data.length; i++) {
7027
+ const item = data[i];
7028
+ item.deltaHeight = 1e-5 * (baseIndex + i + 1);
7029
+ }
7030
+ }
7031
+ function translatePosToCenter(cds, center2) {
7032
+ return [cds[0] - center2[0], cds[1] - center2[1]];
7033
+ }
7034
+
7035
+ // src/loader/AibeeLoader/index.ts
7036
+ var defaultAibeeLoaderOption = {
7037
+ loadRoadNetwork: false
7038
+ };
7039
+ var VersionStoreName = "version";
7040
+ var MapDataStoreName = "map_data";
7041
+ var RoadNetworkDataStoreName = "road_network_data";
7042
+ var AibeeLoader = class {
7043
+ constructor(bmap) {
7044
+ this.bmap = bmap;
7045
+ this.initDb();
7046
+ }
7047
+ placeId = null;
7048
+ canUseZstd = localStorage.getItem("canUseZstd") !== "0";
7049
+ // 是不是可以使用zstd 默认是可以的 如果解压缩失败了就要标记本机不可以使用,之后不在尝试
7050
+ worker = Worker3();
7051
+ async initDb() {
7052
+ try {
7053
+ await createDb();
7054
+ createStore(VersionStoreName);
7055
+ createStore(MapDataStoreName);
7056
+ createStore(RoadNetworkDataStoreName);
7057
+ } catch (e) {
7058
+ console.log("[\u6253\u5F00indexDb\u9519\u8BEF]", e);
7059
+ }
7060
+ }
7061
+ async load(placeId) {
7062
+ this.clear();
7063
+ this.placeId = placeId;
7064
+ }
7065
+ async getFloorData(floor) {
7066
+ if (this.canUseZstd) {
7067
+ const res = await triggerWorker(this.worker, "decode", "");
7068
+ if (res === "error") {
7069
+ this.setCanUseZstd(false);
7070
+ return this.getFloorData(floor);
7071
+ }
7072
+ } else {
7073
+ }
7074
+ return new Floor(this.bmap.context);
7075
+ }
7076
+ async getRoadNetworkData() {
7077
+ }
7078
+ // 空闲时间请求其他数据
7079
+ async getOtherDataByFreeTime() {
7080
+ }
7081
+ // 获取多楼层数据
7082
+ async getMulFloorsData(floor) {
7083
+ return [];
7084
+ }
7085
+ async getDataByUrl(url) {
7086
+ const data = await fetch(url).then((res) => res.json());
7087
+ return this.getDataByJson(data);
7088
+ }
7089
+ getDataByJson(data) {
7090
+ const floor = new Floor(this.bmap.context);
7091
+ let center2 = [0, 0];
7092
+ data.layers.forEach((layer) => {
7093
+ switch (layer.l_type) {
7094
+ case "range":
7095
+ const data2 = layer.elements[0];
7096
+ center2 = [data2.center_x, data2.center_y];
7097
+ break;
7098
+ case "graph":
7099
+ const graphics = [];
7100
+ const graphicMap = /* @__PURE__ */ new Map();
7101
+ transformGraphicData(layer.elements, center2);
7102
+ layer.elements.forEach((options) => {
7103
+ const graphic = floor.addGraphic(options);
7104
+ graphics.push(graphic);
7105
+ graphicMap.set(options.id, graphic);
7106
+ });
7107
+ floor.userData.graphics = graphics;
7108
+ floor.userData.graphicMap = graphicMap;
7109
+ break;
7110
+ case "ground":
7111
+ transformGraphicData(layer.elements, center2);
7112
+ const grounds = layer.elements.map((options) => new Graphic(this.bmap.context, options));
7113
+ floor.addGrounds(grounds);
7114
+ break;
7115
+ case "wall":
7116
+ transformGraphicData(layer.elements, center2);
7117
+ const wallGroup = layer.elements.reduce((obj, options) => {
7118
+ const { fillColor, fillOpacity, strokeColor, strokeOpacity } = options;
7119
+ const key = `${fillColor}-${fillOpacity}-${strokeColor}-${strokeOpacity}`;
7120
+ if (obj[key]) {
7121
+ obj[key].push(options);
7122
+ } else {
7123
+ obj[key] = [options];
7124
+ }
7125
+ return obj;
7126
+ }, {});
7127
+ Object.values(wallGroup).forEach((optionArray) => {
7128
+ const wall = new Wall(this.bmap.context, optionArray);
7129
+ floor.wallLayer.add(wall);
7130
+ });
7131
+ break;
7132
+ case "lane":
7133
+ transformGraphicData(layer.elements, center2);
7134
+ const laneGroup = layer.elements.reduce((obj, options) => {
7135
+ const { fillColor, fillOpacity, strokeColor, strokeOpacity } = options;
7136
+ const key = `${fillColor}-${fillOpacity}-${strokeColor}-${strokeOpacity}`;
7137
+ if (obj[key]) {
7138
+ obj[key].push(options);
7139
+ } else {
7140
+ obj[key] = [options];
7141
+ }
7142
+ return obj;
7143
+ }, {});
7144
+ Object.values(laneGroup).forEach((optionArray) => {
7145
+ const lane = new Lane(this.bmap.context, optionArray);
7146
+ floor.laneLayer.add(lane);
7147
+ });
7148
+ break;
7149
+ case "texture2d":
7150
+ case "texture3d":
7151
+ transformGraphicData(layer.elements, center2);
7152
+ layer.elements.forEach((options) => {
7153
+ const texture = new GroundTexture(this.bmap.context, options);
7154
+ floor.textureLayer.add(texture);
7155
+ });
7156
+ break;
7157
+ case "glb":
7158
+ transformGraphicData(layer.elements, center2);
7159
+ layer.elements.forEach((options) => {
7160
+ const model = new GlbModel(this.bmap.context, {
7161
+ ...options,
7162
+ url: options.secondUrl,
7163
+ rotate: options.secondRotate,
7164
+ width: options.secondWidth
7165
+ });
7166
+ floor.glbModelLayer.add(model);
7167
+ });
7168
+ break;
7169
+ case "store":
7170
+ layer.elements.map((options) => {
7171
+ const pos = translatePosToCenter([options.center_x, options.center_y], center2);
7172
+ floor.poiLayer.createPoi({
7173
+ icon: options.poi_info.icon,
7174
+ texts: [{ text: options.store_name || options.poi_info.name }],
7175
+ position: { x: pos[0], y: pos[1], z: options.airHeight }
7176
+ });
7177
+ });
7178
+ break;
7179
+ case "facility":
7180
+ layer.elements.map((options) => {
7181
+ const pos = translatePosToCenter(options.geometry.cds, center2);
7182
+ floor.poiLayer.createPoi({
7183
+ icon: options.poi_info.icon,
7184
+ texts: [{ text: options.store_name || options.poi_info.name }],
7185
+ position: { x: pos[0], y: pos[1], z: options.airHeight }
7186
+ });
7187
+ });
7188
+ break;
7189
+ case "parkingSpace":
7190
+ transformGraphicData(layer.elements, center2);
7191
+ let parkingSpacesGraphics = [];
7192
+ let parkingSpacesGraphicMap = /* @__PURE__ */ new Map();
7193
+ layer.elements.forEach((options) => {
7194
+ const graphic = floor.addGraphic(options);
7195
+ parkingSpacesGraphics.push(graphic);
7196
+ parkingSpacesGraphicMap.set(options.id, graphic);
7197
+ const pos = translatePosToCenter([options.center_x, options.center_y], center2);
7198
+ floor.poiLayer.createPoi({
7199
+ texts: [{ text: options.poi_info.name }],
7200
+ position: { x: pos[0], y: pos[1], z: options.airHeight }
7201
+ });
7202
+ });
7203
+ floor.userData.parkingSpaces = parkingSpacesGraphics;
7204
+ floor.userData.parkingSpacesGraphicMap = parkingSpacesGraphicMap;
7205
+ break;
7206
+ }
7207
+ });
7208
+ floor.userData.center = center2;
7209
+ floor.userData.height = data.floorHeight;
7210
+ return floor;
7211
+ }
7212
+ clear() {
7213
+ this.placeId = null;
7214
+ }
7215
+ setCanUseZstd(bool) {
7216
+ this.canUseZstd = bool;
7217
+ localStorage.setItem("canUseZstd", "0");
7218
+ }
7219
+ dispose() {
7220
+ this.clear();
7221
+ closeDb();
7222
+ }
7223
+ };
6582
7224
  export {
7225
+ AibeeLoader,
6583
7226
  BMap,
6584
7227
  BaseSvg,
6585
7228
  Context,
6586
7229
  Equipment,
6587
7230
  Events,
6588
7231
  Floor,
7232
+ GlbModel,
6589
7233
  Graphic,
6590
7234
  GraphicLayer,
7235
+ GroundTexture,
6591
7236
  HeatmapElement,
6592
7237
  HooksName,
6593
7238
  HoverHelper,
7239
+ Lane,
6594
7240
  Layer,
6595
7241
  MapTypePolar,
6596
7242
  Model,
7243
+ MulFloors,
6597
7244
  Navigation,
6598
7245
  Overlay,
6599
7246
  PathDirection,
@@ -6608,6 +7255,7 @@ export {
6608
7255
  SvgPolygon,
6609
7256
  Timer,
6610
7257
  UniqueKey,
7258
+ Wall,
6611
7259
  addAlphaToHexColor,
6612
7260
  calc_angle,
6613
7261
  calc_direction,
@@ -6621,7 +7269,9 @@ export {
6621
7269
  createSvg,
6622
7270
  createSvgElement,
6623
7271
  darkenColor,
7272
+ defaultAibeeLoaderOption,
6624
7273
  defaultConfig,
7274
+ defaultOptions4 as defaultOptions,
6625
7275
  dispose,
6626
7276
  disposeLoader,
6627
7277
  distancePointToSegment,
@@ -6665,4 +7315,3 @@ export {
6665
7315
  vector3ToDevice,
6666
7316
  xhrGet
6667
7317
  };
6668
- //# sourceMappingURL=bmap.esm.js.map