@camstack/addon-provider-ecowitt 0.1.8 → 0.1.10
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/addon.js +1257 -1225
- package/dist/addon.mjs +1252 -1224
- package/dist/index.js +6 -2
- package/dist/index.mjs +2 -2
- package/package.json +3 -9
package/dist/addon.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
import { createServer } from "http";
|
|
3
3
|
import { EventEmitter } from "events";
|
|
4
|
+
import { createSocket } from "dgram";
|
|
4
5
|
//#region \0rolldown/runtime.js
|
|
5
6
|
var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
|
|
6
7
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
@@ -4648,7 +4649,7 @@ function preprocess(fn, schema) {
|
|
|
4648
4649
|
});
|
|
4649
4650
|
}
|
|
4650
4651
|
//#endregion
|
|
4651
|
-
//#region ../types/dist/sleep-
|
|
4652
|
+
//#region ../types/dist/sleep-C2M2zF7x.mjs
|
|
4652
4653
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
4653
4654
|
EventCategory["SystemBoot"] = "system.boot";
|
|
4654
4655
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -6216,6 +6217,12 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
|
6216
6217
|
DeviceType["Switch"] = "switch";
|
|
6217
6218
|
DeviceType["Sensor"] = "sensor";
|
|
6218
6219
|
DeviceType["Thermostat"] = "thermostat";
|
|
6220
|
+
/** Air-conditioner / heat-pump climate device (HVAC) — shares the
|
|
6221
|
+
* `climate-control` cap surface with `Thermostat` but renders a
|
|
6222
|
+
* dedicated AC-appropriate control UI (mode chips, fan speed,
|
|
6223
|
+
* independent vertical/horizontal swing). Sources: native Gree, and
|
|
6224
|
+
* reusable by other AC integrations. */
|
|
6225
|
+
DeviceType["Climate"] = "climate";
|
|
6219
6226
|
DeviceType["Button"] = "button";
|
|
6220
6227
|
/** Generic stateless event emitter — carries a device's EXACT declared
|
|
6221
6228
|
* event vocabulary verbatim (no normalization). Installed with the
|
|
@@ -9011,7 +9018,7 @@ var climateControlCapability = {
|
|
|
9011
9018
|
scope: "device",
|
|
9012
9019
|
deviceNative: true,
|
|
9013
9020
|
mode: "singleton",
|
|
9014
|
-
deviceTypes: [DeviceType.Thermostat],
|
|
9021
|
+
deviceTypes: [DeviceType.Thermostat, DeviceType.Climate],
|
|
9015
9022
|
methods: {
|
|
9016
9023
|
setMode: method(object({
|
|
9017
9024
|
deviceId: number().int().nonnegative(),
|
|
@@ -13610,10 +13617,30 @@ var deviceProviderCapability = {
|
|
|
13610
13617
|
type: string()
|
|
13611
13618
|
}))),
|
|
13612
13619
|
supportsDiscovery: method(object({}), boolean()),
|
|
13613
|
-
|
|
13620
|
+
/**
|
|
13621
|
+
* Run a network scan. `params` carries optional provider-specific scan
|
|
13622
|
+
* inputs (e.g. a broadcast address / subnet for cross-subnet discovery),
|
|
13623
|
+
* shaped by `getDiscoveryParamsSchema`. Omitted for the generic scan
|
|
13624
|
+
* (provider uses its local-network default).
|
|
13625
|
+
*/
|
|
13626
|
+
discoverDevices: method(object({ params: record(string(), unknown()).optional() }), array(DiscoveryCandidateSchema), {
|
|
13614
13627
|
kind: "mutation",
|
|
13615
13628
|
auth: "admin"
|
|
13616
13629
|
}),
|
|
13630
|
+
/**
|
|
13631
|
+
* Optional form schema (`ConfigUISchema`) for the EXTRA per-scan inputs a
|
|
13632
|
+
* provider accepts (e.g. Gree's broadcast address for a different subnet).
|
|
13633
|
+
* `null` when the provider takes no extra scan params — the generic
|
|
13634
|
+
* aggregated scan never renders this; the per-integration scan does.
|
|
13635
|
+
*/
|
|
13636
|
+
getDiscoveryParamsSchema: method(object({}), CreationSchemaOutputSchema),
|
|
13637
|
+
/**
|
|
13638
|
+
* The DeviceType this provider creates via manual add (Camera for
|
|
13639
|
+
* Reolink/ONVIF, Container for Gree, Hub for Ecowitt). `null` when the
|
|
13640
|
+
* provider does not support manual creation. Lets the Add-Device dialog
|
|
13641
|
+
* pick the right type instead of assuming Camera.
|
|
13642
|
+
*/
|
|
13643
|
+
getManualCreationType: method(object({}), object({ deviceType: _enum(DeviceType).nullable() })),
|
|
13617
13644
|
adoptDiscoveredDevice: method(object({ candidate: DiscoveryCandidateSchema }), DeviceSummarySchema, {
|
|
13618
13645
|
kind: "mutation",
|
|
13619
13646
|
auth: "admin"
|
|
@@ -13737,9 +13764,23 @@ var BaseDeviceProvider = class extends BaseAddon {
|
|
|
13737
13764
|
async supportsDiscovery() {
|
|
13738
13765
|
return false;
|
|
13739
13766
|
}
|
|
13740
|
-
async discoverDevices() {
|
|
13767
|
+
async discoverDevices(_input) {
|
|
13741
13768
|
return [];
|
|
13742
13769
|
}
|
|
13770
|
+
/** Extra per-scan input form (e.g. a broadcast address for another subnet).
|
|
13771
|
+
* Null = no extra params. Override in providers that support scoped scans. */
|
|
13772
|
+
async getDiscoveryParamsSchema() {
|
|
13773
|
+
return null;
|
|
13774
|
+
}
|
|
13775
|
+
/**
|
|
13776
|
+
* The DeviceType this provider creates via manual add — derived from the
|
|
13777
|
+
* `deviceClasses` map (first registered type). `null` when manual creation is
|
|
13778
|
+
* unsupported. Lets the Add-Device dialog pick the right type per provider.
|
|
13779
|
+
*/
|
|
13780
|
+
async getManualCreationType() {
|
|
13781
|
+
if (!await this.supportsManualCreation()) return { deviceType: null };
|
|
13782
|
+
return { deviceType: Object.values(DeviceType).find((t) => this.deviceClasses[t] !== void 0) ?? null };
|
|
13783
|
+
}
|
|
13743
13784
|
async adoptDiscoveredDevice(_input) {
|
|
13744
13785
|
throw new Error(`${this.providerName} provider does not support discovery-based adoption`);
|
|
13745
13786
|
}
|
|
@@ -14786,83 +14827,34 @@ var GetStateInputSchema = object({
|
|
|
14786
14827
|
* HA: entity_id (returns the cached entity state). */
|
|
14787
14828
|
key: string()
|
|
14788
14829
|
});
|
|
14789
|
-
|
|
14790
|
-
|
|
14791
|
-
|
|
14792
|
-
|
|
14793
|
-
|
|
14794
|
-
|
|
14795
|
-
|
|
14796
|
-
|
|
14797
|
-
|
|
14798
|
-
|
|
14799
|
-
|
|
14800
|
-
|
|
14801
|
-
|
|
14802
|
-
|
|
14803
|
-
|
|
14804
|
-
|
|
14805
|
-
|
|
14806
|
-
|
|
14807
|
-
|
|
14808
|
-
|
|
14809
|
-
|
|
14810
|
-
|
|
14811
|
-
|
|
14812
|
-
|
|
14813
|
-
|
|
14814
|
-
|
|
14815
|
-
|
|
14816
|
-
|
|
14817
|
-
}),
|
|
14818
|
-
/** Read the persisted settings record for a broker (kind-specific
|
|
14819
|
-
* shape). Admin-only — settings may contain secrets. Returns `null`
|
|
14820
|
-
* when the broker id is unknown to the provider (the collection
|
|
14821
|
-
* fallback may route a foreign id to the first provider). */
|
|
14822
|
-
getSettings: method(GetInputSchema, SettingsRecordSchema$1.nullable(), { auth: "admin" }),
|
|
14823
|
-
/** Overwrite the persisted settings record. The kind-specific
|
|
14824
|
-
* provider validates the shape and applies the change (reconnects
|
|
14825
|
-
* if credentials changed). */
|
|
14826
|
-
setSettings: method(object({
|
|
14827
|
-
id: string(),
|
|
14828
|
-
settings: SettingsRecordSchema$1
|
|
14829
|
-
}), _void(), {
|
|
14830
|
-
kind: "mutation",
|
|
14831
|
-
auth: "admin"
|
|
14832
|
-
}),
|
|
14833
|
-
/** Returns the kind-specific connection config the consumer needs
|
|
14834
|
-
* to open its own client (MQTT pattern: `{url, username, password,
|
|
14835
|
-
* clientIdPrefix}`). HA providers MAY return the auth envelope
|
|
14836
|
-
* but typical HA consumers use `publish` / `subscribe` instead.
|
|
14837
|
-
* Returns `null` when the broker id is unknown to the provider. */
|
|
14838
|
-
getBrokerConfig: method(GetInputSchema, SettingsRecordSchema$1.nullable(), { auth: "admin" }),
|
|
14839
|
-
getSettingsSchema: method(SettingsSchemaInputSchema, SettingsSchemaResultSchema, { auth: "admin" }),
|
|
14840
|
-
testSettings: method(TestSettingsInputSchema, TestSettingsResultSchema, {
|
|
14841
|
-
kind: "mutation",
|
|
14842
|
-
auth: "admin"
|
|
14843
|
-
}),
|
|
14844
|
-
publish: method(PublishInputSchema, unknown(), {
|
|
14845
|
-
kind: "mutation",
|
|
14846
|
-
auth: "admin"
|
|
14847
|
-
}),
|
|
14848
|
-
subscribe: method(SubscribeInputSchema, SubscribeResultSchema, {
|
|
14849
|
-
kind: "mutation",
|
|
14850
|
-
auth: "admin"
|
|
14851
|
-
}),
|
|
14852
|
-
unsubscribe: method(UnsubscribeInputSchema, _void(), {
|
|
14853
|
-
kind: "mutation",
|
|
14854
|
-
auth: "admin"
|
|
14855
|
-
}),
|
|
14856
|
-
/** Read the broker's cached state for a key. Returns `null` when
|
|
14857
|
-
* unknown to the broker (never published / unknown entity). */
|
|
14858
|
-
getState: method(GetStateInputSchema, unknown().nullable()),
|
|
14859
|
-
/** Status method — explicit registration with a `z.void()` input so
|
|
14860
|
-
* the codegen-generated tRPC router types its input as
|
|
14861
|
-
* `{addonId?: string, nodeId?: string}` (system-scoped collection
|
|
14862
|
-
* shape) instead of the device-scoped `{deviceId}` fallback. */
|
|
14863
|
-
getStatus: method(_void(), RegistryStatusSchema)
|
|
14864
|
-
}
|
|
14865
|
-
};
|
|
14830
|
+
method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, BrokerInfoSchema$1.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
|
|
14831
|
+
kind: "mutation",
|
|
14832
|
+
auth: "admin"
|
|
14833
|
+
}), method(RemoveInputSchema, _void(), {
|
|
14834
|
+
kind: "mutation",
|
|
14835
|
+
auth: "admin"
|
|
14836
|
+
}), method(GetInputSchema, TestConnectionResultSchema, {
|
|
14837
|
+
kind: "mutation",
|
|
14838
|
+
auth: "admin"
|
|
14839
|
+
}), method(GetInputSchema, SettingsRecordSchema$1.nullable(), { auth: "admin" }), method(object({
|
|
14840
|
+
id: string(),
|
|
14841
|
+
settings: SettingsRecordSchema$1
|
|
14842
|
+
}), _void(), {
|
|
14843
|
+
kind: "mutation",
|
|
14844
|
+
auth: "admin"
|
|
14845
|
+
}), method(GetInputSchema, SettingsRecordSchema$1.nullable(), { auth: "admin" }), method(SettingsSchemaInputSchema, SettingsSchemaResultSchema, { auth: "admin" }), method(TestSettingsInputSchema, TestSettingsResultSchema, {
|
|
14846
|
+
kind: "mutation",
|
|
14847
|
+
auth: "admin"
|
|
14848
|
+
}), method(PublishInputSchema, unknown(), {
|
|
14849
|
+
kind: "mutation",
|
|
14850
|
+
auth: "admin"
|
|
14851
|
+
}), method(SubscribeInputSchema, SubscribeResultSchema, {
|
|
14852
|
+
kind: "mutation",
|
|
14853
|
+
auth: "admin"
|
|
14854
|
+
}), method(UnsubscribeInputSchema, _void(), {
|
|
14855
|
+
kind: "mutation",
|
|
14856
|
+
auth: "admin"
|
|
14857
|
+
}), method(GetStateInputSchema, unknown().nullable()), method(_void(), RegistryStatusSchema);
|
|
14866
14858
|
DeviceType.Camera;
|
|
14867
14859
|
/**
|
|
14868
14860
|
* `custom-model-registry` — collection cap exposing operator-registered
|
|
@@ -15098,36 +15090,19 @@ var ResyncResultSchema = object({
|
|
|
15098
15090
|
* provider re-derived the device. 0/absent for a normal incremental re-sync. */
|
|
15099
15091
|
removedChildren: number().int().nonnegative().optional()
|
|
15100
15092
|
});
|
|
15101
|
-
|
|
15102
|
-
|
|
15103
|
-
|
|
15104
|
-
|
|
15105
|
-
|
|
15106
|
-
|
|
15107
|
-
|
|
15108
|
-
|
|
15109
|
-
|
|
15110
|
-
|
|
15111
|
-
|
|
15112
|
-
|
|
15113
|
-
|
|
15114
|
-
kind: "mutation",
|
|
15115
|
-
auth: "admin"
|
|
15116
|
-
}),
|
|
15117
|
-
adopt: method(AdoptInputSchema, AdoptResultSchema, {
|
|
15118
|
-
kind: "mutation",
|
|
15119
|
-
auth: "admin"
|
|
15120
|
-
}),
|
|
15121
|
-
release: method(ReleaseInputSchema, _void(), {
|
|
15122
|
-
kind: "mutation",
|
|
15123
|
-
auth: "admin"
|
|
15124
|
-
}),
|
|
15125
|
-
resync: method(ResyncInputSchema, ResyncResultSchema, {
|
|
15126
|
-
kind: "mutation",
|
|
15127
|
-
auth: "admin"
|
|
15128
|
-
})
|
|
15129
|
-
}
|
|
15130
|
-
};
|
|
15093
|
+
method(object({ integrationId: string() }), object({ filters: array(AdoptionFilterSchema) }), { auth: "admin" }), method(ListCandidatesInputSchema, ListCandidatesOutputSchema, { auth: "admin" }), method(GetCandidateInputSchema, DiscoveredChildDeviceSchema.nullable(), { auth: "admin" }), method(object({ integrationId: string() }), AdoptionStatusSchema, {
|
|
15094
|
+
kind: "mutation",
|
|
15095
|
+
auth: "admin"
|
|
15096
|
+
}), method(AdoptInputSchema, AdoptResultSchema, {
|
|
15097
|
+
kind: "mutation",
|
|
15098
|
+
auth: "admin"
|
|
15099
|
+
}), method(ReleaseInputSchema, _void(), {
|
|
15100
|
+
kind: "mutation",
|
|
15101
|
+
auth: "admin"
|
|
15102
|
+
}), method(ResyncInputSchema, ResyncResultSchema, {
|
|
15103
|
+
kind: "mutation",
|
|
15104
|
+
auth: "admin"
|
|
15105
|
+
});
|
|
15131
15106
|
/**
|
|
15132
15107
|
* `device-export` — collection cap for addons that export camstack
|
|
15133
15108
|
* devices to external ecosystems (HomeAssistant via MQTT discovery,
|
|
@@ -15650,7 +15625,10 @@ method(object({
|
|
|
15650
15625
|
}), FieldProbeResultSchema, {
|
|
15651
15626
|
kind: "mutation",
|
|
15652
15627
|
auth: "admin"
|
|
15653
|
-
}), method(
|
|
15628
|
+
}), method(object({
|
|
15629
|
+
addonId: string(),
|
|
15630
|
+
integrationId: string()
|
|
15631
|
+
}), object({ filters: array(AdoptionFilterSchema) }), { auth: "admin" }), method(ListCandidatesInputSchema.extend({ addonId: string() }), ListCandidatesOutputSchema, { auth: "admin" }), method(object({
|
|
15654
15632
|
addonId: string(),
|
|
15655
15633
|
integrationId: string()
|
|
15656
15634
|
}), AdoptionStatusSchema, {
|
|
@@ -15665,7 +15643,24 @@ method(object({
|
|
|
15665
15643
|
}), method(ResyncInputSchema, ResyncResultSchema, {
|
|
15666
15644
|
kind: "mutation",
|
|
15667
15645
|
auth: "admin"
|
|
15646
|
+
}), method(object({}), object({ providers: array(object({
|
|
15647
|
+
addonId: string(),
|
|
15648
|
+
label: string()
|
|
15649
|
+
})).readonly() }), { auth: "admin" }), method(object({}), object({ groups: array(object({
|
|
15650
|
+
addonId: string(),
|
|
15651
|
+
label: string(),
|
|
15652
|
+
candidates: array(DiscoveryCandidateSchema).readonly(),
|
|
15653
|
+
error: string().nullable()
|
|
15654
|
+
})).readonly() }), {
|
|
15655
|
+
kind: "mutation",
|
|
15656
|
+
auth: "admin"
|
|
15668
15657
|
}), method(object({
|
|
15658
|
+
addonId: string(),
|
|
15659
|
+
params: record(string(), unknown()).optional()
|
|
15660
|
+
}), object({ candidates: array(DiscoveryCandidateSchema).readonly() }), {
|
|
15661
|
+
kind: "mutation",
|
|
15662
|
+
auth: "admin"
|
|
15663
|
+
}), method(object({ addonId: string() }), object({ deviceType: _enum(DeviceType).nullable() }), { auth: "admin" }), method(object({ addonId: string() }), unknown(), { auth: "admin" }), method(object({
|
|
15669
15664
|
deviceId: number(),
|
|
15670
15665
|
key: string(),
|
|
15671
15666
|
value: unknown()
|
|
@@ -18317,6 +18312,17 @@ var AvailableIntegrationTypeSchema = object({
|
|
|
18317
18312
|
iconUrl: string().nullable(),
|
|
18318
18313
|
color: string(),
|
|
18319
18314
|
instanceMode: string(),
|
|
18315
|
+
/**
|
|
18316
|
+
* Integration wizard `mode` (LOCKED MODEL): `standalone` (create
|
|
18317
|
+
* immediately then add devices, no config step/button), `account` (config
|
|
18318
|
+
* step), or `broker` (broker step). Derived server-side by
|
|
18319
|
+
* `getAvailableTypes` when the addon manifest omits an explicit `mode`.
|
|
18320
|
+
*/
|
|
18321
|
+
mode: _enum([
|
|
18322
|
+
"standalone",
|
|
18323
|
+
"account",
|
|
18324
|
+
"broker"
|
|
18325
|
+
]),
|
|
18320
18326
|
discoveryMode: string(),
|
|
18321
18327
|
/**
|
|
18322
18328
|
* Which integration-marker cap the addon declared, so the wizard can
|
|
@@ -20777,6 +20783,12 @@ Object.freeze({
|
|
|
20777
20783
|
addonId: null,
|
|
20778
20784
|
access: "create"
|
|
20779
20785
|
},
|
|
20786
|
+
"deviceManager.adoptionListCandidateFilters": {
|
|
20787
|
+
capName: "device-manager",
|
|
20788
|
+
capScope: "system",
|
|
20789
|
+
addonId: null,
|
|
20790
|
+
access: "view"
|
|
20791
|
+
},
|
|
20780
20792
|
"deviceManager.adoptionListCandidates": {
|
|
20781
20793
|
capName: "device-manager",
|
|
20782
20794
|
capScope: "system",
|
|
@@ -20825,12 +20837,30 @@ Object.freeze({
|
|
|
20825
20837
|
addonId: null,
|
|
20826
20838
|
access: "create"
|
|
20827
20839
|
},
|
|
20840
|
+
"deviceManager.discoverAllProviders": {
|
|
20841
|
+
capName: "device-manager",
|
|
20842
|
+
capScope: "system",
|
|
20843
|
+
addonId: null,
|
|
20844
|
+
access: "create"
|
|
20845
|
+
},
|
|
20828
20846
|
"deviceManager.discoverDevices": {
|
|
20829
20847
|
capName: "device-manager",
|
|
20830
20848
|
capScope: "system",
|
|
20831
20849
|
addonId: null,
|
|
20832
20850
|
access: "create"
|
|
20833
20851
|
},
|
|
20852
|
+
"deviceManager.discoverProvider": {
|
|
20853
|
+
capName: "device-manager",
|
|
20854
|
+
capScope: "system",
|
|
20855
|
+
addonId: null,
|
|
20856
|
+
access: "create"
|
|
20857
|
+
},
|
|
20858
|
+
"deviceManager.discoveryProviders": {
|
|
20859
|
+
capName: "device-manager",
|
|
20860
|
+
capScope: "system",
|
|
20861
|
+
addonId: null,
|
|
20862
|
+
access: "view"
|
|
20863
|
+
},
|
|
20834
20864
|
"deviceManager.enable": {
|
|
20835
20865
|
capName: "device-manager",
|
|
20836
20866
|
capScope: "system",
|
|
@@ -20981,6 +21011,18 @@ Object.freeze({
|
|
|
20981
21011
|
addonId: null,
|
|
20982
21012
|
access: "create"
|
|
20983
21013
|
},
|
|
21014
|
+
"deviceManager.providerCreationType": {
|
|
21015
|
+
capName: "device-manager",
|
|
21016
|
+
capScope: "system",
|
|
21017
|
+
addonId: null,
|
|
21018
|
+
access: "view"
|
|
21019
|
+
},
|
|
21020
|
+
"deviceManager.providerDiscoveryParamsSchema": {
|
|
21021
|
+
capName: "device-manager",
|
|
21022
|
+
capScope: "system",
|
|
21023
|
+
addonId: null,
|
|
21024
|
+
access: "view"
|
|
21025
|
+
},
|
|
20984
21026
|
"deviceManager.registerDevice": {
|
|
20985
21027
|
capName: "device-manager",
|
|
20986
21028
|
capScope: "system",
|
|
@@ -21197,6 +21239,18 @@ Object.freeze({
|
|
|
21197
21239
|
addonId: null,
|
|
21198
21240
|
access: "view"
|
|
21199
21241
|
},
|
|
21242
|
+
"deviceProvider.getDiscoveryParamsSchema": {
|
|
21243
|
+
capName: "device-provider",
|
|
21244
|
+
capScope: "system",
|
|
21245
|
+
addonId: null,
|
|
21246
|
+
access: "view"
|
|
21247
|
+
},
|
|
21248
|
+
"deviceProvider.getManualCreationType": {
|
|
21249
|
+
capName: "device-provider",
|
|
21250
|
+
capScope: "system",
|
|
21251
|
+
addonId: null,
|
|
21252
|
+
access: "view"
|
|
21253
|
+
},
|
|
21200
21254
|
"deviceProvider.getStatus": {
|
|
21201
21255
|
capName: "device-provider",
|
|
21202
21256
|
capScope: "system",
|
|
@@ -24035,7 +24089,7 @@ object({
|
|
|
24035
24089
|
schemaVersion: literal(1)
|
|
24036
24090
|
});
|
|
24037
24091
|
//#endregion
|
|
24038
|
-
//#region
|
|
24092
|
+
//#region node_modules/undici/lib/core/symbols.js
|
|
24039
24093
|
var require_symbols$4 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
24040
24094
|
module.exports = {
|
|
24041
24095
|
kClose: Symbol("close"),
|
|
@@ -24106,7 +24160,7 @@ var require_symbols$4 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
24106
24160
|
};
|
|
24107
24161
|
}));
|
|
24108
24162
|
//#endregion
|
|
24109
|
-
//#region
|
|
24163
|
+
//#region node_modules/undici/lib/core/errors.js
|
|
24110
24164
|
var require_errors = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
24111
24165
|
var kUndiciError = Symbol.for("undici.error.UND_ERR");
|
|
24112
24166
|
var UndiciError = class extends Error {
|
|
@@ -24464,7 +24518,7 @@ var require_errors = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
24464
24518
|
};
|
|
24465
24519
|
}));
|
|
24466
24520
|
//#endregion
|
|
24467
|
-
//#region
|
|
24521
|
+
//#region node_modules/undici/lib/core/constants.js
|
|
24468
24522
|
var require_constants$4 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
24469
24523
|
/** @type {Record<string, string | undefined>} */
|
|
24470
24524
|
var headerNameLowerCasedRecord = {};
|
|
@@ -24577,7 +24631,7 @@ var require_constants$4 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
24577
24631
|
};
|
|
24578
24632
|
}));
|
|
24579
24633
|
//#endregion
|
|
24580
|
-
//#region
|
|
24634
|
+
//#region node_modules/undici/lib/core/tree.js
|
|
24581
24635
|
var require_tree = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
24582
24636
|
var { wellknownHeaderNames, headerNameLowerCasedRecord } = require_constants$4();
|
|
24583
24637
|
var TstNode = class TstNode {
|
|
@@ -24687,7 +24741,7 @@ var require_tree = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
24687
24741
|
};
|
|
24688
24742
|
}));
|
|
24689
24743
|
//#endregion
|
|
24690
|
-
//#region
|
|
24744
|
+
//#region node_modules/undici/lib/core/util.js
|
|
24691
24745
|
var require_util$7 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
24692
24746
|
var assert$26 = __require("node:assert");
|
|
24693
24747
|
var { kDestroyed, kBodyUsed, kListeners, kBody } = require_symbols$4();
|
|
@@ -25141,7 +25195,7 @@ var require_util$7 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
25141
25195
|
};
|
|
25142
25196
|
}));
|
|
25143
25197
|
//#endregion
|
|
25144
|
-
//#region
|
|
25198
|
+
//#region node_modules/undici/lib/core/diagnostics.js
|
|
25145
25199
|
var require_diagnostics = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
25146
25200
|
var diagnosticsChannel = __require("node:diagnostics_channel");
|
|
25147
25201
|
var util$2 = __require("node:util");
|
|
@@ -25238,7 +25292,7 @@ var require_diagnostics = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
25238
25292
|
module.exports = { channels };
|
|
25239
25293
|
}));
|
|
25240
25294
|
//#endregion
|
|
25241
|
-
//#region
|
|
25295
|
+
//#region node_modules/undici/lib/core/request.js
|
|
25242
25296
|
var require_request$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
25243
25297
|
var { InvalidArgumentError, NotSupportedError } = require_errors();
|
|
25244
25298
|
var assert$25 = __require("node:assert");
|
|
@@ -25457,7 +25511,7 @@ var require_request$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
25457
25511
|
module.exports = Request;
|
|
25458
25512
|
}));
|
|
25459
25513
|
//#endregion
|
|
25460
|
-
//#region
|
|
25514
|
+
//#region node_modules/undici/lib/dispatcher/dispatcher.js
|
|
25461
25515
|
var require_dispatcher = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
25462
25516
|
var EventEmitter$1 = __require("node:events");
|
|
25463
25517
|
var Dispatcher = class extends EventEmitter$1 {
|
|
@@ -25503,7 +25557,7 @@ var require_dispatcher = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
25503
25557
|
module.exports = Dispatcher;
|
|
25504
25558
|
}));
|
|
25505
25559
|
//#endregion
|
|
25506
|
-
//#region
|
|
25560
|
+
//#region node_modules/undici/lib/dispatcher/dispatcher-base.js
|
|
25507
25561
|
var require_dispatcher_base = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
25508
25562
|
var Dispatcher = require_dispatcher();
|
|
25509
25563
|
var { ClientDestroyedError, ClientClosedError, InvalidArgumentError } = require_errors();
|
|
@@ -25625,7 +25679,7 @@ var require_dispatcher_base = /* @__PURE__ */ __commonJSMin(((exports, module) =
|
|
|
25625
25679
|
module.exports = DispatcherBase;
|
|
25626
25680
|
}));
|
|
25627
25681
|
//#endregion
|
|
25628
|
-
//#region
|
|
25682
|
+
//#region node_modules/undici/lib/util/timers.js
|
|
25629
25683
|
var require_timers = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
25630
25684
|
/**
|
|
25631
25685
|
* This module offers an optimized timer implementation designed for scenarios
|
|
@@ -25963,7 +26017,7 @@ var require_timers = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
25963
26017
|
};
|
|
25964
26018
|
}));
|
|
25965
26019
|
//#endregion
|
|
25966
|
-
//#region
|
|
26020
|
+
//#region node_modules/undici/lib/core/connect.js
|
|
25967
26021
|
var require_connect = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
25968
26022
|
var net$1 = __require("node:net");
|
|
25969
26023
|
var assert$24 = __require("node:assert");
|
|
@@ -26133,7 +26187,7 @@ var require_connect = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
26133
26187
|
module.exports = buildConnector;
|
|
26134
26188
|
}));
|
|
26135
26189
|
//#endregion
|
|
26136
|
-
//#region
|
|
26190
|
+
//#region node_modules/undici/lib/llhttp/utils.js
|
|
26137
26191
|
var require_utils = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
26138
26192
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26139
26193
|
exports.enumToMap = void 0;
|
|
@@ -26148,7 +26202,7 @@ var require_utils = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
26148
26202
|
exports.enumToMap = enumToMap;
|
|
26149
26203
|
}));
|
|
26150
26204
|
//#endregion
|
|
26151
|
-
//#region
|
|
26205
|
+
//#region node_modules/undici/lib/llhttp/constants.js
|
|
26152
26206
|
var require_constants$3 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
26153
26207
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26154
26208
|
exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0;
|
|
@@ -26481,19 +26535,19 @@ var require_constants$3 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
26481
26535
|
};
|
|
26482
26536
|
}));
|
|
26483
26537
|
//#endregion
|
|
26484
|
-
//#region
|
|
26538
|
+
//#region node_modules/undici/lib/llhttp/llhttp-wasm.js
|
|
26485
26539
|
var require_llhttp_wasm = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
26486
26540
|
var { Buffer: Buffer$2 } = __require("node:buffer");
|
|
26487
26541
|
module.exports = Buffer$2.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB9ysPC0GQMQ8LQdcxDwtBoi0PC0HUJw8LQeArDwtBnywPC0HrMQ8LQdUfDwtByjEPC0HeJQ8LQdQeDwtB9BwPC0GnMg8LQbEdDwtBoB0PC0G5MQ8LQbwwDwtBkiEPC0GzJg8LQeksDwtBrB4PC0HUKw8LQfcmDwtBgCYPC0GwIQ8LQf4eDwtBjSMPC0GJLQ8LQfciDwtBoDEPC0GuHw8LQcYlDwtB6B4PC0GTIg8LQcIvDwtBwx0PC0GLLA8LQeEdDwtBjS8PC0HqIQ8LQbQtDwtB0i8PC0HfMg8LQdIyDwtB8DAPC0GpIg8LQfkjDwtBmR4PC0G1LA8LQZswDwtBkjIPC0G2Kw8LQcIiDwtB+DIPC0GeJQ8LQdAiDwtBuh4PC0GBHg8LAAtB1iEhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCz4BAn8CQCAAKAI4IgNFDQAgAygCBCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABBxhE2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCCCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABB9go2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCDCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABB7Ro2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCECIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABBlRA2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCFCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABBqhs2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCGCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABB7RM2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCKCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABB9gg2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCHCIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABBwhk2AhBBGCEECyAECz4BAn8CQCAAKAI4IgNFDQAgAygCICIDRQ0AIAAgASACIAFrIAMRAQAiBEF/Rw0AIABBlBQ2AhBBGCEECyAEC1kBAn8CQCAALQAoQQFGDQAgAC8BMiIBQeQAa0HkAEkNACABQcwBRg0AIAFBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhAiAAQYgEcUGABEYNACAAQShxRSECCyACC4wBAQJ/AkACQAJAIAAtACpFDQAgAC0AK0UNACAALwEwIgFBAnFFDQEMAgsgAC8BMCIBQQFxRQ0BC0EBIQIgAC0AKEEBRg0AIAAvATIiAEHkAGtB5ABJDQAgAEHMAUYNACAAQbACRg0AIAFBwABxDQBBACECIAFBiARxQYAERg0AIAFBKHFBAEchAgsgAgtXACAAQRhqQgA3AwAgAEIANwMAIABBOGpCADcDACAAQTBqQgA3AwAgAEEoakIANwMAIABBIGpCADcDACAAQRBqQgA3AwAgAEEIakIANwMAIABB3QE2AhwLBgAgABAyC5otAQt/IwBBEGsiCiQAQaTQACgCACIJRQRAQeTTACgCACIFRQRAQfDTAEJ/NwIAQejTAEKAgISAgIDAADcCAEHk0wAgCkEIakFwcUHYqtWqBXMiBTYCAEH40wBBADYCAEHI0wBBADYCAAtBzNMAQYDUBDYCAEGc0ABBgNQENgIAQbDQACAFNgIAQazQAEF/NgIAQdDTAEGArAM2AgADQCABQcjQAGogAUG80ABqIgI2AgAgAiABQbTQAGoiAzYCACABQcDQAGogAzYCACABQdDQAGogAUHE0ABqIgM2AgAgAyACNgIAIAFB2NAAaiABQczQAGoiAjYCACACIAM2AgAgAUHU0ABqIAI2AgAgAUEgaiIBQYACRw0AC0GM1ARBwasDNgIAQajQAEH00wAoAgA2AgBBmNAAQcCrAzYCAEGk0ABBiNQENgIAQcz/B0E4NgIAQYjUBCEJCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFNBEBBjNAAKAIAIgZBECAAQRNqQXBxIABBC0kbIgRBA3YiAHYiAUEDcQRAAkAgAUEBcSAAckEBcyICQQN0IgBBtNAAaiIBIABBvNAAaigCACIAKAIIIgNGBEBBjNAAIAZBfiACd3E2AgAMAQsgASADNgIIIAMgATYCDAsgAEEIaiEBIAAgAkEDdCICQQNyNgIEIAAgAmoiACAAKAIEQQFyNgIEDBELQZTQACgCACIIIARPDQEgAQRAAkBBAiAAdCICQQAgAmtyIAEgAHRxaCIAQQN0IgJBtNAAaiIBIAJBvNAAaigCACICKAIIIgNGBEBBjNAAIAZBfiAAd3EiBjYCAAwBCyABIAM2AgggAyABNgIMCyACIARBA3I2AgQgAEEDdCIAIARrIQUgACACaiAFNgIAIAIgBGoiBCAFQQFyNgIEIAgEQCAIQXhxQbTQAGohAEGg0AAoAgAhAwJ/QQEgCEEDdnQiASAGcUUEQEGM0AAgASAGcjYCACAADAELIAAoAggLIgEgAzYCDCAAIAM2AgggAyAANgIMIAMgATYCCAsgAkEIaiEBQaDQACAENgIAQZTQACAFNgIADBELQZDQACgCACILRQ0BIAtoQQJ0QbzSAGooAgAiACgCBEF4cSAEayEFIAAhAgNAAkAgAigCECIBRQRAIAJBFGooAgAiAUUNAQsgASgCBEF4cSAEayIDIAVJIQIgAyAFIAIbIQUgASAAIAIbIQAgASECDAELCyAAKAIYIQkgACgCDCIDIABHBEBBnNAAKAIAGiADIAAoAggiATYCCCABIAM2AgwMEAsgAEEUaiICKAIAIgFFBEAgACgCECIBRQ0DIABBEGohAgsDQCACIQcgASIDQRRqIgIoAgAiAQ0AIANBEGohAiADKAIQIgENAAsgB0EANgIADA8LQX8hBCAAQb9/Sw0AIABBE2oiAUFwcSEEQZDQACgCACIIRQ0AQQAgBGshBQJAAkACQAJ/QQAgBEGAAkkNABpBHyAEQf///wdLDQAaIARBJiABQQh2ZyIAa3ZBAXEgAEEBdGtBPmoLIgZBAnRBvNIAaigCACICRQRAQQAhAUEAIQMMAQtBACEBIARBGSAGQQF2a0EAIAZBH0cbdCEAQQAhAwNAAkAgAigCBEF4cSAEayIHIAVPDQAgAiEDIAciBQ0AQQAhBSACIQEMAwsgASACQRRqKAIAIgcgByACIABBHXZBBHFqQRBqKAIAIgJGGyABIAcbIQEgAEEBdCEAIAINAAsLIAEgA3JFBEBBACEDQQIgBnQiAEEAIABrciAIcSIARQ0DIABoQQJ0QbzSAGooAgAhAQsgAUUNAQsDQCABKAIEQXhxIARrIgIgBUkhACACIAUgABshBSABIAMgABshAyABKAIQIgAEfyAABSABQRRqKAIACyIBDQALCyADRQ0AIAVBlNAAKAIAIARrTw0AIAMoAhghByADIAMoAgwiAEcEQEGc0AAoAgAaIAAgAygCCCIBNgIIIAEgADYCDAwOCyADQRRqIgIoAgAiAUUEQCADKAIQIgFFDQMgA0EQaiECCwNAIAIhBiABIgBBFGoiAigCACIBDQAgAEEQaiECIAAoAhAiAQ0ACyAGQQA2AgAMDQtBlNAAKAIAIgMgBE8EQEGg0AAoAgAhAQJAIAMgBGsiAkEQTwRAIAEgBGoiACACQQFyNgIEIAEgA2ogAjYCACABIARBA3I2AgQMAQsgASADQQNyNgIEIAEgA2oiACAAKAIEQQFyNgIEQQAhAEEAIQILQZTQACACNgIAQaDQACAANgIAIAFBCGohAQwPC0GY0AAoAgAiAyAESwRAIAQgCWoiACADIARrIgFBAXI2AgRBpNAAIAA2AgBBmNAAIAE2AgAgCSAEQQNyNgIEIAlBCGohAQwPC0EAIQEgBAJ/QeTTACgCAARAQezTACgCAAwBC0Hw0wBCfzcCAEHo0wBCgICEgICAwAA3AgBB5NMAIApBDGpBcHFB2KrVqgVzNgIAQfjTAEEANgIAQcjTAEEANgIAQYCABAsiACAEQccAaiIFaiIGQQAgAGsiB3EiAk8EQEH80wBBMDYCAAwPCwJAQcTTACgCACIBRQ0AQbzTACgCACIIIAJqIQAgACABTSAAIAhLcQ0AQQAhAUH80wBBMDYCAAwPC0HI0wAtAABBBHENBAJAAkAgCQRAQczTACEBA0AgASgCACIAIAlNBEAgACABKAIEaiAJSw0DCyABKAIIIgENAAsLQQAQMyIAQX9GDQUgAiEGQejTACgCACIBQQFrIgMgAHEEQCACIABrIAAgA2pBACABa3FqIQYLIAQgBk8NBSAGQf7///8HSw0FQcTTACgCACIDBEBBvNMAKAIAIgcgBmohASABIAdNDQYgASADSw0GCyAGEDMiASAARw0BDAcLIAYgA2sgB3EiBkH+////B0sNBCAGEDMhACAAIAEoAgAgASgCBGpGDQMgACEBCwJAIAYgBEHIAGpPDQAgAUF/Rg0AQezTACgCACIAIAUgBmtqQQAgAGtxIgBB/v///wdLBEAgASEADAcLIAAQM0F/RwRAIAAgBmohBiABIQAMBwtBACAGaxAzGgwECyABIgBBf0cNBQwDC0EAIQMMDAtBACEADAoLIABBf0cNAgtByNMAQcjTACgCAEEEcjYCAAsgAkH+////B0sNASACEDMhAEEAEDMhASAAQX9GDQEgAUF/Rg0BIAAgAU8NASABIABrIgYgBEE4ak0NAQtBvNMAQbzTACgCACAGaiIBNgIAQcDTACgCACABSQRAQcDTACABNgIACwJAAkACQEGk0AAoAgAiAgRAQczTACEBA0AgACABKAIAIgMgASgCBCIFakYNAiABKAIIIgENAAsMAgtBnNAAKAIAIgFBAEcgACABT3FFBEBBnNAAIAA2AgALQQAhAUHQ0wAgBjYCAEHM0wAgADYCAEGs0ABBfzYCAEGw0ABB5NMAKAIANgIAQdjTAEEANgIAA0AgAUHI0ABqIAFBvNAAaiICNgIAIAIgAUG00ABqIgM2AgAgAUHA0ABqIAM2AgAgAUHQ0ABqIAFBxNAAaiIDNgIAIAMgAjYCACABQdjQAGogAUHM0ABqIgI2AgAgAiADNgIAIAFB1NAAaiACNgIAIAFBIGoiAUGAAkcNAAtBeCAAa0EPcSIBIABqIgIgBkE4ayIDIAFrIgFBAXI2AgRBqNAAQfTTACgCADYCAEGY0AAgATYCAEGk0AAgAjYCACAAIANqQTg2AgQMAgsgACACTQ0AIAIgA0kNACABKAIMQQhxDQBBeCACa0EPcSIAIAJqIgNBmNAAKAIAIAZqIgcgAGsiAEEBcjYCBCABIAUgBmo2AgRBqNAAQfTTACgCADYCAEGY0AAgADYCAEGk0AAgAzYCACACIAdqQTg2AgQMAQsgAEGc0AAoAgBJBEBBnNAAIAA2AgALIAAgBmohA0HM0wAhAQJAAkACQANAIAMgASgCAEcEQCABKAIIIgENAQwCCwsgAS0ADEEIcUUNAQtBzNMAIQEDQCABKAIAIgMgAk0EQCADIAEoAgRqIgUgAksNAwsgASgCCCEBDAALAAsgASAANgIAIAEgASgCBCAGajYCBCAAQXggAGtBD3FqIgkgBEEDcjYCBCADQXggA2tBD3FqIgYgBCAJaiIEayEBIAIgBkYEQEGk0AAgBDYCAEGY0ABBmNAAKAIAIAFqIgA2AgAgBCAAQQFyNgIEDAgLQaDQACgCACAGRgRAQaDQACAENgIAQZTQAEGU0AAoAgAgAWoiADYCACAEIABBAXI2AgQgACAEaiAANgIADAgLIAYoAgQiBUEDcUEBRw0GIAVBeHEhCCAFQf8BTQRAIAVBA3YhAyAGKAIIIgAgBigCDCICRgRAQYzQAEGM0AAoAgBBfiADd3E2AgAMBwsgAiAANgIIIAAgAjYCDAwGCyAGKAIYIQcgBiAGKAIMIgBHBEAgACAGKAIIIgI2AgggAiAANgIMDAULIAZBFGoiAigCACIFRQRAIAYoAhAiBUUNBCAGQRBqIQILA0AgAiEDIAUiAEEUaiICKAIAIgUNACAAQRBqIQIgACgCECIFDQALIANBADYCAAwEC0F4IABrQQ9xIgEgAGoiByAGQThrIgMgAWsiAUEBcjYCBCAAIANqQTg2AgQgAiAFQTcgBWtBD3FqQT9rIgMgAyACQRBqSRsiA0EjNgIEQajQAEH00wAoAgA2AgBBmNAAIAE2AgBBpNAAIAc2AgAgA0EQakHU0wApAgA3AgAgA0HM0wApAgA3AghB1NMAIANBCGo2AgBB0NMAIAY2AgBBzNMAIAA2AgBB2NMAQQA2AgAgA0EkaiEBA0AgAUEHNgIAIAUgAUEEaiIBSw0ACyACIANGDQAgAyADKAIEQX5xNgIEIAMgAyACayIFNgIAIAIgBUEBcjYCBCAFQf8BTQRAIAVBeHFBtNAAaiEAAn9BjNAAKAIAIgFBASAFQQN2dCIDcUUEQEGM0AAgASADcjYCACAADAELIAAoAggLIgEgAjYCDCAAIAI2AgggAiAANgIMIAIgATYCCAwBC0EfIQEgBUH///8HTQRAIAVBJiAFQQh2ZyIAa3ZBAXEgAEEBdGtBPmohAQsgAiABNgIcIAJCADcCECABQQJ0QbzSAGohAEGQ0AAoAgAiA0EBIAF0IgZxRQRAIAAgAjYCAEGQ0AAgAyAGcjYCACACIAA2AhggAiACNgIIIAIgAjYCDAwBCyAFQRkgAUEBdmtBACABQR9HG3QhASAAKAIAIQMCQANAIAMiACgCBEF4cSAFRg0BIAFBHXYhAyABQQF0IQEgACADQQRxakEQaiIGKAIAIgMNAAsgBiACNgIAIAIgADYCGCACIAI2AgwgAiACNgIIDAELIAAoAggiASACNgIMIAAgAjYCCCACQQA2AhggAiAANgIMIAIgATYCCAtBmNAAKAIAIgEgBE0NAEGk0AAoAgAiACAEaiICIAEgBGsiAUEBcjYCBEGY0AAgATYCAEGk0AAgAjYCACAAIARBA3I2AgQgAEEIaiEBDAgLQQAhAUH80wBBMDYCAAwHC0EAIQALIAdFDQACQCAGKAIcIgJBAnRBvNIAaiIDKAIAIAZGBEAgAyAANgIAIAANAUGQ0ABBkNAAKAIAQX4gAndxNgIADAILIAdBEEEUIAcoAhAgBkYbaiAANgIAIABFDQELIAAgBzYCGCAGKAIQIgIEQCAAIAI2AhAgAiAANgIYCyAGQRRqKAIAIgJFDQAgAEEUaiACNgIAIAIgADYCGAsgASAIaiEBIAYgCGoiBigCBCEFCyAGIAVBfnE2AgQgASAEaiABNgIAIAQgAUEBcjYCBCABQf8BTQRAIAFBeHFBtNAAaiEAAn9BjNAAKAIAIgJBASABQQN2dCIBcUUEQEGM0AAgASACcjYCACAADAELIAAoAggLIgEgBDYCDCAAIAQ2AgggBCAANgIMIAQgATYCCAwBC0EfIQUgAUH///8HTQRAIAFBJiABQQh2ZyIAa3ZBAXEgAEEBdGtBPmohBQsgBCAFNgIcIARCADcCECAFQQJ0QbzSAGohAEGQ0AAoAgAiAkEBIAV0IgNxRQRAIAAgBDYCAEGQ0AAgAiADcjYCACAEIAA2AhggBCAENgIIIAQgBDYCDAwBCyABQRkgBUEBdmtBACAFQR9HG3QhBSAAKAIAIQACQANAIAAiAigCBEF4cSABRg0BIAVBHXYhACAFQQF0IQUgAiAAQQRxakEQaiIDKAIAIgANAAsgAyAENgIAIAQgAjYCGCAEIAQ2AgwgBCAENgIIDAELIAIoAggiACAENgIMIAIgBDYCCCAEQQA2AhggBCACNgIMIAQgADYCCAsgCUEIaiEBDAILAkAgB0UNAAJAIAMoAhwiAUECdEG80gBqIgIoAgAgA0YEQCACIAA2AgAgAA0BQZDQACAIQX4gAXdxIgg2AgAMAgsgB0EQQRQgBygCECADRhtqIAA2AgAgAEUNAQsgACAHNgIYIAMoAhAiAQRAIAAgATYCECABIAA2AhgLIANBFGooAgAiAUUNACAAQRRqIAE2AgAgASAANgIYCwJAIAVBD00EQCADIAQgBWoiAEEDcjYCBCAAIANqIgAgACgCBEEBcjYCBAwBCyADIARqIgIgBUEBcjYCBCADIARBA3I2AgQgAiAFaiAFNgIAIAVB/wFNBEAgBUF4cUG00ABqIQACf0GM0AAoAgAiAUEBIAVBA3Z0IgVxRQRAQYzQACABIAVyNgIAIAAMAQsgACgCCAsiASACNgIMIAAgAjYCCCACIAA2AgwgAiABNgIIDAELQR8hASAFQf///wdNBEAgBUEmIAVBCHZnIgBrdkEBcSAAQQF0a0E+aiEBCyACIAE2AhwgAkIANwIQIAFBAnRBvNIAaiEAQQEgAXQiBCAIcUUEQCAAIAI2AgBBkNAAIAQgCHI2AgAgAiAANgIYIAIgAjYCCCACIAI2AgwMAQsgBUEZIAFBAXZrQQAgAUEfRxt0IQEgACgCACEEAkADQCAEIgAoAgRBeHEgBUYNASABQR12IQQgAUEBdCEBIAAgBEEEcWpBEGoiBigCACIEDQALIAYgAjYCACACIAA2AhggAiACNgIMIAIgAjYCCAwBCyAAKAIIIgEgAjYCDCAAIAI2AgggAkEANgIYIAIgADYCDCACIAE2AggLIANBCGohAQwBCwJAIAlFDQACQCAAKAIcIgFBAnRBvNIAaiICKAIAIABGBEAgAiADNgIAIAMNAUGQ0AAgC0F+IAF3cTYCAAwCCyAJQRBBFCAJKAIQIABGG2ogAzYCACADRQ0BCyADIAk2AhggACgCECIBBEAgAyABNgIQIAEgAzYCGAsgAEEUaigCACIBRQ0AIANBFGogATYCACABIAM2AhgLAkAgBUEPTQRAIAAgBCAFaiIBQQNyNgIEIAAgAWoiASABKAIEQQFyNgIEDAELIAAgBGoiByAFQQFyNgIEIAAgBEEDcjYCBCAFIAdqIAU2AgAgCARAIAhBeHFBtNAAaiEBQaDQACgCACEDAn9BASAIQQN2dCICIAZxRQRAQYzQACACIAZyNgIAIAEMAQsgASgCCAsiAiADNgIMIAEgAzYCCCADIAE2AgwgAyACNgIIC0Gg0AAgBzYCAEGU0AAgBTYCAAsgAEEIaiEBCyAKQRBqJAAgAQtDACAARQRAPwBBEHQPCwJAIABB//8DcQ0AIABBAEgNACAAQRB2QAAiAEF/RgRAQfzTAEEwNgIAQX8PCyAAQRB0DwsACwvcPyIAQYAICwkBAAAAAgAAAAMAQZQICwUEAAAABQBBpAgLCQYAAAAHAAAACABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv", "base64");
|
|
26488
26542
|
}));
|
|
26489
26543
|
//#endregion
|
|
26490
|
-
//#region
|
|
26544
|
+
//#region node_modules/undici/lib/llhttp/llhttp_simd-wasm.js
|
|
26491
26545
|
var require_llhttp_simd_wasm = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
26492
26546
|
var { Buffer: Buffer$1 } = __require("node:buffer");
|
|
26493
26547
|
module.exports = Buffer$1.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==", "base64");
|
|
26494
26548
|
}));
|
|
26495
26549
|
//#endregion
|
|
26496
|
-
//#region
|
|
26550
|
+
//#region node_modules/undici/lib/web/fetch/constants.js
|
|
26497
26551
|
var require_constants$2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
26498
26552
|
var corsSafeListedMethods = [
|
|
26499
26553
|
"GET",
|
|
@@ -26711,7 +26765,7 @@ var require_constants$2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
26711
26765
|
};
|
|
26712
26766
|
}));
|
|
26713
26767
|
//#endregion
|
|
26714
|
-
//#region
|
|
26768
|
+
//#region node_modules/undici/lib/web/fetch/global.js
|
|
26715
26769
|
var require_global$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
26716
26770
|
var globalOrigin = Symbol.for("undici.globalOrigin.1");
|
|
26717
26771
|
function getGlobalOrigin() {
|
|
@@ -26742,7 +26796,7 @@ var require_global$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
26742
26796
|
};
|
|
26743
26797
|
}));
|
|
26744
26798
|
//#endregion
|
|
26745
|
-
//#region
|
|
26799
|
+
//#region node_modules/undici/lib/web/fetch/data-url.js
|
|
26746
26800
|
var require_data_url = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
26747
26801
|
var assert$23 = __require("node:assert");
|
|
26748
26802
|
var encoder = new TextEncoder();
|
|
@@ -27077,7 +27131,7 @@ var require_data_url = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
27077
27131
|
};
|
|
27078
27132
|
}));
|
|
27079
27133
|
//#endregion
|
|
27080
|
-
//#region
|
|
27134
|
+
//#region node_modules/undici/lib/web/fetch/webidl.js
|
|
27081
27135
|
var require_webidl = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
27082
27136
|
var { types: types$3, inspect } = __require("node:util");
|
|
27083
27137
|
var { markAsUncloneable } = __require("node:worker_threads");
|
|
@@ -27393,7 +27447,7 @@ var require_webidl = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
27393
27447
|
module.exports = { webidl };
|
|
27394
27448
|
}));
|
|
27395
27449
|
//#endregion
|
|
27396
|
-
//#region
|
|
27450
|
+
//#region node_modules/undici/lib/web/fetch/util.js
|
|
27397
27451
|
var require_util$6 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
27398
27452
|
var { Transform: Transform$2 } = __require("node:stream");
|
|
27399
27453
|
var zlib$1 = __require("node:zlib");
|
|
@@ -28206,7 +28260,7 @@ var require_util$6 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
28206
28260
|
};
|
|
28207
28261
|
}));
|
|
28208
28262
|
//#endregion
|
|
28209
|
-
//#region
|
|
28263
|
+
//#region node_modules/undici/lib/web/fetch/symbols.js
|
|
28210
28264
|
var require_symbols$3 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
28211
28265
|
module.exports = {
|
|
28212
28266
|
kUrl: Symbol("url"),
|
|
@@ -28217,7 +28271,7 @@ var require_symbols$3 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
28217
28271
|
};
|
|
28218
28272
|
}));
|
|
28219
28273
|
//#endregion
|
|
28220
|
-
//#region
|
|
28274
|
+
//#region node_modules/undici/lib/web/fetch/file.js
|
|
28221
28275
|
var require_file = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
28222
28276
|
var { Blob: Blob$2, File: File$1 } = __require("node:buffer");
|
|
28223
28277
|
var { kState } = require_symbols$3();
|
|
@@ -28280,7 +28334,7 @@ var require_file = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
28280
28334
|
};
|
|
28281
28335
|
}));
|
|
28282
28336
|
//#endregion
|
|
28283
|
-
//#region
|
|
28337
|
+
//#region node_modules/undici/lib/web/fetch/formdata.js
|
|
28284
28338
|
var require_formdata = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
28285
28339
|
var { isBlobLike, iteratorMixin } = require_util$6();
|
|
28286
28340
|
var { kState } = require_symbols$3();
|
|
@@ -28415,7 +28469,7 @@ var require_formdata = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
28415
28469
|
};
|
|
28416
28470
|
}));
|
|
28417
28471
|
//#endregion
|
|
28418
|
-
//#region
|
|
28472
|
+
//#region node_modules/undici/lib/web/fetch/formdata-parser.js
|
|
28419
28473
|
var require_formdata_parser = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
28420
28474
|
var { isUSVString, bufferToLowerCasedHeaderName } = require_util$7();
|
|
28421
28475
|
var { utf8DecodeBytes } = require_util$6();
|
|
@@ -28614,7 +28668,7 @@ var require_formdata_parser = /* @__PURE__ */ __commonJSMin(((exports, module) =
|
|
|
28614
28668
|
};
|
|
28615
28669
|
}));
|
|
28616
28670
|
//#endregion
|
|
28617
|
-
//#region
|
|
28671
|
+
//#region node_modules/undici/lib/web/fetch/body.js
|
|
28618
28672
|
var require_body = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
28619
28673
|
var util = require_util$7();
|
|
28620
28674
|
var { ReadableStreamFrom, isBlobLike, isReadableStreamLike, readableStreamClose, createDeferredPromise, fullyReadBody, extractMimeType, utf8DecodeBytes } = require_util$6();
|
|
@@ -28871,7 +28925,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r\n\r\n`);
|
|
|
28871
28925
|
};
|
|
28872
28926
|
}));
|
|
28873
28927
|
//#endregion
|
|
28874
|
-
//#region
|
|
28928
|
+
//#region node_modules/undici/lib/dispatcher/client-h1.js
|
|
28875
28929
|
var require_client_h1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
28876
28930
|
var assert$19 = __require("node:assert");
|
|
28877
28931
|
var util = require_util$7();
|
|
@@ -29727,7 +29781,7 @@ var require_client_h1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
29727
29781
|
module.exports = connectH1;
|
|
29728
29782
|
}));
|
|
29729
29783
|
//#endregion
|
|
29730
|
-
//#region
|
|
29784
|
+
//#region node_modules/undici/lib/dispatcher/client-h2.js
|
|
29731
29785
|
var require_client_h2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
29732
29786
|
var assert$18 = __require("node:assert");
|
|
29733
29787
|
var { pipeline: pipeline$2 } = __require("node:stream");
|
|
@@ -30113,7 +30167,7 @@ var require_client_h2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
30113
30167
|
module.exports = connectH2;
|
|
30114
30168
|
}));
|
|
30115
30169
|
//#endregion
|
|
30116
|
-
//#region
|
|
30170
|
+
//#region node_modules/undici/lib/handler/redirect-handler.js
|
|
30117
30171
|
var require_redirect_handler = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
30118
30172
|
var util = require_util$7();
|
|
30119
30173
|
var { kBodyUsed } = require_symbols$4();
|
|
@@ -30239,7 +30293,7 @@ var require_redirect_handler = /* @__PURE__ */ __commonJSMin(((exports, module)
|
|
|
30239
30293
|
module.exports = RedirectHandler;
|
|
30240
30294
|
}));
|
|
30241
30295
|
//#endregion
|
|
30242
|
-
//#region
|
|
30296
|
+
//#region node_modules/undici/lib/interceptor/redirect-interceptor.js
|
|
30243
30297
|
var require_redirect_interceptor = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
30244
30298
|
var RedirectHandler = require_redirect_handler();
|
|
30245
30299
|
function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) {
|
|
@@ -30259,7 +30313,7 @@ var require_redirect_interceptor = /* @__PURE__ */ __commonJSMin(((exports, modu
|
|
|
30259
30313
|
module.exports = createRedirectInterceptor;
|
|
30260
30314
|
}));
|
|
30261
30315
|
//#endregion
|
|
30262
|
-
//#region
|
|
30316
|
+
//#region node_modules/undici/lib/dispatcher/client.js
|
|
30263
30317
|
var require_client = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
30264
30318
|
var assert$16 = __require("node:assert");
|
|
30265
30319
|
var net = __require("node:net");
|
|
@@ -30594,7 +30648,7 @@ var require_client = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
30594
30648
|
module.exports = Client;
|
|
30595
30649
|
}));
|
|
30596
30650
|
//#endregion
|
|
30597
|
-
//#region
|
|
30651
|
+
//#region node_modules/undici/lib/dispatcher/fixed-queue.js
|
|
30598
30652
|
var require_fixed_queue = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
30599
30653
|
var kSize = 2048;
|
|
30600
30654
|
var kMask = kSize - 1;
|
|
@@ -30643,7 +30697,7 @@ var require_fixed_queue = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
30643
30697
|
};
|
|
30644
30698
|
}));
|
|
30645
30699
|
//#endregion
|
|
30646
|
-
//#region
|
|
30700
|
+
//#region node_modules/undici/lib/dispatcher/pool-stats.js
|
|
30647
30701
|
var require_pool_stats = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
30648
30702
|
var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols$4();
|
|
30649
30703
|
var kPool = Symbol("pool");
|
|
@@ -30673,7 +30727,7 @@ var require_pool_stats = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
30673
30727
|
module.exports = PoolStats;
|
|
30674
30728
|
}));
|
|
30675
30729
|
//#endregion
|
|
30676
|
-
//#region
|
|
30730
|
+
//#region node_modules/undici/lib/dispatcher/pool-base.js
|
|
30677
30731
|
var require_pool_base = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
30678
30732
|
var DispatcherBase = require_dispatcher_base();
|
|
30679
30733
|
var FixedQueue = require_fixed_queue();
|
|
@@ -30807,7 +30861,7 @@ var require_pool_base = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
30807
30861
|
};
|
|
30808
30862
|
}));
|
|
30809
30863
|
//#endregion
|
|
30810
|
-
//#region
|
|
30864
|
+
//#region node_modules/undici/lib/dispatcher/pool.js
|
|
30811
30865
|
var require_pool = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
30812
30866
|
var { PoolBase, kClients, kNeedDrain, kAddClient, kGetDispatcher } = require_pool_base();
|
|
30813
30867
|
var Client = require_client();
|
|
@@ -30868,7 +30922,7 @@ var require_pool = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
30868
30922
|
module.exports = Pool;
|
|
30869
30923
|
}));
|
|
30870
30924
|
//#endregion
|
|
30871
|
-
//#region
|
|
30925
|
+
//#region node_modules/undici/lib/dispatcher/balanced-pool.js
|
|
30872
30926
|
var require_balanced_pool = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
30873
30927
|
var { BalancedPoolMissingUpstreamError, InvalidArgumentError } = require_errors();
|
|
30874
30928
|
var { PoolBase, kClients, kNeedDrain, kAddClient, kRemoveClient, kGetDispatcher } = require_pool_base();
|
|
@@ -30979,7 +31033,7 @@ var require_balanced_pool = /* @__PURE__ */ __commonJSMin(((exports, module) =>
|
|
|
30979
31033
|
module.exports = BalancedPool;
|
|
30980
31034
|
}));
|
|
30981
31035
|
//#endregion
|
|
30982
|
-
//#region
|
|
31036
|
+
//#region node_modules/undici/lib/dispatcher/agent.js
|
|
30983
31037
|
var require_agent = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
30984
31038
|
var { InvalidArgumentError } = require_errors();
|
|
30985
31039
|
var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols$4();
|
|
@@ -31059,7 +31113,7 @@ var require_agent = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
31059
31113
|
module.exports = Agent;
|
|
31060
31114
|
}));
|
|
31061
31115
|
//#endregion
|
|
31062
|
-
//#region
|
|
31116
|
+
//#region node_modules/undici/lib/dispatcher/proxy-agent.js
|
|
31063
31117
|
var require_proxy_agent = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
31064
31118
|
var { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols$4();
|
|
31065
31119
|
var { URL: URL$1 } = __require("node:url");
|
|
@@ -31257,7 +31311,7 @@ var require_proxy_agent = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
31257
31311
|
module.exports = ProxyAgent;
|
|
31258
31312
|
}));
|
|
31259
31313
|
//#endregion
|
|
31260
|
-
//#region
|
|
31314
|
+
//#region node_modules/undici/lib/dispatcher/env-http-proxy-agent.js
|
|
31261
31315
|
var require_env_http_proxy_agent = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
31262
31316
|
var DispatcherBase = require_dispatcher_base();
|
|
31263
31317
|
var { kClose, kDestroy, kClosed, kDestroyed, kDispatch, kNoProxyAgent, kHttpProxyAgent, kHttpsProxyAgent } = require_symbols$4();
|
|
@@ -31357,7 +31411,7 @@ var require_env_http_proxy_agent = /* @__PURE__ */ __commonJSMin(((exports, modu
|
|
|
31357
31411
|
module.exports = EnvHttpProxyAgent;
|
|
31358
31412
|
}));
|
|
31359
31413
|
//#endregion
|
|
31360
|
-
//#region
|
|
31414
|
+
//#region node_modules/undici/lib/handler/retry-handler.js
|
|
31361
31415
|
var require_retry_handler = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
31362
31416
|
var assert$15 = __require("node:assert");
|
|
31363
31417
|
var { kRetryHandlerDefaultRetry } = require_symbols$4();
|
|
@@ -31579,7 +31633,7 @@ var require_retry_handler = /* @__PURE__ */ __commonJSMin(((exports, module) =>
|
|
|
31579
31633
|
};
|
|
31580
31634
|
}));
|
|
31581
31635
|
//#endregion
|
|
31582
|
-
//#region
|
|
31636
|
+
//#region node_modules/undici/lib/dispatcher/retry-agent.js
|
|
31583
31637
|
var require_retry_agent = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
31584
31638
|
var Dispatcher = require_dispatcher();
|
|
31585
31639
|
var RetryHandler = require_retry_handler();
|
|
@@ -31611,7 +31665,7 @@ var require_retry_agent = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
31611
31665
|
module.exports = RetryAgent;
|
|
31612
31666
|
}));
|
|
31613
31667
|
//#endregion
|
|
31614
|
-
//#region
|
|
31668
|
+
//#region node_modules/undici/lib/api/readable.js
|
|
31615
31669
|
var require_readable = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
31616
31670
|
var assert$14 = __require("node:assert");
|
|
31617
31671
|
var { Readable: Readable$2 } = __require("node:stream");
|
|
@@ -31839,7 +31893,7 @@ var require_readable = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
31839
31893
|
};
|
|
31840
31894
|
}));
|
|
31841
31895
|
//#endregion
|
|
31842
|
-
//#region
|
|
31896
|
+
//#region node_modules/undici/lib/api/util.js
|
|
31843
31897
|
var require_util$5 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
31844
31898
|
var assert$13 = __require("node:assert");
|
|
31845
31899
|
var { ResponseStatusCodeError } = require_errors();
|
|
@@ -31892,7 +31946,7 @@ var require_util$5 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
31892
31946
|
};
|
|
31893
31947
|
}));
|
|
31894
31948
|
//#endregion
|
|
31895
|
-
//#region
|
|
31949
|
+
//#region node_modules/undici/lib/api/api-request.js
|
|
31896
31950
|
var require_api_request = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
31897
31951
|
var assert$12 = __require("node:assert");
|
|
31898
31952
|
var { Readable } = require_readable();
|
|
@@ -32044,7 +32098,7 @@ var require_api_request = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
32044
32098
|
module.exports.RequestHandler = RequestHandler;
|
|
32045
32099
|
}));
|
|
32046
32100
|
//#endregion
|
|
32047
|
-
//#region
|
|
32101
|
+
//#region node_modules/undici/lib/api/abort-signal.js
|
|
32048
32102
|
var require_abort_signal = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32049
32103
|
var { addAbortListener } = require_util$7();
|
|
32050
32104
|
var { RequestAbortedError } = require_errors();
|
|
@@ -32083,7 +32137,7 @@ var require_abort_signal = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
32083
32137
|
};
|
|
32084
32138
|
}));
|
|
32085
32139
|
//#endregion
|
|
32086
|
-
//#region
|
|
32140
|
+
//#region node_modules/undici/lib/api/api-stream.js
|
|
32087
32141
|
var require_api_stream = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32088
32142
|
var assert$11 = __require("node:assert");
|
|
32089
32143
|
var { finished: finished$1, PassThrough: PassThrough$1 } = __require("node:stream");
|
|
@@ -32228,7 +32282,7 @@ var require_api_stream = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
32228
32282
|
module.exports = stream;
|
|
32229
32283
|
}));
|
|
32230
32284
|
//#endregion
|
|
32231
|
-
//#region
|
|
32285
|
+
//#region node_modules/undici/lib/api/api-pipeline.js
|
|
32232
32286
|
var require_api_pipeline = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32233
32287
|
var { Readable: Readable$1, Duplex, PassThrough } = __require("node:stream");
|
|
32234
32288
|
var { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError } = require_errors();
|
|
@@ -32396,7 +32450,7 @@ var require_api_pipeline = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
32396
32450
|
module.exports = pipeline;
|
|
32397
32451
|
}));
|
|
32398
32452
|
//#endregion
|
|
32399
|
-
//#region
|
|
32453
|
+
//#region node_modules/undici/lib/api/api-upgrade.js
|
|
32400
32454
|
var require_api_upgrade = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32401
32455
|
var { InvalidArgumentError, SocketError } = require_errors();
|
|
32402
32456
|
var { AsyncResource: AsyncResource$1 } = __require("node:async_hooks");
|
|
@@ -32475,7 +32529,7 @@ var require_api_upgrade = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
32475
32529
|
module.exports = upgrade;
|
|
32476
32530
|
}));
|
|
32477
32531
|
//#endregion
|
|
32478
|
-
//#region
|
|
32532
|
+
//#region node_modules/undici/lib/api/api-connect.js
|
|
32479
32533
|
var require_api_connect = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32480
32534
|
var assert$8 = __require("node:assert");
|
|
32481
32535
|
var { AsyncResource } = __require("node:async_hooks");
|
|
@@ -32553,7 +32607,7 @@ var require_api_connect = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
32553
32607
|
module.exports = connect;
|
|
32554
32608
|
}));
|
|
32555
32609
|
//#endregion
|
|
32556
|
-
//#region
|
|
32610
|
+
//#region node_modules/undici/lib/api/index.js
|
|
32557
32611
|
var require_api = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32558
32612
|
module.exports.request = require_api_request();
|
|
32559
32613
|
module.exports.stream = require_api_stream();
|
|
@@ -32562,7 +32616,7 @@ var require_api = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
32562
32616
|
module.exports.connect = require_api_connect();
|
|
32563
32617
|
}));
|
|
32564
32618
|
//#endregion
|
|
32565
|
-
//#region
|
|
32619
|
+
//#region node_modules/undici/lib/mock/mock-errors.js
|
|
32566
32620
|
var require_mock_errors = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32567
32621
|
var { UndiciError } = require_errors();
|
|
32568
32622
|
var kMockNotMatchedError = Symbol.for("undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED");
|
|
@@ -32581,7 +32635,7 @@ var require_mock_errors = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
32581
32635
|
} };
|
|
32582
32636
|
}));
|
|
32583
32637
|
//#endregion
|
|
32584
|
-
//#region
|
|
32638
|
+
//#region node_modules/undici/lib/mock/mock-symbols.js
|
|
32585
32639
|
var require_mock_symbols = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32586
32640
|
module.exports = {
|
|
32587
32641
|
kAgent: Symbol("agent"),
|
|
@@ -32606,7 +32660,7 @@ var require_mock_symbols = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
32606
32660
|
};
|
|
32607
32661
|
}));
|
|
32608
32662
|
//#endregion
|
|
32609
|
-
//#region
|
|
32663
|
+
//#region node_modules/undici/lib/mock/mock-utils.js
|
|
32610
32664
|
var require_mock_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32611
32665
|
var { MockNotMatchedError } = require_mock_errors();
|
|
32612
32666
|
var { kDispatches, kMockAgent, kOriginalDispatch, kOrigin, kGetNetConnect } = require_mock_symbols();
|
|
@@ -32843,7 +32897,7 @@ var require_mock_utils = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
32843
32897
|
};
|
|
32844
32898
|
}));
|
|
32845
32899
|
//#endregion
|
|
32846
|
-
//#region
|
|
32900
|
+
//#region node_modules/undici/lib/mock/mock-interceptor.js
|
|
32847
32901
|
var require_mock_interceptor = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32848
32902
|
var { getResponseData, buildKey, addMockDispatch } = require_mock_utils();
|
|
32849
32903
|
var { kDispatches, kDispatchKey, kDefaultHeaders, kDefaultTrailers, kContentLength, kMockDispatch } = require_mock_symbols();
|
|
@@ -32983,7 +33037,7 @@ var require_mock_interceptor = /* @__PURE__ */ __commonJSMin(((exports, module)
|
|
|
32983
33037
|
module.exports.MockScope = MockScope;
|
|
32984
33038
|
}));
|
|
32985
33039
|
//#endregion
|
|
32986
|
-
//#region
|
|
33040
|
+
//#region node_modules/undici/lib/mock/mock-client.js
|
|
32987
33041
|
var require_mock_client = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
32988
33042
|
var { promisify: promisify$1 } = __require("node:util");
|
|
32989
33043
|
var Client = require_client();
|
|
@@ -33026,7 +33080,7 @@ var require_mock_client = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
33026
33080
|
module.exports = MockClient;
|
|
33027
33081
|
}));
|
|
33028
33082
|
//#endregion
|
|
33029
|
-
//#region
|
|
33083
|
+
//#region node_modules/undici/lib/mock/mock-pool.js
|
|
33030
33084
|
var require_mock_pool = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33031
33085
|
var { promisify } = __require("node:util");
|
|
33032
33086
|
var Pool = require_pool();
|
|
@@ -33069,7 +33123,7 @@ var require_mock_pool = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
33069
33123
|
module.exports = MockPool;
|
|
33070
33124
|
}));
|
|
33071
33125
|
//#endregion
|
|
33072
|
-
//#region
|
|
33126
|
+
//#region node_modules/undici/lib/mock/pluralizer.js
|
|
33073
33127
|
var require_pluralizer = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33074
33128
|
var singulars = {
|
|
33075
33129
|
pronoun: "it",
|
|
@@ -33101,7 +33155,7 @@ var require_pluralizer = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
33101
33155
|
};
|
|
33102
33156
|
}));
|
|
33103
33157
|
//#endregion
|
|
33104
|
-
//#region
|
|
33158
|
+
//#region node_modules/undici/lib/mock/pending-interceptors-formatter.js
|
|
33105
33159
|
var require_pending_interceptors_formatter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33106
33160
|
var { Transform: Transform$1 } = __require("node:stream");
|
|
33107
33161
|
var { Console } = __require("node:console");
|
|
@@ -33136,7 +33190,7 @@ var require_pending_interceptors_formatter = /* @__PURE__ */ __commonJSMin(((exp
|
|
|
33136
33190
|
};
|
|
33137
33191
|
}));
|
|
33138
33192
|
//#endregion
|
|
33139
|
-
//#region
|
|
33193
|
+
//#region node_modules/undici/lib/mock/mock-agent.js
|
|
33140
33194
|
var require_mock_agent = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33141
33195
|
var { kClients } = require_symbols$4();
|
|
33142
33196
|
var Agent = require_agent();
|
|
@@ -33239,7 +33293,7 @@ ${pendingInterceptorsFormatter.format(pending)}
|
|
|
33239
33293
|
module.exports = MockAgent;
|
|
33240
33294
|
}));
|
|
33241
33295
|
//#endregion
|
|
33242
|
-
//#region
|
|
33296
|
+
//#region node_modules/undici/lib/global.js
|
|
33243
33297
|
var require_global = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33244
33298
|
var globalDispatcher = Symbol.for("undici.globalDispatcher.1");
|
|
33245
33299
|
var { InvalidArgumentError } = require_errors();
|
|
@@ -33263,7 +33317,7 @@ var require_global = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
33263
33317
|
};
|
|
33264
33318
|
}));
|
|
33265
33319
|
//#endregion
|
|
33266
|
-
//#region
|
|
33320
|
+
//#region node_modules/undici/lib/handler/decorator-handler.js
|
|
33267
33321
|
var require_decorator_handler = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33268
33322
|
module.exports = class DecoratorHandler {
|
|
33269
33323
|
#handler;
|
|
@@ -33298,7 +33352,7 @@ var require_decorator_handler = /* @__PURE__ */ __commonJSMin(((exports, module)
|
|
|
33298
33352
|
};
|
|
33299
33353
|
}));
|
|
33300
33354
|
//#endregion
|
|
33301
|
-
//#region
|
|
33355
|
+
//#region node_modules/undici/lib/interceptor/redirect.js
|
|
33302
33356
|
var require_redirect = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33303
33357
|
var RedirectHandler = require_redirect_handler();
|
|
33304
33358
|
module.exports = (opts) => {
|
|
@@ -33313,7 +33367,7 @@ var require_redirect = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
33313
33367
|
};
|
|
33314
33368
|
}));
|
|
33315
33369
|
//#endregion
|
|
33316
|
-
//#region
|
|
33370
|
+
//#region node_modules/undici/lib/interceptor/retry.js
|
|
33317
33371
|
var require_retry = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33318
33372
|
var RetryHandler = require_retry_handler();
|
|
33319
33373
|
module.exports = (globalOpts) => {
|
|
@@ -33334,7 +33388,7 @@ var require_retry = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
33334
33388
|
};
|
|
33335
33389
|
}));
|
|
33336
33390
|
//#endregion
|
|
33337
|
-
//#region
|
|
33391
|
+
//#region node_modules/undici/lib/interceptor/dump.js
|
|
33338
33392
|
var require_dump = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33339
33393
|
var util = require_util$7();
|
|
33340
33394
|
var { InvalidArgumentError, RequestAbortedError } = require_errors();
|
|
@@ -33401,7 +33455,7 @@ var require_dump = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
33401
33455
|
module.exports = createDumpInterceptor;
|
|
33402
33456
|
}));
|
|
33403
33457
|
//#endregion
|
|
33404
|
-
//#region
|
|
33458
|
+
//#region node_modules/undici/lib/interceptor/dns.js
|
|
33405
33459
|
var require_dns = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33406
33460
|
var { isIP } = __require("node:net");
|
|
33407
33461
|
var { lookup } = __require("node:dns");
|
|
@@ -33614,7 +33668,7 @@ var require_dns = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
33614
33668
|
};
|
|
33615
33669
|
}));
|
|
33616
33670
|
//#endregion
|
|
33617
|
-
//#region
|
|
33671
|
+
//#region node_modules/undici/lib/web/fetch/headers.js
|
|
33618
33672
|
var require_headers = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33619
33673
|
var { kConstruct } = require_symbols$4();
|
|
33620
33674
|
var { kEnumerableProperty } = require_util$7();
|
|
@@ -33979,7 +34033,7 @@ var require_headers = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
33979
34033
|
};
|
|
33980
34034
|
}));
|
|
33981
34035
|
//#endregion
|
|
33982
|
-
//#region
|
|
34036
|
+
//#region node_modules/undici/lib/web/fetch/response.js
|
|
33983
34037
|
var require_response = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
33984
34038
|
var { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = require_headers();
|
|
33985
34039
|
var { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = require_body();
|
|
@@ -34292,7 +34346,7 @@ var require_response = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
34292
34346
|
};
|
|
34293
34347
|
}));
|
|
34294
34348
|
//#endregion
|
|
34295
|
-
//#region
|
|
34349
|
+
//#region node_modules/undici/lib/web/fetch/dispatcher-weakref.js
|
|
34296
34350
|
var require_dispatcher_weakref = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
34297
34351
|
var { kConnected, kSize } = require_symbols$4();
|
|
34298
34352
|
var CompatWeakRef = class {
|
|
@@ -34329,7 +34383,7 @@ var require_dispatcher_weakref = /* @__PURE__ */ __commonJSMin(((exports, module
|
|
|
34329
34383
|
};
|
|
34330
34384
|
}));
|
|
34331
34385
|
//#endregion
|
|
34332
|
-
//#region
|
|
34386
|
+
//#region node_modules/undici/lib/web/fetch/request.js
|
|
34333
34387
|
var require_request = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
34334
34388
|
var { extractBody, mixinBody, cloneBody, bodyUnusable } = require_body();
|
|
34335
34389
|
var { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = require_headers();
|
|
@@ -34838,7 +34892,7 @@ var require_request = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
34838
34892
|
};
|
|
34839
34893
|
}));
|
|
34840
34894
|
//#endregion
|
|
34841
|
-
//#region
|
|
34895
|
+
//#region node_modules/undici/lib/web/fetch/index.js
|
|
34842
34896
|
var require_fetch = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
34843
34897
|
var { makeNetworkError, makeAppropriateNetworkError, filterResponse, makeResponse, fromInnerResponse } = require_response();
|
|
34844
34898
|
var { HeadersList } = require_headers();
|
|
@@ -35536,7 +35590,7 @@ var require_fetch = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
35536
35590
|
};
|
|
35537
35591
|
}));
|
|
35538
35592
|
//#endregion
|
|
35539
|
-
//#region
|
|
35593
|
+
//#region node_modules/undici/lib/web/fileapi/symbols.js
|
|
35540
35594
|
var require_symbols$2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
35541
35595
|
module.exports = {
|
|
35542
35596
|
kState: Symbol("FileReader state"),
|
|
@@ -35548,7 +35602,7 @@ var require_symbols$2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
35548
35602
|
};
|
|
35549
35603
|
}));
|
|
35550
35604
|
//#endregion
|
|
35551
|
-
//#region
|
|
35605
|
+
//#region node_modules/undici/lib/web/fileapi/progressevent.js
|
|
35552
35606
|
var require_progressevent = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
35553
35607
|
var { webidl } = require_webidl();
|
|
35554
35608
|
var kState = Symbol("ProgressEvent state");
|
|
@@ -35614,7 +35668,7 @@ var require_progressevent = /* @__PURE__ */ __commonJSMin(((exports, module) =>
|
|
|
35614
35668
|
module.exports = { ProgressEvent };
|
|
35615
35669
|
}));
|
|
35616
35670
|
//#endregion
|
|
35617
|
-
//#region
|
|
35671
|
+
//#region node_modules/undici/lib/web/fileapi/encoding.js
|
|
35618
35672
|
var require_encoding = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
35619
35673
|
/**
|
|
35620
35674
|
* @see https://encoding.spec.whatwg.org/#concept-encoding-get
|
|
@@ -35856,7 +35910,7 @@ var require_encoding = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
35856
35910
|
module.exports = { getEncoding };
|
|
35857
35911
|
}));
|
|
35858
35912
|
//#endregion
|
|
35859
|
-
//#region
|
|
35913
|
+
//#region node_modules/undici/lib/web/fileapi/util.js
|
|
35860
35914
|
var require_util$4 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
35861
35915
|
var { kState, kError, kResult, kAborted, kLastProgressEventFired } = require_symbols$2();
|
|
35862
35916
|
var { ProgressEvent } = require_progressevent();
|
|
@@ -36032,7 +36086,7 @@ var require_util$4 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
36032
36086
|
};
|
|
36033
36087
|
}));
|
|
36034
36088
|
//#endregion
|
|
36035
|
-
//#region
|
|
36089
|
+
//#region node_modules/undici/lib/web/fileapi/filereader.js
|
|
36036
36090
|
var require_filereader = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
36037
36091
|
var { staticPropertyDescriptors, readOperation, fireAProgressEvent } = require_util$4();
|
|
36038
36092
|
var { kState, kError, kResult, kEvents, kAborted } = require_symbols$2();
|
|
@@ -36245,12 +36299,12 @@ var require_filereader = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
36245
36299
|
module.exports = { FileReader };
|
|
36246
36300
|
}));
|
|
36247
36301
|
//#endregion
|
|
36248
|
-
//#region
|
|
36302
|
+
//#region node_modules/undici/lib/web/cache/symbols.js
|
|
36249
36303
|
var require_symbols$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
36250
36304
|
module.exports = { kConstruct: require_symbols$4().kConstruct };
|
|
36251
36305
|
}));
|
|
36252
36306
|
//#endregion
|
|
36253
|
-
//#region
|
|
36307
|
+
//#region node_modules/undici/lib/web/cache/util.js
|
|
36254
36308
|
var require_util$3 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
36255
36309
|
var assert$3 = __require("node:assert");
|
|
36256
36310
|
var { URLSerializer } = require_data_url();
|
|
@@ -36284,7 +36338,7 @@ var require_util$3 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
36284
36338
|
};
|
|
36285
36339
|
}));
|
|
36286
36340
|
//#endregion
|
|
36287
|
-
//#region
|
|
36341
|
+
//#region node_modules/undici/lib/web/cache/cache.js
|
|
36288
36342
|
var require_cache = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
36289
36343
|
var { kConstruct } = require_symbols$1();
|
|
36290
36344
|
var { urlEquals, getFieldValues } = require_util$3();
|
|
@@ -36733,7 +36787,7 @@ var require_cache = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
36733
36787
|
module.exports = { Cache };
|
|
36734
36788
|
}));
|
|
36735
36789
|
//#endregion
|
|
36736
|
-
//#region
|
|
36790
|
+
//#region node_modules/undici/lib/web/cache/cachestorage.js
|
|
36737
36791
|
var require_cachestorage = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
36738
36792
|
var { kConstruct } = require_symbols$1();
|
|
36739
36793
|
var { Cache } = require_cache();
|
|
@@ -36823,7 +36877,7 @@ var require_cachestorage = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
36823
36877
|
module.exports = { CacheStorage };
|
|
36824
36878
|
}));
|
|
36825
36879
|
//#endregion
|
|
36826
|
-
//#region
|
|
36880
|
+
//#region node_modules/undici/lib/web/cookies/constants.js
|
|
36827
36881
|
var require_constants$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
36828
36882
|
module.exports = {
|
|
36829
36883
|
maxAttributeValueSize: 1024,
|
|
@@ -36831,7 +36885,7 @@ var require_constants$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
36831
36885
|
};
|
|
36832
36886
|
}));
|
|
36833
36887
|
//#endregion
|
|
36834
|
-
//#region
|
|
36888
|
+
//#region node_modules/undici/lib/web/cookies/util.js
|
|
36835
36889
|
var require_util$2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
36836
36890
|
/**
|
|
36837
36891
|
* @param {string} value
|
|
@@ -37025,7 +37079,7 @@ var require_util$2 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
37025
37079
|
};
|
|
37026
37080
|
}));
|
|
37027
37081
|
//#endregion
|
|
37028
|
-
//#region
|
|
37082
|
+
//#region node_modules/undici/lib/web/cookies/parse.js
|
|
37029
37083
|
var require_parse = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
37030
37084
|
var { maxNameValuePairSize, maxAttributeValueSize } = require_constants$1();
|
|
37031
37085
|
var { isCTLExcludingHtab } = require_util$2();
|
|
@@ -37127,7 +37181,7 @@ var require_parse = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
37127
37181
|
};
|
|
37128
37182
|
}));
|
|
37129
37183
|
//#endregion
|
|
37130
|
-
//#region
|
|
37184
|
+
//#region node_modules/undici/lib/web/cookies/index.js
|
|
37131
37185
|
var require_cookies = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
37132
37186
|
var { parseSetCookie } = require_parse();
|
|
37133
37187
|
var { stringify } = require_util$2();
|
|
@@ -37278,7 +37332,7 @@ var require_cookies = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
37278
37332
|
};
|
|
37279
37333
|
}));
|
|
37280
37334
|
//#endregion
|
|
37281
|
-
//#region
|
|
37335
|
+
//#region node_modules/undici/lib/web/websocket/events.js
|
|
37282
37336
|
var require_events = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
37283
37337
|
var { webidl } = require_webidl();
|
|
37284
37338
|
var { kEnumerableProperty } = require_util$7();
|
|
@@ -37541,7 +37595,7 @@ var require_events = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
37541
37595
|
};
|
|
37542
37596
|
}));
|
|
37543
37597
|
//#endregion
|
|
37544
|
-
//#region
|
|
37598
|
+
//#region node_modules/undici/lib/web/websocket/constants.js
|
|
37545
37599
|
var require_constants = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
37546
37600
|
module.exports = {
|
|
37547
37601
|
uid: "258EAFA5-E914-47DA-95CA-C5AB0DC85B11",
|
|
@@ -37586,7 +37640,7 @@ var require_constants = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
37586
37640
|
};
|
|
37587
37641
|
}));
|
|
37588
37642
|
//#endregion
|
|
37589
|
-
//#region
|
|
37643
|
+
//#region node_modules/undici/lib/web/websocket/symbols.js
|
|
37590
37644
|
var require_symbols = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
37591
37645
|
module.exports = {
|
|
37592
37646
|
kWebSocketURL: Symbol("url"),
|
|
@@ -37600,7 +37654,7 @@ var require_symbols = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
37600
37654
|
};
|
|
37601
37655
|
}));
|
|
37602
37656
|
//#endregion
|
|
37603
|
-
//#region
|
|
37657
|
+
//#region node_modules/undici/lib/web/websocket/util.js
|
|
37604
37658
|
var require_util$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
37605
37659
|
var { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require_symbols();
|
|
37606
37660
|
var { states, opcodes } = require_constants();
|
|
@@ -37782,7 +37836,7 @@ var require_util$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
37782
37836
|
};
|
|
37783
37837
|
}));
|
|
37784
37838
|
//#endregion
|
|
37785
|
-
//#region
|
|
37839
|
+
//#region node_modules/undici/lib/web/websocket/frame.js
|
|
37786
37840
|
var require_frame = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
37787
37841
|
var { maxUnsigned16Bit } = require_constants();
|
|
37788
37842
|
var BUFFER_SIZE = 16386;
|
|
@@ -37854,7 +37908,7 @@ var require_frame = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
37854
37908
|
module.exports = { WebsocketFrameSend };
|
|
37855
37909
|
}));
|
|
37856
37910
|
//#endregion
|
|
37857
|
-
//#region
|
|
37911
|
+
//#region node_modules/undici/lib/web/websocket/connection.js
|
|
37858
37912
|
var require_connection = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
37859
37913
|
var { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = require_constants();
|
|
37860
37914
|
var { kReadyState, kSentClose, kByteParser, kReceivedClose, kResponse } = require_symbols();
|
|
@@ -38019,7 +38073,7 @@ var require_connection = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
38019
38073
|
};
|
|
38020
38074
|
}));
|
|
38021
38075
|
//#endregion
|
|
38022
|
-
//#region
|
|
38076
|
+
//#region node_modules/undici/lib/web/websocket/permessage-deflate.js
|
|
38023
38077
|
var require_permessage_deflate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
38024
38078
|
var { createInflateRaw, Z_DEFAULT_WINDOWBITS } = __require("node:zlib");
|
|
38025
38079
|
var { isValidClientWindowBits } = require_util$1();
|
|
@@ -38098,7 +38152,7 @@ var require_permessage_deflate = /* @__PURE__ */ __commonJSMin(((exports, module
|
|
|
38098
38152
|
module.exports = { PerMessageDeflate };
|
|
38099
38153
|
}));
|
|
38100
38154
|
//#endregion
|
|
38101
|
-
//#region
|
|
38155
|
+
//#region node_modules/undici/lib/web/websocket/receiver.js
|
|
38102
38156
|
var require_receiver = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
38103
38157
|
var { Writable } = __require("node:stream");
|
|
38104
38158
|
var assert = __require("node:assert");
|
|
@@ -38415,7 +38469,7 @@ var require_receiver = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
38415
38469
|
module.exports = { ByteParser };
|
|
38416
38470
|
}));
|
|
38417
38471
|
//#endregion
|
|
38418
|
-
//#region
|
|
38472
|
+
//#region node_modules/undici/lib/web/websocket/sender.js
|
|
38419
38473
|
var require_sender = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
38420
38474
|
var { WebsocketFrameSend } = require_frame();
|
|
38421
38475
|
var { opcodes, sendHints } = require_constants();
|
|
@@ -38495,7 +38549,7 @@ var require_sender = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
38495
38549
|
module.exports = { SendQueue };
|
|
38496
38550
|
}));
|
|
38497
38551
|
//#endregion
|
|
38498
|
-
//#region
|
|
38552
|
+
//#region node_modules/undici/lib/web/websocket/websocket.js
|
|
38499
38553
|
var require_websocket = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
38500
38554
|
var { webidl } = require_webidl();
|
|
38501
38555
|
var { URLSerializer } = require_data_url();
|
|
@@ -38796,7 +38850,7 @@ var require_websocket = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
38796
38850
|
module.exports = { WebSocket };
|
|
38797
38851
|
}));
|
|
38798
38852
|
//#endregion
|
|
38799
|
-
//#region
|
|
38853
|
+
//#region node_modules/undici/lib/web/eventsource/util.js
|
|
38800
38854
|
var require_util = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
38801
38855
|
/**
|
|
38802
38856
|
* Checks if the given value is a valid LastEventId.
|
|
@@ -38828,7 +38882,7 @@ var require_util = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
38828
38882
|
};
|
|
38829
38883
|
}));
|
|
38830
38884
|
//#endregion
|
|
38831
|
-
//#region
|
|
38885
|
+
//#region node_modules/undici/lib/web/eventsource/eventsource-stream.js
|
|
38832
38886
|
var require_eventsource_stream = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
38833
38887
|
var { Transform } = __require("node:stream");
|
|
38834
38888
|
var { isASCIINumber, isValidLastEventId } = require_util();
|
|
@@ -39050,7 +39104,7 @@ var require_eventsource_stream = /* @__PURE__ */ __commonJSMin(((exports, module
|
|
|
39050
39104
|
module.exports = { EventSourceStream };
|
|
39051
39105
|
}));
|
|
39052
39106
|
//#endregion
|
|
39053
|
-
//#region
|
|
39107
|
+
//#region node_modules/undici/lib/web/eventsource/eventsource.js
|
|
39054
39108
|
var require_eventsource = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
39055
39109
|
var { pipeline } = __require("node:stream");
|
|
39056
39110
|
var { fetching } = require_fetch();
|
|
@@ -39363,7 +39417,7 @@ var require_eventsource = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
39363
39417
|
};
|
|
39364
39418
|
}));
|
|
39365
39419
|
//#endregion
|
|
39366
|
-
//#region
|
|
39420
|
+
//#region node_modules/undici/index.js
|
|
39367
39421
|
var require_undici = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
39368
39422
|
var Client = require_client();
|
|
39369
39423
|
var Dispatcher = require_dispatcher();
|
|
@@ -39488,7 +39542,7 @@ var require_undici = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
39488
39542
|
module.exports.EventSource = EventSource;
|
|
39489
39543
|
}));
|
|
39490
39544
|
//#endregion
|
|
39491
|
-
//#region
|
|
39545
|
+
//#region node_modules/@apocaliss92/nodewitt/node_modules/zod/v3/helpers/util.js
|
|
39492
39546
|
var util;
|
|
39493
39547
|
(function(util) {
|
|
39494
39548
|
util.assertEqual = (_) => {};
|
|
@@ -39584,7 +39638,7 @@ var getParsedType = (data) => {
|
|
|
39584
39638
|
}
|
|
39585
39639
|
};
|
|
39586
39640
|
//#endregion
|
|
39587
|
-
//#region
|
|
39641
|
+
//#region node_modules/@apocaliss92/nodewitt/node_modules/zod/v3/ZodError.js
|
|
39588
39642
|
var ZodIssueCode = util.arrayToEnum([
|
|
39589
39643
|
"invalid_type",
|
|
39590
39644
|
"invalid_literal",
|
|
@@ -39683,7 +39737,7 @@ ZodError.create = (issues) => {
|
|
|
39683
39737
|
return new ZodError(issues);
|
|
39684
39738
|
};
|
|
39685
39739
|
//#endregion
|
|
39686
|
-
//#region
|
|
39740
|
+
//#region node_modules/@apocaliss92/nodewitt/node_modules/zod/v3/locales/en.js
|
|
39687
39741
|
var errorMap = (issue, _ctx) => {
|
|
39688
39742
|
let message;
|
|
39689
39743
|
switch (issue.code) {
|
|
@@ -39760,13 +39814,13 @@ var errorMap = (issue, _ctx) => {
|
|
|
39760
39814
|
return { message };
|
|
39761
39815
|
};
|
|
39762
39816
|
//#endregion
|
|
39763
|
-
//#region
|
|
39817
|
+
//#region node_modules/@apocaliss92/nodewitt/node_modules/zod/v3/errors.js
|
|
39764
39818
|
var overrideErrorMap = errorMap;
|
|
39765
39819
|
function getErrorMap() {
|
|
39766
39820
|
return overrideErrorMap;
|
|
39767
39821
|
}
|
|
39768
39822
|
//#endregion
|
|
39769
|
-
//#region
|
|
39823
|
+
//#region node_modules/@apocaliss92/nodewitt/node_modules/zod/v3/helpers/parseUtil.js
|
|
39770
39824
|
var makeIssue = (params) => {
|
|
39771
39825
|
const { data, path, errorMaps, issueData } = params;
|
|
39772
39826
|
const fullPath = [...path, ...issueData.path || []];
|
|
@@ -39870,14 +39924,14 @@ var isDirty = (x) => x.status === "dirty";
|
|
|
39870
39924
|
var isValid = (x) => x.status === "valid";
|
|
39871
39925
|
var isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise;
|
|
39872
39926
|
//#endregion
|
|
39873
|
-
//#region
|
|
39927
|
+
//#region node_modules/@apocaliss92/nodewitt/node_modules/zod/v3/helpers/errorUtil.js
|
|
39874
39928
|
var errorUtil;
|
|
39875
39929
|
(function(errorUtil) {
|
|
39876
39930
|
errorUtil.errToObj = (message) => typeof message === "string" ? { message } : message || {};
|
|
39877
39931
|
errorUtil.toString = (message) => typeof message === "string" ? message : message?.message;
|
|
39878
39932
|
})(errorUtil || (errorUtil = {}));
|
|
39879
39933
|
//#endregion
|
|
39880
|
-
//#region
|
|
39934
|
+
//#region node_modules/@apocaliss92/nodewitt/node_modules/zod/v3/types.js
|
|
39881
39935
|
var ParseInputLazyPath = class {
|
|
39882
39936
|
constructor(parent, value, path, key) {
|
|
39883
39937
|
this._cachedPath = [];
|
|
@@ -43029,7 +43083,7 @@ ZodNullable.create;
|
|
|
43029
43083
|
ZodEffects.createWithPreprocess;
|
|
43030
43084
|
ZodPipeline.create;
|
|
43031
43085
|
//#endregion
|
|
43032
|
-
//#region
|
|
43086
|
+
//#region node_modules/@apocaliss92/nodewitt/dist/index.js
|
|
43033
43087
|
var import_undici = require_undici();
|
|
43034
43088
|
var DEFAULT_PORT = 80;
|
|
43035
43089
|
var DEFAULT_TIMEOUT_MS = 3e4;
|
|
@@ -43983,6 +44037,71 @@ var fixed = {
|
|
|
43983
44037
|
combo: [...COMBO_KEYS],
|
|
43984
44038
|
co2_pm: [...COMBO_KEYS]
|
|
43985
44039
|
};
|
|
44040
|
+
var WEATHER_STATION_MODELS = /* @__PURE__ */ new Set([
|
|
44041
|
+
"wh69",
|
|
44042
|
+
"wh65",
|
|
44043
|
+
"ws90",
|
|
44044
|
+
"wh80",
|
|
44045
|
+
"ws80",
|
|
44046
|
+
"wh90",
|
|
44047
|
+
"wh77",
|
|
44048
|
+
"wh85",
|
|
44049
|
+
"ws85",
|
|
44050
|
+
"wh68",
|
|
44051
|
+
"weather_station",
|
|
44052
|
+
"weather_station_wh69",
|
|
44053
|
+
"weather_station_ws90",
|
|
44054
|
+
"weather_station_wh90",
|
|
44055
|
+
"weather_station_wh77"
|
|
44056
|
+
]);
|
|
44057
|
+
var CHANNEL_SENSOR_MODELS = /* @__PURE__ */ new Set([
|
|
44058
|
+
"wh31",
|
|
44059
|
+
"wh41",
|
|
44060
|
+
"wh52",
|
|
44061
|
+
"wh51",
|
|
44062
|
+
"wh55",
|
|
44063
|
+
"wh34",
|
|
44064
|
+
"wn34",
|
|
44065
|
+
"wh35",
|
|
44066
|
+
"wn35",
|
|
44067
|
+
"wh54",
|
|
44068
|
+
"temp_hum",
|
|
44069
|
+
"pm25",
|
|
44070
|
+
"soil",
|
|
44071
|
+
"soil_ec",
|
|
44072
|
+
"leak",
|
|
44073
|
+
"temp_only",
|
|
44074
|
+
"leaf_wetness",
|
|
44075
|
+
"lds"
|
|
44076
|
+
]);
|
|
44077
|
+
var EXTERNAL_MODELS = /* @__PURE__ */ new Set([
|
|
44078
|
+
"wh57",
|
|
44079
|
+
"wh40",
|
|
44080
|
+
"wh45",
|
|
44081
|
+
"wh46",
|
|
44082
|
+
"lightning",
|
|
44083
|
+
"rain",
|
|
44084
|
+
"combo",
|
|
44085
|
+
"co2_pm"
|
|
44086
|
+
]);
|
|
44087
|
+
var GATEWAY_MODELS = /* @__PURE__ */ new Set([
|
|
44088
|
+
"wh25",
|
|
44089
|
+
"indoor_station",
|
|
44090
|
+
"wh26",
|
|
44091
|
+
"wn32",
|
|
44092
|
+
"outdoor_temp_hum",
|
|
44093
|
+
"wn38",
|
|
44094
|
+
"bgt"
|
|
44095
|
+
]);
|
|
44096
|
+
function categoryForModel(model) {
|
|
44097
|
+
const key = norm(model ?? "");
|
|
44098
|
+
if (key === "") return "gateway";
|
|
44099
|
+
if (WEATHER_STATION_MODELS.has(key)) return "weather-station";
|
|
44100
|
+
if (CHANNEL_SENSOR_MODELS.has(key)) return "channel-sensor";
|
|
44101
|
+
if (EXTERNAL_MODELS.has(key)) return "external";
|
|
44102
|
+
if (GATEWAY_MODELS.has(key)) return "gateway";
|
|
44103
|
+
return "gateway";
|
|
44104
|
+
}
|
|
43986
44105
|
function liveDataKeysForModel(model, channel) {
|
|
43987
44106
|
const key = norm(model);
|
|
43988
44107
|
const channelBuilder = Object.prototype.hasOwnProperty.call(channelized, key) ? channelized[key] : void 0;
|
|
@@ -44075,6 +44194,7 @@ var LocalPoller = class {
|
|
|
44075
44194
|
scanTimer;
|
|
44076
44195
|
mappingTimer;
|
|
44077
44196
|
started = false;
|
|
44197
|
+
mappingPrimed = false;
|
|
44078
44198
|
gatewayTempUnit = "C";
|
|
44079
44199
|
stationInfo = {};
|
|
44080
44200
|
/** Gateway identity (model/firmware) captured from the last `/get_version`. Best-effort. */
|
|
@@ -44111,6 +44231,7 @@ var LocalPoller = class {
|
|
|
44111
44231
|
this.scanTimer = void 0;
|
|
44112
44232
|
this.mappingTimer = void 0;
|
|
44113
44233
|
this.started = false;
|
|
44234
|
+
this.mappingPrimed = false;
|
|
44114
44235
|
}
|
|
44115
44236
|
/** Re-read the gateway unit + sensor list and rebuild the live-key -> hardware-id mapping. Offline-tolerant. */
|
|
44116
44237
|
async refreshMapping() {
|
|
@@ -44125,6 +44246,7 @@ var LocalPoller = class {
|
|
|
44125
44246
|
};
|
|
44126
44247
|
const sensors = await this.opts.endpoints.getAllSensors();
|
|
44127
44248
|
this.mapper.updateMapping(sensors);
|
|
44249
|
+
this.mappingPrimed = true;
|
|
44128
44250
|
} catch (error) {
|
|
44129
44251
|
this.opts.onError(error);
|
|
44130
44252
|
}
|
|
@@ -44132,12 +44254,14 @@ var LocalPoller = class {
|
|
|
44132
44254
|
/** Fetch + decode + resolve a single live-data snapshot, then emit it. Offline-tolerant. */
|
|
44133
44255
|
async poll() {
|
|
44134
44256
|
try {
|
|
44257
|
+
if (!this.mappingPrimed) await this.refreshMapping();
|
|
44135
44258
|
const raw = await this.opts.endpoints.getLiveData();
|
|
44136
44259
|
this.opts.onRawFrame?.(raw);
|
|
44137
44260
|
const resolved = decodeLiveData(raw, this.mapper, {}, this.gatewayTempUnit).map((reading) => ({
|
|
44138
44261
|
...reading,
|
|
44139
44262
|
hardwareId: GATEWAY_KEYS.has(reading.key) ? void 0 : reading.forceHardwareId ?? this.mapper.getHardwareId(reading.key)
|
|
44140
44263
|
}));
|
|
44264
|
+
if (!this.mappingPrimed) return;
|
|
44141
44265
|
this.opts.onReadings(resolved);
|
|
44142
44266
|
} catch (error) {
|
|
44143
44267
|
this.opts.onError(error);
|
|
@@ -44741,11 +44865,13 @@ var Station = class {
|
|
|
44741
44865
|
const info = lookup.getSensorInfoForKey(r.key) ?? (owner !== void 0 ? lookup.getSensorInfo(owner) : void 0);
|
|
44742
44866
|
const id = `${owner ?? GATEWAY_OWNER}:${r.key}`;
|
|
44743
44867
|
const signal = signalToNumber(info?.signal);
|
|
44868
|
+
const category = categoryForModel(info?.model);
|
|
44744
44869
|
this.upsert(id, {
|
|
44745
44870
|
id,
|
|
44746
44871
|
...owner !== void 0 ? { hardwareId: owner } : {},
|
|
44747
44872
|
...info?.model ? { model: info.model } : {},
|
|
44748
44873
|
...info?.channel !== void 0 ? { channel: info.channel } : {},
|
|
44874
|
+
category,
|
|
44749
44875
|
...cls.name !== void 0 ? { name: cls.name } : {},
|
|
44750
44876
|
quantity: cls.quantity,
|
|
44751
44877
|
value: r.value,
|
|
@@ -44777,9 +44903,11 @@ var Station = class {
|
|
|
44777
44903
|
if (cls.kind === "battery") continue;
|
|
44778
44904
|
if (cls.kind !== "measurement") continue;
|
|
44779
44905
|
const id = `${this.pushOwner(passkey, r.channel)}:${r.key}`;
|
|
44906
|
+
const category = r.channel !== void 0 ? "channel-sensor" : "gateway";
|
|
44780
44907
|
this.upsert(id, {
|
|
44781
44908
|
id,
|
|
44782
44909
|
...r.channel !== void 0 ? { channel: r.channel } : {},
|
|
44910
|
+
category,
|
|
44783
44911
|
...cls.name !== void 0 ? { name: cls.name } : {},
|
|
44784
44912
|
quantity: cls.quantity,
|
|
44785
44913
|
value: r.value,
|
|
@@ -44878,6 +45006,101 @@ var TypedEmitter = class {
|
|
|
44878
45006
|
return this;
|
|
44879
45007
|
}
|
|
44880
45008
|
};
|
|
45009
|
+
var CMD_BROADCAST = 18;
|
|
45010
|
+
var DISCOVERY_PORT = 46e3;
|
|
45011
|
+
function buildScanPacket() {
|
|
45012
|
+
const size = 3;
|
|
45013
|
+
const checksum = CMD_BROADCAST + size & 255;
|
|
45014
|
+
return Buffer.from([
|
|
45015
|
+
255,
|
|
45016
|
+
255,
|
|
45017
|
+
CMD_BROADCAST,
|
|
45018
|
+
size,
|
|
45019
|
+
checksum
|
|
45020
|
+
]);
|
|
45021
|
+
}
|
|
45022
|
+
function verifyChecksum(buf) {
|
|
45023
|
+
if (buf.length < 4) return false;
|
|
45024
|
+
let sum = 0;
|
|
45025
|
+
for (let i = 2; i < buf.length - 1; i += 1) sum = sum + (buf[i] ?? 0) & 255;
|
|
45026
|
+
return sum === buf[buf.length - 1];
|
|
45027
|
+
}
|
|
45028
|
+
function parseBroadcastResponse(buf) {
|
|
45029
|
+
if (buf.length < 18) return null;
|
|
45030
|
+
if (buf[0] !== 255 || buf[1] !== 255 || buf[2] !== CMD_BROADCAST) return null;
|
|
45031
|
+
if (!verifyChecksum(buf)) return null;
|
|
45032
|
+
const mac = macFromBytes(buf.subarray(5, 11));
|
|
45033
|
+
const tcpPort = buf.readUInt16BE(15);
|
|
45034
|
+
const ssidLen = buf[17] ?? 0;
|
|
45035
|
+
const ssidEnd = Math.min(18 + ssidLen, buf.length - 1);
|
|
45036
|
+
const { module, model, firmware } = splitSsid(buf.subarray(18, ssidEnd).toString("ascii").trim());
|
|
45037
|
+
return {
|
|
45038
|
+
mac,
|
|
45039
|
+
module,
|
|
45040
|
+
model,
|
|
45041
|
+
firmware,
|
|
45042
|
+
tcpPort
|
|
45043
|
+
};
|
|
45044
|
+
}
|
|
45045
|
+
function macFromBytes(bytes) {
|
|
45046
|
+
return [...bytes].map((b) => b.toString(16).padStart(2, "0")).join(":");
|
|
45047
|
+
}
|
|
45048
|
+
function splitSsid(ssid) {
|
|
45049
|
+
const spaceIdx = ssid.indexOf(" ");
|
|
45050
|
+
const module = spaceIdx >= 0 ? ssid.slice(0, spaceIdx) : ssid;
|
|
45051
|
+
const firmwareRaw = spaceIdx >= 0 ? ssid.slice(spaceIdx + 1).trim() : "";
|
|
45052
|
+
const wifiIdx = module.indexOf("-WIFI");
|
|
45053
|
+
return {
|
|
45054
|
+
module,
|
|
45055
|
+
model: wifiIdx > 0 ? module.slice(0, wifiIdx) : void 0,
|
|
45056
|
+
firmware: firmwareRaw.length > 0 ? firmwareRaw : void 0
|
|
45057
|
+
};
|
|
45058
|
+
}
|
|
45059
|
+
function discoverGateways(socket, opts) {
|
|
45060
|
+
const port = opts?.port ?? DISCOVERY_PORT;
|
|
45061
|
+
const broadcastAddr = opts?.broadcastAddr ?? "255.255.255.255";
|
|
45062
|
+
const timeoutMs = opts?.timeoutMs ?? 3e3;
|
|
45063
|
+
const byMac = /* @__PURE__ */ new Map();
|
|
45064
|
+
socket.onMessage((m) => {
|
|
45065
|
+
const frame = parseBroadcastResponse(m.data);
|
|
45066
|
+
if (frame === null) return;
|
|
45067
|
+
byMac.set(frame.mac, {
|
|
45068
|
+
ip: m.address,
|
|
45069
|
+
mac: frame.mac,
|
|
45070
|
+
name: frame.module.length > 0 ? frame.module : frame.mac,
|
|
45071
|
+
...frame.model !== void 0 ? { model: frame.model } : {},
|
|
45072
|
+
...frame.firmware !== void 0 ? { firmware: frame.firmware } : {}
|
|
45073
|
+
});
|
|
45074
|
+
});
|
|
45075
|
+
socket.setBroadcast(true);
|
|
45076
|
+
const scan = buildScanPacket();
|
|
45077
|
+
return new Promise((resolve) => {
|
|
45078
|
+
socket.send(scan, port, broadcastAddr);
|
|
45079
|
+
setTimeout(() => resolve([...byMac.values()]), timeoutMs);
|
|
45080
|
+
});
|
|
45081
|
+
}
|
|
45082
|
+
function createDgramSocket() {
|
|
45083
|
+
return new Promise((resolve, reject) => {
|
|
45084
|
+
const socket = createSocket({
|
|
45085
|
+
type: "udp4",
|
|
45086
|
+
reuseAddr: true
|
|
45087
|
+
});
|
|
45088
|
+
socket.once("error", reject);
|
|
45089
|
+
socket.bind(() => {
|
|
45090
|
+
socket.removeListener("error", reject);
|
|
45091
|
+
resolve({
|
|
45092
|
+
send: (data, port, address) => new Promise((res, rej) => socket.send(data, port, address, (err) => err ? rej(err) : res())),
|
|
45093
|
+
onMessage: (handler) => socket.on("message", (data, rinfo) => handler({
|
|
45094
|
+
data,
|
|
45095
|
+
address: rinfo.address,
|
|
45096
|
+
port: rinfo.port
|
|
45097
|
+
})),
|
|
45098
|
+
setBroadcast: (enabled) => socket.setBroadcast(enabled),
|
|
45099
|
+
close: () => new Promise((res) => socket.close(() => res()))
|
|
45100
|
+
});
|
|
45101
|
+
});
|
|
45102
|
+
});
|
|
45103
|
+
}
|
|
44881
45104
|
function toError(error) {
|
|
44882
45105
|
return error instanceof Error ? error : new Error(String(error));
|
|
44883
45106
|
}
|
|
@@ -44902,6 +45125,21 @@ var Ecowitt = class _Ecowitt {
|
|
|
44902
45125
|
return _Ecowitt.#buildListener(defaultListenerBuilder(options));
|
|
44903
45126
|
}
|
|
44904
45127
|
/**
|
|
45128
|
+
* Discover Ecowitt gateways on the network via the `CMD_BROADCAST` UDP probe (port 46000). Opens a
|
|
45129
|
+
* throwaway UDP socket, sweeps the broadcast address (local subnet by default, or a directed
|
|
45130
|
+
* broadcast passed via {@link DiscoverOptions.broadcastAddr} for another subnet), collects
|
|
45131
|
+
* responders deduped by MAC, and closes the socket. No `Ecowitt` instance or connection is
|
|
45132
|
+
* created — the caller maps the results to whatever onboarding flow it uses.
|
|
45133
|
+
*/
|
|
45134
|
+
static async discover(options) {
|
|
45135
|
+
const socket = await createDgramSocket();
|
|
45136
|
+
try {
|
|
45137
|
+
return await discoverGateways(socket, options);
|
|
45138
|
+
} finally {
|
|
45139
|
+
await socket.close().catch(() => void 0);
|
|
45140
|
+
}
|
|
45141
|
+
}
|
|
45142
|
+
/**
|
|
44905
45143
|
* Build a local-transport facade from a transport builder. The wiring closure that hands the
|
|
44906
45144
|
* builder its `onReadings`/`onError` callbacks lives HERE, inside the class, so it can call the
|
|
44907
45145
|
* `#`-private ingest seams directly — no public method, no cast. `#`-private so it is unreachable
|
|
@@ -45107,6 +45345,219 @@ objectType({
|
|
|
45107
45345
|
})
|
|
45108
45346
|
});
|
|
45109
45347
|
//#endregion
|
|
45348
|
+
//#region src/config.ts
|
|
45349
|
+
/**
|
|
45350
|
+
* Operator-supplied Ecowitt gateway settings for ONE broker (= one station).
|
|
45351
|
+
* Two transports behind a `transport` discriminator:
|
|
45352
|
+
*
|
|
45353
|
+
* - `local` (local-poll): the addon polls the gateway over HTTP (`host`/`port`/
|
|
45354
|
+
* optional `password`, with poll + mapping intervals).
|
|
45355
|
+
* - `listener` (push): the addon runs an HTTP server the gateway uploads to
|
|
45356
|
+
* (the gateway's "Customized" upload must point at the hub's LAN IP:port).
|
|
45357
|
+
*
|
|
45358
|
+
* Local-poll is the recommended default — it has no inbound-IP constraint.
|
|
45359
|
+
*/
|
|
45360
|
+
var baseFields = {
|
|
45361
|
+
/** Human-overridable station identity used to scope the adopted gateway. */
|
|
45362
|
+
stationId: string().default("").describe("Optional stable station id (auto-derived when blank)") };
|
|
45363
|
+
var ecowittConfigSchema = discriminatedUnion("transport", [object({
|
|
45364
|
+
transport: literal("local"),
|
|
45365
|
+
host: string().min(1).describe("Ecowitt gateway host name or IP address"),
|
|
45366
|
+
port: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1).max(65535).default(80)).describe("Gateway HTTP port"),
|
|
45367
|
+
password: string().default("").describe("Gateway password (optional — newer firmware)"),
|
|
45368
|
+
pollIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1e3).max(36e5).default(6e4)).describe("Live-data poll interval (ms)"),
|
|
45369
|
+
mappingIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1e4).max(864e5).default(6e5)).describe("Sensor-map refresh interval (ms)"),
|
|
45370
|
+
...baseFields
|
|
45371
|
+
}), object({
|
|
45372
|
+
transport: literal("listener"),
|
|
45373
|
+
listenPort: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1).max(65535).default(4199)).describe("Local TCP port the gateway uploads to"),
|
|
45374
|
+
listenHost: string().default("").describe("Optional bind host (blank = all interfaces)"),
|
|
45375
|
+
...baseFields
|
|
45376
|
+
})]);
|
|
45377
|
+
/**
|
|
45378
|
+
* Narrow an `unknown` value to a shallow-cloned plain object record, or an empty
|
|
45379
|
+
* record when it is not a plain object. Mirrors the Homematic `toRecord` helper —
|
|
45380
|
+
* a cast-free boundary narrowing.
|
|
45381
|
+
*/
|
|
45382
|
+
function toRecord(value) {
|
|
45383
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) return Object.fromEntries(Object.entries(value));
|
|
45384
|
+
return {};
|
|
45385
|
+
}
|
|
45386
|
+
/** Coerce a loose settings blob through the connection schema, applying defaults.
|
|
45387
|
+
* A blob with no `transport` defaults to `local` for back-compat with simple forms. */
|
|
45388
|
+
function settingsToEcowittConfig(settings) {
|
|
45389
|
+
const raw = toRecord(settings);
|
|
45390
|
+
if (raw["transport"] !== "local" && raw["transport"] !== "listener") raw["transport"] = "local";
|
|
45391
|
+
return ecowittConfigSchema.parse(raw);
|
|
45392
|
+
}
|
|
45393
|
+
/**
|
|
45394
|
+
* Persisted config for an Ecowitt gateway {@link import('@camstack/types').DeviceType.Hub}
|
|
45395
|
+
* device. The operator-supplied CONNECTION lives directly on the device (Reolink
|
|
45396
|
+
* pattern) — there is no broker registry. The gateway owns its own live nodewitt
|
|
45397
|
+
* client keyed on its own `stableId`; group Container children reference it via
|
|
45398
|
+
* their `gatewayId` config field.
|
|
45399
|
+
*/
|
|
45400
|
+
var ecowittGatewaySchema = object({
|
|
45401
|
+
/** The transport + endpoint the gateway's live client dials / binds. */
|
|
45402
|
+
connection: ecowittConfigSchema,
|
|
45403
|
+
/** Provenance marker used to scope offline / cascade helpers. */
|
|
45404
|
+
system: literal("ecowitt-gateway").optional()
|
|
45405
|
+
});
|
|
45406
|
+
/**
|
|
45407
|
+
* Hand-written connection form for the gateway device-creation UI (standalone
|
|
45408
|
+
* mode — Reolink pattern). The connection lives on the gateway DEVICE config,
|
|
45409
|
+
* not in a broker registry. A `name` field is included so the operator names
|
|
45410
|
+
* the gateway Hub at creation time (mirrors the Reolink creation form).
|
|
45411
|
+
*/
|
|
45412
|
+
function buildConnectionFormSchema() {
|
|
45413
|
+
return { sections: [
|
|
45414
|
+
{
|
|
45415
|
+
id: "identity",
|
|
45416
|
+
title: "Gateway",
|
|
45417
|
+
columns: 1,
|
|
45418
|
+
fields: [{
|
|
45419
|
+
type: "text",
|
|
45420
|
+
key: "name",
|
|
45421
|
+
label: "Name",
|
|
45422
|
+
required: true,
|
|
45423
|
+
placeholder: "Weather station"
|
|
45424
|
+
}]
|
|
45425
|
+
},
|
|
45426
|
+
{
|
|
45427
|
+
id: "transport",
|
|
45428
|
+
title: "Transport",
|
|
45429
|
+
description: "Choose how CamStack reads the gateway. Local poll connects out to the gateway (recommended). Push listener runs a server the gateway uploads to — configure the gateway \"Customized\" upload to point at this hub.",
|
|
45430
|
+
columns: 1,
|
|
45431
|
+
fields: [{
|
|
45432
|
+
type: "select",
|
|
45433
|
+
key: "transport",
|
|
45434
|
+
label: "Transport",
|
|
45435
|
+
default: "local",
|
|
45436
|
+
options: [{
|
|
45437
|
+
value: "local",
|
|
45438
|
+
label: "Local poll (recommended)"
|
|
45439
|
+
}, {
|
|
45440
|
+
value: "listener",
|
|
45441
|
+
label: "Push listener"
|
|
45442
|
+
}]
|
|
45443
|
+
}]
|
|
45444
|
+
},
|
|
45445
|
+
{
|
|
45446
|
+
id: "local",
|
|
45447
|
+
title: "Local poll settings",
|
|
45448
|
+
columns: 2,
|
|
45449
|
+
fields: [
|
|
45450
|
+
{
|
|
45451
|
+
type: "text",
|
|
45452
|
+
key: "host",
|
|
45453
|
+
label: "Gateway host / IP",
|
|
45454
|
+
placeholder: "192.168.1.50",
|
|
45455
|
+
showWhen: {
|
|
45456
|
+
field: "transport",
|
|
45457
|
+
equals: "local"
|
|
45458
|
+
}
|
|
45459
|
+
},
|
|
45460
|
+
{
|
|
45461
|
+
type: "number",
|
|
45462
|
+
key: "port",
|
|
45463
|
+
label: "HTTP port",
|
|
45464
|
+
min: 1,
|
|
45465
|
+
max: 65535,
|
|
45466
|
+
default: 80,
|
|
45467
|
+
showWhen: {
|
|
45468
|
+
field: "transport",
|
|
45469
|
+
equals: "local"
|
|
45470
|
+
}
|
|
45471
|
+
},
|
|
45472
|
+
{
|
|
45473
|
+
type: "password",
|
|
45474
|
+
key: "password",
|
|
45475
|
+
label: "Password (optional)",
|
|
45476
|
+
showToggle: true,
|
|
45477
|
+
showWhen: {
|
|
45478
|
+
field: "transport",
|
|
45479
|
+
equals: "local"
|
|
45480
|
+
}
|
|
45481
|
+
},
|
|
45482
|
+
{
|
|
45483
|
+
type: "number",
|
|
45484
|
+
key: "pollIntervalMs",
|
|
45485
|
+
label: "Poll interval (ms)",
|
|
45486
|
+
min: 1e3,
|
|
45487
|
+
max: 36e5,
|
|
45488
|
+
default: 6e4,
|
|
45489
|
+
showWhen: {
|
|
45490
|
+
field: "transport",
|
|
45491
|
+
equals: "local"
|
|
45492
|
+
}
|
|
45493
|
+
}
|
|
45494
|
+
]
|
|
45495
|
+
},
|
|
45496
|
+
{
|
|
45497
|
+
id: "listener",
|
|
45498
|
+
title: "Push listener settings",
|
|
45499
|
+
columns: 2,
|
|
45500
|
+
fields: [{
|
|
45501
|
+
type: "number",
|
|
45502
|
+
key: "listenPort",
|
|
45503
|
+
label: "Listen port",
|
|
45504
|
+
min: 1,
|
|
45505
|
+
max: 65535,
|
|
45506
|
+
default: 4199,
|
|
45507
|
+
showWhen: {
|
|
45508
|
+
field: "transport",
|
|
45509
|
+
equals: "listener"
|
|
45510
|
+
}
|
|
45511
|
+
}, {
|
|
45512
|
+
type: "text",
|
|
45513
|
+
key: "listenHost",
|
|
45514
|
+
label: "Bind host (optional)",
|
|
45515
|
+
placeholder: "all interfaces",
|
|
45516
|
+
showWhen: {
|
|
45517
|
+
field: "transport",
|
|
45518
|
+
equals: "listener"
|
|
45519
|
+
}
|
|
45520
|
+
}]
|
|
45521
|
+
}
|
|
45522
|
+
] };
|
|
45523
|
+
}
|
|
45524
|
+
/**
|
|
45525
|
+
* Slugify a host / station id into a readable, stable row-key fragment. Exported so the discovery
|
|
45526
|
+
* candidate's `stableId` matches exactly what `generateStableId` derives on adopt (else a re-scan of
|
|
45527
|
+
* an already-added gateway would not be detected as onboarded).
|
|
45528
|
+
*/
|
|
45529
|
+
function slugifyHost(value) {
|
|
45530
|
+
return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
45531
|
+
}
|
|
45532
|
+
/**
|
|
45533
|
+
* Extra per-scan inputs for Ecowitt network discovery. Mirrors Gree's scan form. On a flat network,
|
|
45534
|
+
* leave blank to sweep the addon node's local subnet. Gateways on ANOTHER subnet usually can't be
|
|
45535
|
+
* reached by a directed broadcast (most routers don't forward it) — enter the gateway's IP instead:
|
|
45536
|
+
* the `CMD_BROADCAST` probe answers a unicast just as well and returns the gateway's identity.
|
|
45537
|
+
*/
|
|
45538
|
+
function buildDiscoveryParamsFormSchema() {
|
|
45539
|
+
return { sections: [{
|
|
45540
|
+
id: "scan",
|
|
45541
|
+
title: "Scan options",
|
|
45542
|
+
description: "Leave empty to scan the local subnet. To find a gateway on a different subnet, enter that subnet’s broadcast address (e.g. 192.168.20.255) or the gateway’s IP directly (e.g. 192.168.20.181).",
|
|
45543
|
+
columns: 1,
|
|
45544
|
+
fields: [{
|
|
45545
|
+
type: "text",
|
|
45546
|
+
key: "broadcastAddress",
|
|
45547
|
+
label: "Broadcast address or gateway IP",
|
|
45548
|
+
required: false,
|
|
45549
|
+
placeholder: "192.168.20.255"
|
|
45550
|
+
}, {
|
|
45551
|
+
type: "number",
|
|
45552
|
+
key: "timeoutMs",
|
|
45553
|
+
label: "UDP timeout (ms)",
|
|
45554
|
+
min: 500,
|
|
45555
|
+
max: 3e4,
|
|
45556
|
+
default: 3e3
|
|
45557
|
+
}]
|
|
45558
|
+
}] };
|
|
45559
|
+
}
|
|
45560
|
+
//#endregion
|
|
45110
45561
|
//#region src/ecowitt-integration-manager.ts
|
|
45111
45562
|
/** Build the real nodewitt facade for a transport. Pure. */
|
|
45112
45563
|
function defaultEcowittFacadeFactory(config) {
|
|
@@ -45247,500 +45698,82 @@ var EcowittIntegrationManager = class {
|
|
|
45247
45698
|
await this.start();
|
|
45248
45699
|
}
|
|
45249
45700
|
};
|
|
45250
|
-
/** True when two configs are the "same connection" (no facade rebuild needed). */
|
|
45251
|
-
function sameConnection(a, b) {
|
|
45252
|
-
if (a === null || b === null) return false;
|
|
45253
|
-
if (a.transport !== b.transport) return false;
|
|
45254
|
-
if (a.transport === "local" && b.transport === "local") return a.host === b.host && a.port === b.port && a.password === b.password && a.pollIntervalMs === b.pollIntervalMs && a.mappingIntervalMs === b.mappingIntervalMs;
|
|
45255
|
-
if (a.transport === "listener" && b.transport === "listener") return a.listenPort === b.listenPort && a.listenHost === b.listenHost;
|
|
45256
|
-
return false;
|
|
45257
|
-
}
|
|
45258
45701
|
//#endregion
|
|
45259
45702
|
//#region src/ecowitt-gateway.ts
|
|
45260
45703
|
/**
|
|
45261
|
-
* Per-
|
|
45262
|
-
*
|
|
45704
|
+
* Per-gateway registry that device classes use to reach the live {@link Ecowitt}
|
|
45705
|
+
* client (and its current sensor snapshot) for a given gateway. Keyed on the
|
|
45706
|
+
* gateway {@link import('@camstack/types').DeviceType.Hub} device's `stableId`
|
|
45707
|
+
* (standalone mode — the connection lives on the gateway device, not a broker).
|
|
45263
45708
|
*
|
|
45264
|
-
* Because the nodewitt
|
|
45265
|
-
* recreates the
|
|
45266
|
-
*
|
|
45267
|
-
* the new
|
|
45709
|
+
* Because the nodewitt client's `stop()` is TERMINAL, the gateway device
|
|
45710
|
+
* recreates the client on reconnect / settings change and re-publishes it here.
|
|
45711
|
+
* Container + sensor children always read through the resolver, so they
|
|
45712
|
+
* transparently pick up the new client. Mirrors the Homematic / Dreame in-process
|
|
45713
|
+
* facade resolver.
|
|
45268
45714
|
*/
|
|
45269
45715
|
var EcowittFacadeResolver = class {
|
|
45270
45716
|
#facades = /* @__PURE__ */ new Map();
|
|
45271
|
-
/**
|
|
45272
|
-
|
|
45717
|
+
/**
|
|
45718
|
+
* Per-gateway snapshot fan-out. Container + sensor children subscribe here
|
|
45719
|
+
* instead of attaching directly to the nodewitt facade's EventEmitter — a
|
|
45720
|
+
* station with >10 sensors would otherwise trip Node's default MaxListeners
|
|
45721
|
+
* cap (one listener per child on a single emitter). The gateway device pumps
|
|
45722
|
+
* this bus once per snapshot from its single facade subscription; a plain
|
|
45723
|
+
* `Set` of callbacks has no listener limit.
|
|
45724
|
+
*/
|
|
45725
|
+
#snapshotSubs = /* @__PURE__ */ new Map();
|
|
45726
|
+
/** Publish or remove the client for a gateway id. `null` removes the entry. */
|
|
45727
|
+
set(gatewayId, facade) {
|
|
45273
45728
|
if (facade === null) {
|
|
45274
|
-
this.#facades.delete(
|
|
45729
|
+
this.#facades.delete(gatewayId);
|
|
45275
45730
|
return;
|
|
45276
45731
|
}
|
|
45277
|
-
this.#facades.set(
|
|
45278
|
-
}
|
|
45279
|
-
/** The live facade for a broker id, or null when unknown / stopped. */
|
|
45280
|
-
get(brokerId) {
|
|
45281
|
-
return this.#facades.get(brokerId) ?? null;
|
|
45282
|
-
}
|
|
45283
|
-
/** All current sensors for a broker's gateway, or [] when unknown. */
|
|
45284
|
-
getSensors(brokerId) {
|
|
45285
|
-
return this.#facades.get(brokerId)?.getSensors() ?? [];
|
|
45286
|
-
}
|
|
45287
|
-
/** Resolve a single sensor by its stable id for a broker, or null. */
|
|
45288
|
-
getSensor(brokerId, sensorId) {
|
|
45289
|
-
return this.getSensors(brokerId).find((s) => s.id === sensorId) ?? null;
|
|
45290
|
-
}
|
|
45291
|
-
/** Remove all registered facades (called on full shutdown). */
|
|
45292
|
-
clear() {
|
|
45293
|
-
this.#facades.clear();
|
|
45294
|
-
}
|
|
45295
|
-
};
|
|
45296
|
-
/** The single in-process per-broker facade resolver shared between the registry
|
|
45297
|
-
* and device instances. */
|
|
45298
|
-
var ecowittFacades = new EcowittFacadeResolver();
|
|
45299
|
-
//#endregion
|
|
45300
|
-
//#region src/ecowitt-broker-registry.ts
|
|
45301
|
-
/**
|
|
45302
|
-
* Manages N live Ecowitt gateway connections ("brokers"), each backed by an
|
|
45303
|
-
* {@link EcowittIntegrationManager}. Allocates stable ids (`ecowitt_001`, …),
|
|
45304
|
-
* CRUD, an integration FK index, lifecycle helpers. Mirrors the Homematic /
|
|
45305
|
-
* Dreame registry; on the default factory path it publishes each freshly-built
|
|
45306
|
-
* facade on `ecowittFacades` so device classes can read sensors in-process.
|
|
45307
|
-
*/
|
|
45308
|
-
var EcowittBrokerRegistry = class {
|
|
45309
|
-
#logger;
|
|
45310
|
-
#onBrokerConnected;
|
|
45311
|
-
#onBrokerDisconnected;
|
|
45312
|
-
#onSensorsChanged;
|
|
45313
|
-
#makeManager;
|
|
45314
|
-
#managers = /* @__PURE__ */ new Map();
|
|
45315
|
-
#integrationToBroker = /* @__PURE__ */ new Map();
|
|
45316
|
-
#nextId = 1;
|
|
45317
|
-
constructor(logger, deps = {}) {
|
|
45318
|
-
this.#logger = logger;
|
|
45319
|
-
this.#onBrokerConnected = deps.onBrokerConnected ?? (() => void 0);
|
|
45320
|
-
this.#onBrokerDisconnected = deps.onBrokerDisconnected ?? (() => void 0);
|
|
45321
|
-
this.#onSensorsChanged = deps.onSensorsChanged ?? (() => void 0);
|
|
45322
|
-
this.#makeManager = deps.makeManager ?? ((opts) => new EcowittIntegrationManager({
|
|
45323
|
-
id: opts.id,
|
|
45324
|
-
name: opts.name,
|
|
45325
|
-
connection: opts.connection,
|
|
45326
|
-
logger: opts.logger,
|
|
45327
|
-
onConnected: opts.onConnected,
|
|
45328
|
-
onDisconnected: opts.onDisconnected,
|
|
45329
|
-
onSensorsChanged: opts.onSensorsChanged,
|
|
45330
|
-
onFacadeBuilt: (id, facade) => ecowittFacades.set(id, facade)
|
|
45331
|
-
}));
|
|
45332
|
-
}
|
|
45333
|
-
async restore(entries) {
|
|
45334
|
-
for (const entry of entries) this.#seedCounter(entry.id);
|
|
45335
|
-
for (const entry of entries) try {
|
|
45336
|
-
await this.#startManager(entry);
|
|
45337
|
-
} catch (err) {
|
|
45338
|
-
this.#logger.warn("EcowittBrokerRegistry: failed to restore manager", {
|
|
45339
|
-
tags: { brokerId: entry.id },
|
|
45340
|
-
meta: { error: errMsg(err) }
|
|
45341
|
-
});
|
|
45342
|
-
}
|
|
45343
|
-
}
|
|
45344
|
-
async shutdown() {
|
|
45345
|
-
const ids = Array.from(this.#managers.keys());
|
|
45346
|
-
await Promise.all(ids.map(async (id) => {
|
|
45347
|
-
try {
|
|
45348
|
-
await this.#managers.get(id)?.stop();
|
|
45349
|
-
} catch (err) {
|
|
45350
|
-
this.#logger.warn("EcowittBrokerRegistry: shutdown stop failed", {
|
|
45351
|
-
tags: { brokerId: id },
|
|
45352
|
-
meta: { error: errMsg(err) }
|
|
45353
|
-
});
|
|
45354
|
-
}
|
|
45355
|
-
}));
|
|
45356
|
-
this.#managers.clear();
|
|
45357
|
-
this.#integrationToBroker.clear();
|
|
45358
|
-
ecowittFacades.clear();
|
|
45732
|
+
this.#facades.set(gatewayId, facade);
|
|
45359
45733
|
}
|
|
45360
|
-
|
|
45361
|
-
|
|
45362
|
-
|
|
45363
|
-
|
|
45364
|
-
|
|
45365
|
-
|
|
45366
|
-
setOnSensorsChanged(cb) {
|
|
45367
|
-
this.#onSensorsChanged = cb;
|
|
45368
|
-
}
|
|
45369
|
-
async createEntry(name, connection, opts = {}) {
|
|
45370
|
-
const id = this.#allocateId();
|
|
45371
|
-
const entry = {
|
|
45372
|
-
id,
|
|
45373
|
-
name,
|
|
45374
|
-
connection,
|
|
45375
|
-
...opts.integrationId !== void 0 ? { integrationId: opts.integrationId } : {}
|
|
45376
|
-
};
|
|
45377
|
-
await this.#startManager(entry);
|
|
45378
|
-
if (opts.integrationId !== void 0) this.#integrationToBroker.set(opts.integrationId, id);
|
|
45379
|
-
return entry;
|
|
45380
|
-
}
|
|
45381
|
-
async removeEntry(id) {
|
|
45382
|
-
const mgr = this.#managers.get(id);
|
|
45383
|
-
if (!mgr) throw new Error(`EcowittBrokerRegistry: unknown broker id "${id}"`);
|
|
45384
|
-
for (const [integrationId, brokerId] of this.#integrationToBroker.entries()) if (brokerId === id) this.#integrationToBroker.delete(integrationId);
|
|
45385
|
-
this.#managers.delete(id);
|
|
45386
|
-
ecowittFacades.set(id, null);
|
|
45387
|
-
try {
|
|
45388
|
-
await mgr.stop();
|
|
45389
|
-
} catch (err) {
|
|
45390
|
-
this.#logger.warn("EcowittBrokerRegistry: removeEntry stop failed", {
|
|
45391
|
-
tags: { brokerId: id },
|
|
45392
|
-
meta: { error: errMsg(err) }
|
|
45393
|
-
});
|
|
45734
|
+
/** Subscribe a child to per-gateway snapshot ticks. Returns an unsubscribe fn. */
|
|
45735
|
+
onSnapshot(gatewayId, cb) {
|
|
45736
|
+
let set = this.#snapshotSubs.get(gatewayId);
|
|
45737
|
+
if (!set) {
|
|
45738
|
+
set = /* @__PURE__ */ new Set();
|
|
45739
|
+
this.#snapshotSubs.set(gatewayId, set);
|
|
45394
45740
|
}
|
|
45395
|
-
|
|
45396
|
-
|
|
45397
|
-
|
|
45398
|
-
|
|
45399
|
-
|
|
45400
|
-
return {
|
|
45401
|
-
id,
|
|
45402
|
-
name: mgr.getInfo().name,
|
|
45403
|
-
connection
|
|
45741
|
+
set.add(cb);
|
|
45742
|
+
return () => {
|
|
45743
|
+
const current = this.#snapshotSubs.get(gatewayId);
|
|
45744
|
+
current?.delete(cb);
|
|
45745
|
+
if (current && current.size === 0) this.#snapshotSubs.delete(gatewayId);
|
|
45404
45746
|
};
|
|
45405
45747
|
}
|
|
45406
|
-
|
|
45407
|
-
|
|
45408
|
-
|
|
45409
|
-
|
|
45410
|
-
const
|
|
45411
|
-
|
|
45412
|
-
|
|
45413
|
-
}
|
|
45414
|
-
list() {
|
|
45415
|
-
return Array.from(this.#managers.values()).map((m) => m.getInfo());
|
|
45416
|
-
}
|
|
45417
|
-
get(id) {
|
|
45418
|
-
return this.#managers.get(id)?.getInfo() ?? null;
|
|
45419
|
-
}
|
|
45420
|
-
getConnection(id) {
|
|
45421
|
-
return this.#managers.get(id)?.getConnection() ?? null;
|
|
45422
|
-
}
|
|
45423
|
-
size() {
|
|
45424
|
-
return this.#managers.size;
|
|
45748
|
+
/** Fan a single facade snapshot out to every subscribed child for a gateway. */
|
|
45749
|
+
emitSnapshot(gatewayId) {
|
|
45750
|
+
const set = this.#snapshotSubs.get(gatewayId);
|
|
45751
|
+
if (!set) return;
|
|
45752
|
+
for (const cb of set) try {
|
|
45753
|
+
cb();
|
|
45754
|
+
} catch {}
|
|
45425
45755
|
}
|
|
45426
|
-
|
|
45427
|
-
|
|
45428
|
-
|
|
45429
|
-
return count;
|
|
45756
|
+
/** The live client for a gateway id, or null when unknown / stopped. */
|
|
45757
|
+
get(gatewayId) {
|
|
45758
|
+
return this.#facades.get(gatewayId) ?? null;
|
|
45430
45759
|
}
|
|
45431
|
-
|
|
45432
|
-
|
|
45433
|
-
|
|
45434
|
-
return;
|
|
45435
|
-
}
|
|
45436
|
-
const mgr = this.#makeManager({
|
|
45437
|
-
id: entry.id,
|
|
45438
|
-
name: entry.name,
|
|
45439
|
-
connection: entry.connection,
|
|
45440
|
-
logger: this.#logger,
|
|
45441
|
-
onConnected: (id) => this.#onBrokerConnected(id),
|
|
45442
|
-
onDisconnected: (id) => this.#onBrokerDisconnected(id),
|
|
45443
|
-
onSensorsChanged: (id, sensors) => this.#onSensorsChanged(id, sensors)
|
|
45444
|
-
});
|
|
45445
|
-
this.#managers.set(entry.id, mgr);
|
|
45446
|
-
if (entry.integrationId !== void 0) this.#integrationToBroker.set(entry.integrationId, entry.id);
|
|
45447
|
-
await mgr.start();
|
|
45760
|
+
/** All current sensors for a gateway, or [] when unknown. */
|
|
45761
|
+
getSensors(gatewayId) {
|
|
45762
|
+
return this.#facades.get(gatewayId)?.getSensors() ?? [];
|
|
45448
45763
|
}
|
|
45449
|
-
|
|
45450
|
-
|
|
45451
|
-
this
|
|
45452
|
-
return id;
|
|
45764
|
+
/** Resolve a single sensor by its stable id for a gateway, or null. */
|
|
45765
|
+
getSensor(gatewayId, sensorId) {
|
|
45766
|
+
return this.getSensors(gatewayId).find((s) => s.id === sensorId) ?? null;
|
|
45453
45767
|
}
|
|
45454
|
-
|
|
45455
|
-
|
|
45456
|
-
|
|
45457
|
-
|
|
45458
|
-
if (!isNaN(n)) this.#nextId = Math.max(this.#nextId, n + 1);
|
|
45768
|
+
/** Remove all registered clients (called on full shutdown). */
|
|
45769
|
+
clear() {
|
|
45770
|
+
this.#facades.clear();
|
|
45771
|
+
this.#snapshotSubs.clear();
|
|
45459
45772
|
}
|
|
45460
45773
|
};
|
|
45461
|
-
|
|
45462
|
-
|
|
45463
|
-
|
|
45464
|
-
* Operator-supplied Ecowitt gateway settings for ONE broker (= one station).
|
|
45465
|
-
* Two transports behind a `transport` discriminator:
|
|
45466
|
-
*
|
|
45467
|
-
* - `local` (local-poll): the addon polls the gateway over HTTP (`host`/`port`/
|
|
45468
|
-
* optional `password`, with poll + mapping intervals).
|
|
45469
|
-
* - `listener` (push): the addon runs an HTTP server the gateway uploads to
|
|
45470
|
-
* (the gateway's "Customized" upload must point at the hub's LAN IP:port).
|
|
45471
|
-
*
|
|
45472
|
-
* Local-poll is the recommended default — it has no inbound-IP constraint.
|
|
45473
|
-
*/
|
|
45474
|
-
var baseFields = {
|
|
45475
|
-
/** Human-overridable station identity used to scope the adopted gateway. */
|
|
45476
|
-
stationId: string().default("").describe("Optional stable station id (auto-derived when blank)") };
|
|
45477
|
-
var ecowittConfigSchema = discriminatedUnion("transport", [object({
|
|
45478
|
-
transport: literal("local"),
|
|
45479
|
-
host: string().min(1).describe("Ecowitt gateway host name or IP address"),
|
|
45480
|
-
port: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1).max(65535).default(80)).describe("Gateway HTTP port"),
|
|
45481
|
-
password: string().default("").describe("Gateway password (optional — newer firmware)"),
|
|
45482
|
-
pollIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1e3).max(36e5).default(6e4)).describe("Live-data poll interval (ms)"),
|
|
45483
|
-
mappingIntervalMs: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1e4).max(864e5).default(6e5)).describe("Sensor-map refresh interval (ms)"),
|
|
45484
|
-
...baseFields
|
|
45485
|
-
}), object({
|
|
45486
|
-
transport: literal("listener"),
|
|
45487
|
-
listenPort: preprocess((v) => v === "" || v === null ? void 0 : v, number().int().min(1).max(65535).default(4199)).describe("Local TCP port the gateway uploads to"),
|
|
45488
|
-
listenHost: string().default("").describe("Optional bind host (blank = all interfaces)"),
|
|
45489
|
-
...baseFields
|
|
45490
|
-
})]);
|
|
45491
|
-
/** Top-level addon config — an ordered list of broker entries (default empty). */
|
|
45492
|
-
var ecowittAddonConfigSchema = object({ brokers: array(object({
|
|
45493
|
-
id: string().min(1),
|
|
45494
|
-
name: string().min(1),
|
|
45495
|
-
connection: ecowittConfigSchema,
|
|
45496
|
-
integrationId: string().optional()
|
|
45497
|
-
})).default([]) });
|
|
45498
|
-
/**
|
|
45499
|
-
* Narrow an `unknown` value to a shallow-cloned plain object record, or an empty
|
|
45500
|
-
* record when it is not a plain object. Mirrors the Homematic `toRecord` helper —
|
|
45501
|
-
* a cast-free boundary narrowing.
|
|
45502
|
-
*/
|
|
45503
|
-
function toRecord(value) {
|
|
45504
|
-
if (typeof value === "object" && value !== null && !Array.isArray(value)) return Object.fromEntries(Object.entries(value));
|
|
45505
|
-
return {};
|
|
45506
|
-
}
|
|
45507
|
-
/** Coerce a loose settings blob through the connection schema, applying defaults.
|
|
45508
|
-
* A blob with no `transport` defaults to `local` for back-compat with simple forms. */
|
|
45509
|
-
function settingsToEcowittConfig(settings) {
|
|
45510
|
-
const raw = toRecord(settings);
|
|
45511
|
-
if (raw["transport"] !== "local" && raw["transport"] !== "listener") raw["transport"] = "local";
|
|
45512
|
-
return ecowittConfigSchema.parse(raw);
|
|
45513
|
-
}
|
|
45514
|
-
/** Hand-written connection form for the broker/integration creation UI. */
|
|
45515
|
-
function buildConnectionFormSchema() {
|
|
45516
|
-
return { sections: [
|
|
45517
|
-
{
|
|
45518
|
-
id: "transport",
|
|
45519
|
-
title: "Transport",
|
|
45520
|
-
description: "Choose how CamStack reads the gateway. Local poll connects out to the gateway (recommended). Push listener runs a server the gateway uploads to — configure the gateway \"Customized\" upload to point at this hub.",
|
|
45521
|
-
columns: 1,
|
|
45522
|
-
fields: [{
|
|
45523
|
-
type: "select",
|
|
45524
|
-
key: "transport",
|
|
45525
|
-
label: "Transport",
|
|
45526
|
-
default: "local",
|
|
45527
|
-
options: [{
|
|
45528
|
-
value: "local",
|
|
45529
|
-
label: "Local poll (recommended)"
|
|
45530
|
-
}, {
|
|
45531
|
-
value: "listener",
|
|
45532
|
-
label: "Push listener"
|
|
45533
|
-
}]
|
|
45534
|
-
}]
|
|
45535
|
-
},
|
|
45536
|
-
{
|
|
45537
|
-
id: "local",
|
|
45538
|
-
title: "Local poll settings",
|
|
45539
|
-
columns: 2,
|
|
45540
|
-
fields: [
|
|
45541
|
-
{
|
|
45542
|
-
type: "text",
|
|
45543
|
-
key: "host",
|
|
45544
|
-
label: "Gateway host / IP",
|
|
45545
|
-
placeholder: "192.168.1.50",
|
|
45546
|
-
showWhen: {
|
|
45547
|
-
field: "transport",
|
|
45548
|
-
equals: "local"
|
|
45549
|
-
}
|
|
45550
|
-
},
|
|
45551
|
-
{
|
|
45552
|
-
type: "number",
|
|
45553
|
-
key: "port",
|
|
45554
|
-
label: "HTTP port",
|
|
45555
|
-
min: 1,
|
|
45556
|
-
max: 65535,
|
|
45557
|
-
default: 80,
|
|
45558
|
-
showWhen: {
|
|
45559
|
-
field: "transport",
|
|
45560
|
-
equals: "local"
|
|
45561
|
-
}
|
|
45562
|
-
},
|
|
45563
|
-
{
|
|
45564
|
-
type: "password",
|
|
45565
|
-
key: "password",
|
|
45566
|
-
label: "Password (optional)",
|
|
45567
|
-
showToggle: true,
|
|
45568
|
-
showWhen: {
|
|
45569
|
-
field: "transport",
|
|
45570
|
-
equals: "local"
|
|
45571
|
-
}
|
|
45572
|
-
},
|
|
45573
|
-
{
|
|
45574
|
-
type: "number",
|
|
45575
|
-
key: "pollIntervalMs",
|
|
45576
|
-
label: "Poll interval (ms)",
|
|
45577
|
-
min: 1e3,
|
|
45578
|
-
max: 36e5,
|
|
45579
|
-
default: 6e4,
|
|
45580
|
-
showWhen: {
|
|
45581
|
-
field: "transport",
|
|
45582
|
-
equals: "local"
|
|
45583
|
-
}
|
|
45584
|
-
}
|
|
45585
|
-
]
|
|
45586
|
-
},
|
|
45587
|
-
{
|
|
45588
|
-
id: "listener",
|
|
45589
|
-
title: "Push listener settings",
|
|
45590
|
-
columns: 2,
|
|
45591
|
-
fields: [{
|
|
45592
|
-
type: "number",
|
|
45593
|
-
key: "listenPort",
|
|
45594
|
-
label: "Listen port",
|
|
45595
|
-
min: 1,
|
|
45596
|
-
max: 65535,
|
|
45597
|
-
default: 4199,
|
|
45598
|
-
showWhen: {
|
|
45599
|
-
field: "transport",
|
|
45600
|
-
equals: "listener"
|
|
45601
|
-
}
|
|
45602
|
-
}, {
|
|
45603
|
-
type: "text",
|
|
45604
|
-
key: "listenHost",
|
|
45605
|
-
label: "Bind host (optional)",
|
|
45606
|
-
placeholder: "all interfaces",
|
|
45607
|
-
showWhen: {
|
|
45608
|
-
field: "transport",
|
|
45609
|
-
equals: "listener"
|
|
45610
|
-
}
|
|
45611
|
-
}]
|
|
45612
|
-
}
|
|
45613
|
-
] };
|
|
45614
|
-
}
|
|
45615
|
-
//#endregion
|
|
45616
|
-
//#region src/ecowitt-broker-provider.ts
|
|
45617
|
-
var ECOWITT_KIND = "ecowitt";
|
|
45618
|
-
/**
|
|
45619
|
-
* Construct the `broker` cap provider for the Ecowitt addon. Pure builder.
|
|
45620
|
-
* Mirrors `buildDreameBrokerProvider`. The connection has no single secret to
|
|
45621
|
-
* redact (the optional local password is the only one) — preserved on empty
|
|
45622
|
-
* round-trip like the other providers.
|
|
45623
|
-
*/
|
|
45624
|
-
function buildEcowittBrokerProvider(deps) {
|
|
45625
|
-
const { ownerAddonId, registry, getBrokers, persistBrokers, cascadeRemoveDevices, logger } = deps;
|
|
45626
|
-
const owns = (id) => getBrokers().some((b) => b.id === id);
|
|
45627
|
-
/** Redact the local-poll password for an outbound settings read. */
|
|
45628
|
-
const redact = (entry) => {
|
|
45629
|
-
if (entry.connection.transport === "local") return {
|
|
45630
|
-
...entry.connection,
|
|
45631
|
-
password: ""
|
|
45632
|
-
};
|
|
45633
|
-
return { ...entry.connection };
|
|
45634
|
-
};
|
|
45635
|
-
return {
|
|
45636
|
-
list: async ({ kind }) => {
|
|
45637
|
-
if (kind && kind !== ECOWITT_KIND) return [];
|
|
45638
|
-
return registry.list().map((info) => ({
|
|
45639
|
-
...info,
|
|
45640
|
-
addonId: ownerAddonId
|
|
45641
|
-
}));
|
|
45642
|
-
},
|
|
45643
|
-
get: async ({ id }) => {
|
|
45644
|
-
const info = registry.get(id);
|
|
45645
|
-
return info ? {
|
|
45646
|
-
...info,
|
|
45647
|
-
addonId: ownerAddonId
|
|
45648
|
-
} : null;
|
|
45649
|
-
},
|
|
45650
|
-
listProviders: async () => [{
|
|
45651
|
-
addonId: ownerAddonId,
|
|
45652
|
-
kinds: [{
|
|
45653
|
-
kind: ECOWITT_KIND,
|
|
45654
|
-
label: "Ecowitt"
|
|
45655
|
-
}]
|
|
45656
|
-
}],
|
|
45657
|
-
add: async ({ kind, name, settings }) => {
|
|
45658
|
-
if (kind !== ECOWITT_KIND) throw new Error(`provider-ecowitt: only kind '${ECOWITT_KIND}' is handled here (got '${kind}')`);
|
|
45659
|
-
const entry = await registry.createEntry(name, settingsToEcowittConfig(settings));
|
|
45660
|
-
await persistBrokers([...getBrokers(), entry]);
|
|
45661
|
-
return { id: entry.id };
|
|
45662
|
-
},
|
|
45663
|
-
remove: async ({ id }) => {
|
|
45664
|
-
if (!owns(id)) return;
|
|
45665
|
-
await registry.removeEntry(id);
|
|
45666
|
-
await cascadeRemoveDevices(id).catch((err) => {
|
|
45667
|
-
logger.warn("ecowitt: broker cascade-remove threw", {
|
|
45668
|
-
tags: { brokerId: id },
|
|
45669
|
-
meta: { error: errMsg(err) }
|
|
45670
|
-
});
|
|
45671
|
-
});
|
|
45672
|
-
await persistBrokers(getBrokers().filter((b) => b.id !== id));
|
|
45673
|
-
},
|
|
45674
|
-
testConnection: async ({ id }) => {
|
|
45675
|
-
if (!owns(id)) return {
|
|
45676
|
-
ok: false,
|
|
45677
|
-
error: "unknown broker"
|
|
45678
|
-
};
|
|
45679
|
-
const info = registry.get(id);
|
|
45680
|
-
if (!info) return {
|
|
45681
|
-
ok: false,
|
|
45682
|
-
error: "unknown broker"
|
|
45683
|
-
};
|
|
45684
|
-
if (info.status === "connected") return {
|
|
45685
|
-
ok: true,
|
|
45686
|
-
latencyMs: info.lastCheckedAt ? Math.max(0, Date.now() - info.lastCheckedAt) : 0
|
|
45687
|
-
};
|
|
45688
|
-
return {
|
|
45689
|
-
ok: false,
|
|
45690
|
-
error: info.error ?? `status: ${info.status}`
|
|
45691
|
-
};
|
|
45692
|
-
},
|
|
45693
|
-
getSettings: async ({ id }) => {
|
|
45694
|
-
const entry = getBrokers().find((b) => b.id === id);
|
|
45695
|
-
if (!entry) return null;
|
|
45696
|
-
return redact(entry);
|
|
45697
|
-
},
|
|
45698
|
-
setSettings: async ({ id, settings }) => {
|
|
45699
|
-
if (!owns(id)) return;
|
|
45700
|
-
const existing = getBrokers().find((b) => b.id === id);
|
|
45701
|
-
if (!existing) return;
|
|
45702
|
-
const parsed = settingsToEcowittConfig(settings);
|
|
45703
|
-
const merged = parsed.transport === "local" && existing.connection.transport === "local" ? {
|
|
45704
|
-
...parsed,
|
|
45705
|
-
password: parsed.password.length > 0 ? parsed.password : existing.connection.password
|
|
45706
|
-
} : parsed;
|
|
45707
|
-
const updated = await registry.updateEntry(id, merged);
|
|
45708
|
-
await persistBrokers(getBrokers().map((b) => b.id === id ? updated : b));
|
|
45709
|
-
},
|
|
45710
|
-
getBrokerConfig: async ({ id }) => {
|
|
45711
|
-
const entry = getBrokers().find((b) => b.id === id);
|
|
45712
|
-
if (!entry) return null;
|
|
45713
|
-
return redact(entry);
|
|
45714
|
-
},
|
|
45715
|
-
getSettingsSchema: async ({ kind }) => {
|
|
45716
|
-
if (kind !== ECOWITT_KIND) return null;
|
|
45717
|
-
return buildConnectionFormSchema();
|
|
45718
|
-
},
|
|
45719
|
-
testSettings: async ({ kind, settings }) => {
|
|
45720
|
-
if (kind !== ECOWITT_KIND) return {
|
|
45721
|
-
ok: false,
|
|
45722
|
-
error: `unsupported kind: ${kind}`
|
|
45723
|
-
};
|
|
45724
|
-
try {
|
|
45725
|
-
settingsToEcowittConfig(settings);
|
|
45726
|
-
return { ok: true };
|
|
45727
|
-
} catch (err) {
|
|
45728
|
-
return {
|
|
45729
|
-
ok: false,
|
|
45730
|
-
error: errMsg(err)
|
|
45731
|
-
};
|
|
45732
|
-
}
|
|
45733
|
-
},
|
|
45734
|
-
publish: async () => null,
|
|
45735
|
-
subscribe: async () => ({ subscriptionId: "" }),
|
|
45736
|
-
unsubscribe: async () => void 0,
|
|
45737
|
-
getState: async () => null,
|
|
45738
|
-
getStatus: async () => ({
|
|
45739
|
-
brokerCount: registry.size(),
|
|
45740
|
-
connectedCount: registry.connectedCount()
|
|
45741
|
-
})
|
|
45742
|
-
};
|
|
45743
|
-
}
|
|
45774
|
+
/** The single in-process per-gateway client resolver shared between the gateway
|
|
45775
|
+
* device and its container / sensor children. */
|
|
45776
|
+
var ecowittFacades = new EcowittFacadeResolver();
|
|
45744
45777
|
//#endregion
|
|
45745
45778
|
//#region src/ecowitt-mapping.ts
|
|
45746
45779
|
/**
|
|
@@ -45902,18 +45935,64 @@ var QUANTITY_LABEL = {
|
|
|
45902
45935
|
lightning_count: "Lightning count",
|
|
45903
45936
|
vpd: "VPD"
|
|
45904
45937
|
};
|
|
45938
|
+
/** All device groups, in stable presentation order. */
|
|
45939
|
+
var ECOWITT_DEVICE_GROUPS = [
|
|
45940
|
+
"gateway",
|
|
45941
|
+
"weather-station",
|
|
45942
|
+
"temp-sensor-ch1"
|
|
45943
|
+
];
|
|
45944
|
+
/** Human label for a device group (used as the per-group Container name suffix). */
|
|
45945
|
+
function deviceGroupLabel(group) {
|
|
45946
|
+
switch (group) {
|
|
45947
|
+
case "gateway": return "Gateway";
|
|
45948
|
+
case "weather-station": return "Weather Station";
|
|
45949
|
+
case "temp-sensor-ch1": return "Temp Sensor CH1";
|
|
45950
|
+
}
|
|
45951
|
+
}
|
|
45952
|
+
/**
|
|
45953
|
+
* Map a sensor's self-describing nodewitt {@link SensorCategory} (+ its channel)
|
|
45954
|
+
* to the camstack {@link EcowittDeviceGroup} it belongs to. Pure, total.
|
|
45955
|
+
*
|
|
45956
|
+
* The split:
|
|
45957
|
+
* - `weather-station` → `'weather-station'`.
|
|
45958
|
+
* - `channel-sensor` with channel 1 → `'temp-sensor-ch1'` (the CH1 split-out).
|
|
45959
|
+
* - everything else → `'gateway'`.
|
|
45960
|
+
*
|
|
45961
|
+
* CH2..8 grouping (documented decision): channel-sensors on channels 2–8 are
|
|
45962
|
+
* deliberately grouped under `'gateway'`, NOT given their own group. The group
|
|
45963
|
+
* enum is intentionally a fixed THREE (the product wants exactly gateway /
|
|
45964
|
+
* weather-station / CH1-temp surfaces); the gateway device is the natural home
|
|
45965
|
+
* for "everything else" — it already owns the console's indoor readings and the
|
|
45966
|
+
* standalone external sensors. A per-channel device explosion (CH2…CH8 each their
|
|
45967
|
+
* own device) is out of scope here and can be layered on later by widening the
|
|
45968
|
+
* enum, without changing this function's `weather-station`/`temp-sensor-ch1`
|
|
45969
|
+
* branches. `external` (lightning/rain/combo) and `gateway` (console/indoor)
|
|
45970
|
+
* categories also fall here, by design.
|
|
45971
|
+
*
|
|
45972
|
+
* Accepts an optional `category` (a persisted/older sensor may lack one): an
|
|
45973
|
+
* absent category resolves to `'gateway'`, the same safe default nodewitt uses
|
|
45974
|
+
* for an unattributed reading.
|
|
45975
|
+
*/
|
|
45976
|
+
function deviceGroupForSensor(category, channel) {
|
|
45977
|
+
if (category === "weather-station") return "weather-station";
|
|
45978
|
+
if (category === "channel-sensor" && channel === 1) return "temp-sensor-ch1";
|
|
45979
|
+
return "gateway";
|
|
45980
|
+
}
|
|
45905
45981
|
//#endregion
|
|
45906
45982
|
//#region src/ecowitt-discovery.ts
|
|
45907
45983
|
/**
|
|
45908
|
-
*
|
|
45909
|
-
*
|
|
45910
|
-
*
|
|
45911
|
-
*
|
|
45912
|
-
*
|
|
45913
|
-
* cap is intentionally NOT used (a raw station has no sky-state `condition`).
|
|
45984
|
+
* The native id a group Container candidate is keyed on: `<gatewayId>:<group>`.
|
|
45985
|
+
* `gatewayId` is the gateway Hub's stableId, which ALREADY carries the `ecowitt:`
|
|
45986
|
+
* prefix (see `addon.ts` generateStableId) — so this must NOT re-add it, else the
|
|
45987
|
+
* id double-prefixes to `ecowitt:ecowitt:<gw>:<group>`. One physical gateway
|
|
45988
|
+
* yields THREE candidates (one per {@link EcowittDeviceGroup}).
|
|
45914
45989
|
*/
|
|
45915
|
-
function
|
|
45916
|
-
|
|
45990
|
+
function groupNativeId(gatewayId, group) {
|
|
45991
|
+
return `${gatewayId}:${group}`;
|
|
45992
|
+
}
|
|
45993
|
+
/** A preview accessory child for one sensor. */
|
|
45994
|
+
function sensorChild(sensor) {
|
|
45995
|
+
return {
|
|
45917
45996
|
childNativeId: sensor.id,
|
|
45918
45997
|
name: sensorLabel(sensor.quantity, sensor.channel, sensor.name, sensor.id),
|
|
45919
45998
|
type: DeviceType.Sensor,
|
|
@@ -45922,215 +46001,61 @@ function buildEcowittGatewayCandidate(input) {
|
|
|
45922
46001
|
alreadyAdopted: false,
|
|
45923
46002
|
adoptedDeviceId: null,
|
|
45924
46003
|
capabilities: [capForQuantity(sensor.quantity)]
|
|
45925
|
-
}));
|
|
45926
|
-
return {
|
|
45927
|
-
childNativeId: input.brokerId,
|
|
45928
|
-
name: input.gatewayName,
|
|
45929
|
-
type: DeviceType.Container,
|
|
45930
|
-
status: "online",
|
|
45931
|
-
metadata: { serialNumber: input.brokerId },
|
|
45932
|
-
alreadyAdopted: input.adoptedDeviceId !== null,
|
|
45933
|
-
adoptedDeviceId: input.adoptedDeviceId,
|
|
45934
|
-
capabilities: [],
|
|
45935
|
-
children
|
|
45936
|
-
};
|
|
45937
|
-
}
|
|
45938
|
-
//#endregion
|
|
45939
|
-
//#region src/ecowitt-adoption-provider.ts
|
|
45940
|
-
/** Single granularity: the whole gateway adopts as one Container. */
|
|
45941
|
-
var DEVICES_FILTER = {
|
|
45942
|
-
id: "devices",
|
|
45943
|
-
label: "Devices",
|
|
45944
|
-
isDefault: true
|
|
45945
|
-
};
|
|
45946
|
-
/** Resolve the adopted gateway CamStack device id for a broker, or null. */
|
|
45947
|
-
async function adoptedGatewayId(brokerId, listAdoptedEcowitt) {
|
|
45948
|
-
const all = await listAdoptedEcowitt();
|
|
45949
|
-
for (const d of all) if (d.config["system"] === "ecowitt" && d.config["brokerId"] === brokerId) return d.id;
|
|
45950
|
-
return null;
|
|
45951
|
-
}
|
|
45952
|
-
/**
|
|
45953
|
-
* Construct the `device-adoption` cap provider for the Ecowitt addon. Pure
|
|
45954
|
-
* builder. One broker = one gateway = one Container candidate; its sensors are
|
|
45955
|
-
* preview accessory children that the Container's `getAccessoryChildren()`
|
|
45956
|
-
* materialises live on adoption. Mirrors the Dreame adoption provider.
|
|
45957
|
-
*/
|
|
45958
|
-
function buildEcowittAdoptionProvider(deps) {
|
|
45959
|
-
const { registry, getBrokerIdForIntegration, listAdoptedEcowitt, adoptGateway, removeDevice, findDeviceConfig, logger } = deps;
|
|
45960
|
-
async function gatewayCandidateForBroker(brokerId) {
|
|
45961
|
-
const facade = registry.getFacadeForBroker(brokerId);
|
|
45962
|
-
if (facade === null) return null;
|
|
45963
|
-
const info = registry.list().find((b) => b.id === brokerId);
|
|
45964
|
-
const adoptedDeviceId = await adoptedGatewayId(brokerId, listAdoptedEcowitt);
|
|
45965
|
-
return buildEcowittGatewayCandidate({
|
|
45966
|
-
brokerId,
|
|
45967
|
-
gatewayName: info?.name ?? "Ecowitt gateway",
|
|
45968
|
-
sensors: facade.getSensors(),
|
|
45969
|
-
adoptedDeviceId
|
|
45970
|
-
});
|
|
45971
|
-
}
|
|
45972
|
-
return {
|
|
45973
|
-
listCandidateFilters: async () => ({ filters: [DEVICES_FILTER] }),
|
|
45974
|
-
listCandidates: async ({ integrationId, page, pageSize }) => {
|
|
45975
|
-
const candidate = await gatewayCandidateForBroker(await getBrokerIdForIntegration(integrationId));
|
|
45976
|
-
const candidates = candidate !== null ? [candidate] : [];
|
|
45977
|
-
return {
|
|
45978
|
-
candidates,
|
|
45979
|
-
totalCount: candidates.length,
|
|
45980
|
-
page,
|
|
45981
|
-
pageSize
|
|
45982
|
-
};
|
|
45983
|
-
},
|
|
45984
|
-
getCandidate: async ({ integrationId, childNativeId }) => {
|
|
45985
|
-
const candidate = await gatewayCandidateForBroker(await getBrokerIdForIntegration(integrationId));
|
|
45986
|
-
return candidate !== null && candidate.childNativeId === childNativeId ? candidate : null;
|
|
45987
|
-
},
|
|
45988
|
-
getStatus: async () => {
|
|
45989
|
-
try {
|
|
45990
|
-
const brokers = registry.list();
|
|
45991
|
-
let candidateCount = 0;
|
|
45992
|
-
for (const broker of brokers) if (await gatewayCandidateForBroker(broker.id) !== null) candidateCount += 1;
|
|
45993
|
-
const adoptedCount = (await listAdoptedEcowitt()).filter((d) => d.config["system"] === "ecowitt").length;
|
|
45994
|
-
return {
|
|
45995
|
-
lastDiscoveryAt: Date.now(),
|
|
45996
|
-
candidateCount,
|
|
45997
|
-
adoptedCount,
|
|
45998
|
-
lastError: null
|
|
45999
|
-
};
|
|
46000
|
-
} catch (err) {
|
|
46001
|
-
logger.warn("ecowitt adoption: getStatus failed", { meta: { error: errMsg(err) } });
|
|
46002
|
-
return {
|
|
46003
|
-
lastDiscoveryAt: null,
|
|
46004
|
-
candidateCount: 0,
|
|
46005
|
-
adoptedCount: 0,
|
|
46006
|
-
lastError: errMsg(err)
|
|
46007
|
-
};
|
|
46008
|
-
}
|
|
46009
|
-
},
|
|
46010
|
-
refresh: async ({ integrationId }) => {
|
|
46011
|
-
const brokerId = await getBrokerIdForIntegration(integrationId);
|
|
46012
|
-
const candidate = await gatewayCandidateForBroker(brokerId);
|
|
46013
|
-
const adoptedCount = (await listAdoptedEcowitt()).filter((d) => d.config["system"] === "ecowitt" && d.config["brokerId"] === brokerId).length;
|
|
46014
|
-
return {
|
|
46015
|
-
lastDiscoveryAt: Date.now(),
|
|
46016
|
-
candidateCount: candidate !== null ? 1 : 0,
|
|
46017
|
-
adoptedCount,
|
|
46018
|
-
lastError: null
|
|
46019
|
-
};
|
|
46020
|
-
},
|
|
46021
|
-
adopt: async ({ integrationId, childNativeIds, perCandidate }) => {
|
|
46022
|
-
const brokerId = await getBrokerIdForIntegration(integrationId);
|
|
46023
|
-
if (registry.getFacadeForBroker(brokerId) === null) throw new Error(`ecowitt adopt: broker ${brokerId} not connected`);
|
|
46024
|
-
const adopted = [];
|
|
46025
|
-
let failures = 0;
|
|
46026
|
-
const info = registry.list().find((b) => b.id === brokerId);
|
|
46027
|
-
for (const nativeId of childNativeIds) {
|
|
46028
|
-
if (nativeId !== brokerId) {
|
|
46029
|
-
logger.warn("ecowitt adopt: only the gateway candidate is adoptable — skipping", { meta: {
|
|
46030
|
-
nativeId,
|
|
46031
|
-
brokerId
|
|
46032
|
-
} });
|
|
46033
|
-
failures++;
|
|
46034
|
-
continue;
|
|
46035
|
-
}
|
|
46036
|
-
try {
|
|
46037
|
-
const { deviceId, accessoryDeviceIds } = await adoptGateway({
|
|
46038
|
-
brokerId,
|
|
46039
|
-
integrationId,
|
|
46040
|
-
name: perCandidate?.[nativeId]?.name ?? info?.name ?? "Ecowitt gateway"
|
|
46041
|
-
});
|
|
46042
|
-
adopted.push({
|
|
46043
|
-
childNativeId: nativeId,
|
|
46044
|
-
parentDeviceId: deviceId,
|
|
46045
|
-
accessoryDeviceIds
|
|
46046
|
-
});
|
|
46047
|
-
} catch (err) {
|
|
46048
|
-
logger.warn("ecowitt adopt: failed to adopt gateway", { meta: {
|
|
46049
|
-
brokerId,
|
|
46050
|
-
error: errMsg(err)
|
|
46051
|
-
} });
|
|
46052
|
-
failures++;
|
|
46053
|
-
}
|
|
46054
|
-
}
|
|
46055
|
-
if (adopted.length === 0 && failures > 0) throw new Error(`ecowitt adopt: all ${failures} adopt(s) failed`);
|
|
46056
|
-
return { adopted };
|
|
46057
|
-
},
|
|
46058
|
-
release: async ({ camDeviceId }) => {
|
|
46059
|
-
await removeDevice(camDeviceId);
|
|
46060
|
-
},
|
|
46061
|
-
resync: async ({ camDeviceId }) => {
|
|
46062
|
-
const cfg = await findDeviceConfig(camDeviceId);
|
|
46063
|
-
if (cfg === null) throw new Error(`ecowitt resync: device ${camDeviceId} not found`);
|
|
46064
|
-
if (cfg["system"] !== "ecowitt") throw new Error(`ecowitt resync: device ${camDeviceId} is not an Ecowitt device`);
|
|
46065
|
-
const brokerId = String(cfg["brokerId"]);
|
|
46066
|
-
if (!(registry.getFacadeForBroker(brokerId) !== null)) throw new Error(`ecowitt resync: broker ${brokerId} no longer connected`);
|
|
46067
|
-
return {
|
|
46068
|
-
changed: false,
|
|
46069
|
-
rebuiltChildren: 0
|
|
46070
|
-
};
|
|
46071
|
-
}
|
|
46072
46004
|
};
|
|
46073
46005
|
}
|
|
46074
|
-
//#endregion
|
|
46075
|
-
//#region src/ecowitt-broker-device-cascade.ts
|
|
46076
|
-
/**
|
|
46077
|
-
* Remove every adopted Ecowitt PARENT device (children cascade via the kernel)
|
|
46078
|
-
* whose persisted config carries `{ system: 'ecowitt', brokerId }`. Used on
|
|
46079
|
-
* broker.remove and integration delete. Best-effort per device; returns the
|
|
46080
|
-
* count removed. Mirrors the Homematic / Dreame cascade helper.
|
|
46081
|
-
*/
|
|
46082
|
-
async function cascadeRemoveDevicesForBroker(input) {
|
|
46083
|
-
const { reg, devices, addonId, brokerId, logger } = input;
|
|
46084
|
-
let removed = 0;
|
|
46085
|
-
for (const d of reg.getAllForAddon(addonId)) {
|
|
46086
|
-
if (d.parentDeviceId !== null) continue;
|
|
46087
|
-
const cfg = await devices.loadConfig(d.id).catch(() => ({}));
|
|
46088
|
-
if (cfg["system"] !== "ecowitt" || cfg["brokerId"] !== brokerId) continue;
|
|
46089
|
-
try {
|
|
46090
|
-
await devices.remove(d.id);
|
|
46091
|
-
removed += 1;
|
|
46092
|
-
} catch (err) {
|
|
46093
|
-
logger.warn("ecowitt: broker cascade-remove failed", {
|
|
46094
|
-
tags: { deviceId: d.id },
|
|
46095
|
-
meta: {
|
|
46096
|
-
brokerId,
|
|
46097
|
-
error: errMsg(err)
|
|
46098
|
-
}
|
|
46099
|
-
});
|
|
46100
|
-
}
|
|
46101
|
-
}
|
|
46102
|
-
return removed;
|
|
46103
|
-
}
|
|
46104
|
-
//#endregion
|
|
46105
|
-
//#region src/ecowitt-broker-offline.ts
|
|
46106
46006
|
/**
|
|
46107
|
-
*
|
|
46108
|
-
*
|
|
46109
|
-
*
|
|
46110
|
-
*
|
|
46007
|
+
* Build the THREE gateway adoption candidates (one {@link DeviceType.Container}
|
|
46008
|
+
* per {@link EcowittDeviceGroup}) for a single physical gateway. Each Container
|
|
46009
|
+
* carries only the sensors whose device group matches, as preview accessory
|
|
46010
|
+
* children that the Container's `getAccessoryChildren()` materialises on
|
|
46011
|
+
* adoption. Pure: no I/O.
|
|
46012
|
+
*
|
|
46013
|
+
* Discovery option (documented decision): we return 3 SEPARATE top-level
|
|
46014
|
+
* Container candidates (not 1 parent with 3 group-tagged children). Each maps 1:1
|
|
46015
|
+
* to a real adopted device, so the existing per-candidate adopt/release/resync
|
|
46016
|
+
* machinery (keyed on `childNativeId`) extends directly — the alternative
|
|
46017
|
+
* (nested group children under one parent) would require a new two-level
|
|
46018
|
+
* adoption shape and is higher-risk. Sensors are split by
|
|
46019
|
+
* {@link deviceGroupForSensor}; an empty group still yields a Container so its
|
|
46020
|
+
* sensors can appear as they come online over time (additive reconcile).
|
|
46021
|
+
*
|
|
46022
|
+
* Per the plan (model A), each sensor maps to a typed sensor cap; the `weather`
|
|
46023
|
+
* cap is intentionally NOT used (a raw station has no sky-state `condition`).
|
|
46111
46024
|
*/
|
|
46112
|
-
function
|
|
46113
|
-
|
|
46114
|
-
for (const
|
|
46115
|
-
|
|
46116
|
-
|
|
46117
|
-
|
|
46118
|
-
|
|
46119
|
-
|
|
46120
|
-
|
|
46121
|
-
|
|
46025
|
+
function buildEcowittGatewayCandidates(input) {
|
|
46026
|
+
const byGroup = /* @__PURE__ */ new Map();
|
|
46027
|
+
for (const group of ECOWITT_DEVICE_GROUPS) byGroup.set(group, []);
|
|
46028
|
+
for (const sensor of input.sensors) {
|
|
46029
|
+
const group = deviceGroupForSensor(sensor.category, sensor.channel);
|
|
46030
|
+
byGroup.get(group)?.push(sensorChild(sensor));
|
|
46031
|
+
}
|
|
46032
|
+
return ECOWITT_DEVICE_GROUPS.map((group) => {
|
|
46033
|
+
const adoptedDeviceId = input.adoptedDeviceIdByGroup[group] ?? null;
|
|
46034
|
+
const children = byGroup.get(group) ?? [];
|
|
46035
|
+
return {
|
|
46036
|
+
childNativeId: groupNativeId(input.gatewayId, group),
|
|
46037
|
+
name: `${input.gatewayName} — ${deviceGroupLabel(group)}`,
|
|
46038
|
+
type: DeviceType.Container,
|
|
46039
|
+
status: "online",
|
|
46040
|
+
metadata: { serialNumber: input.gatewayId },
|
|
46041
|
+
alreadyAdopted: adoptedDeviceId !== null,
|
|
46042
|
+
adoptedDeviceId,
|
|
46043
|
+
capabilities: [],
|
|
46044
|
+
children
|
|
46045
|
+
};
|
|
46046
|
+
});
|
|
46122
46047
|
}
|
|
46123
46048
|
//#endregion
|
|
46124
46049
|
//#region src/devices/ecowitt-sensor-device.ts
|
|
46125
46050
|
/**
|
|
46126
46051
|
* Persisted config every Ecowitt sensor child carries. `sensorId` resolves the
|
|
46127
|
-
* live reading from the
|
|
46128
|
-
* the Ecowitt physical quantity that drives the cap
|
|
46129
|
-
* `system`/`integrationId` are provenance.
|
|
46052
|
+
* live reading from the gateway's client; `gatewayId` selects the gateway (its
|
|
46053
|
+
* Hub stableId); `quantity` is the Ecowitt physical quantity that drives the cap
|
|
46054
|
+
* selection; `system`/`integrationId` are provenance.
|
|
46130
46055
|
*/
|
|
46131
46056
|
var ecowittSensorSchema = object({
|
|
46132
46057
|
sensorId: string().min(1).describe("Ecowitt sensor stable id"),
|
|
46133
|
-
|
|
46058
|
+
gatewayId: string().min(1).describe("Parent gateway Hub stableId"),
|
|
46134
46059
|
quantity: string().min(1).describe("Ecowitt physical quantity"),
|
|
46135
46060
|
system: literal("ecowitt").optional(),
|
|
46136
46061
|
integrationId: string().optional()
|
|
@@ -46174,7 +46099,7 @@ var SUPPORTED_CAPS = new Set([
|
|
|
46174
46099
|
var EcowittSensorDevice = class extends BaseDevice {
|
|
46175
46100
|
features = [];
|
|
46176
46101
|
sensorId;
|
|
46177
|
-
|
|
46102
|
+
gatewayId;
|
|
46178
46103
|
capName;
|
|
46179
46104
|
valueKey;
|
|
46180
46105
|
/**
|
|
@@ -46190,7 +46115,7 @@ var EcowittSensorDevice = class extends BaseDevice {
|
|
|
46190
46115
|
const persisted = ecowittSensorSchema.parse(ctx.persistedConfig ?? {});
|
|
46191
46116
|
super(ctx, ecowittSensorSchema, { type: ctx.deviceMeta.type });
|
|
46192
46117
|
this.sensorId = persisted.sensorId;
|
|
46193
|
-
this.
|
|
46118
|
+
this.gatewayId = persisted.gatewayId;
|
|
46194
46119
|
const cap = capForQuantity(persisted.quantity);
|
|
46195
46120
|
this.capName = SUPPORTED_CAPS.has(cap) ? cap : "numeric-sensor";
|
|
46196
46121
|
this.valueKey = valueFieldForCap(this.capName);
|
|
@@ -46200,11 +46125,8 @@ var EcowittSensorDevice = class extends BaseDevice {
|
|
|
46200
46125
|
system: "ecowitt"
|
|
46201
46126
|
});
|
|
46202
46127
|
}
|
|
46203
|
-
get facade() {
|
|
46204
|
-
return ecowittFacades.get(this.brokerId);
|
|
46205
|
-
}
|
|
46206
46128
|
resolveSensor() {
|
|
46207
|
-
return ecowittFacades.getSensor(this.
|
|
46129
|
+
return ecowittFacades.getSensor(this.gatewayId, this.sensorId);
|
|
46208
46130
|
}
|
|
46209
46131
|
async onActivate() {
|
|
46210
46132
|
await super.onActivate();
|
|
@@ -46221,13 +46143,12 @@ var EcowittSensorDevice = class extends BaseDevice {
|
|
|
46221
46143
|
this.snapshotUnsub = null;
|
|
46222
46144
|
}
|
|
46223
46145
|
}
|
|
46224
|
-
/**
|
|
46146
|
+
/** Subscribe to per-gateway snapshot ticks (recompute this sensor's slice).
|
|
46147
|
+
* Uses the resolver's shared fan-out bus rather than the facade EventEmitter
|
|
46148
|
+
* directly, so N sensors on one gateway never trip Node's MaxListeners cap.
|
|
46149
|
+
* Works even before the facade exists — `recomputeSlice` no-ops on a missing
|
|
46150
|
+
* sensor and replays once the gateway pumps the first snapshot. */
|
|
46225
46151
|
attachSnapshotListener() {
|
|
46226
|
-
const facade = this.facade;
|
|
46227
|
-
if (!facade) {
|
|
46228
|
-
this.ctx.logger.debug("EcowittSensorDevice: facade not present; no live listener yet", { meta: { sensorId: this.sensorId } });
|
|
46229
|
-
return;
|
|
46230
|
-
}
|
|
46231
46152
|
const onSnapshot = () => {
|
|
46232
46153
|
try {
|
|
46233
46154
|
this.recomputeSlice();
|
|
@@ -46238,10 +46159,7 @@ var EcowittSensorDevice = class extends BaseDevice {
|
|
|
46238
46159
|
} });
|
|
46239
46160
|
}
|
|
46240
46161
|
};
|
|
46241
|
-
|
|
46242
|
-
this.snapshotUnsub = () => {
|
|
46243
|
-
facade.off("snapshot", onSnapshot);
|
|
46244
|
-
};
|
|
46162
|
+
this.snapshotUnsub = ecowittFacades.onSnapshot(this.gatewayId, onSnapshot);
|
|
46245
46163
|
}
|
|
46246
46164
|
/** Recompute + write this sensor's typed cap slice (+ battery) from the live reading. */
|
|
46247
46165
|
recomputeSlice() {
|
|
@@ -46391,41 +46309,53 @@ var ecowittSensorEntrySchema = object({
|
|
|
46391
46309
|
sensorId: string(),
|
|
46392
46310
|
quantity: string(),
|
|
46393
46311
|
channel: number().optional(),
|
|
46394
|
-
name: string().optional()
|
|
46312
|
+
name: string().optional(),
|
|
46313
|
+
category: _enum([
|
|
46314
|
+
"gateway",
|
|
46315
|
+
"weather-station",
|
|
46316
|
+
"channel-sensor",
|
|
46317
|
+
"external"
|
|
46318
|
+
]).optional()
|
|
46395
46319
|
});
|
|
46396
46320
|
/**
|
|
46397
|
-
* Persisted config for
|
|
46398
|
-
* gateway
|
|
46399
|
-
*
|
|
46400
|
-
*
|
|
46321
|
+
* Persisted config for one Ecowitt gateway-group Container. `gatewayId` selects
|
|
46322
|
+
* the parent gateway's live nodewitt client (the gateway Hub device's
|
|
46323
|
+
* `stableId`); `sensors[]` is the additively-reconciled list of sensors that fan
|
|
46324
|
+
* out as accessory children (updated by the gateway device via `applyDerivedSpec`
|
|
46325
|
+
* on every `snapshot` push). `system`/`integrationId`/`name` are provenance.
|
|
46401
46326
|
*/
|
|
46402
46327
|
var ecowittContainerSchema = object({
|
|
46403
|
-
|
|
46328
|
+
gatewayId: string().min(1).describe("Parent gateway Hub stableId"),
|
|
46329
|
+
deviceGroup: _enum([
|
|
46330
|
+
"gateway",
|
|
46331
|
+
"weather-station",
|
|
46332
|
+
"temp-sensor-ch1"
|
|
46333
|
+
]).default("gateway"),
|
|
46404
46334
|
sensors: array(ecowittSensorEntrySchema).default([]),
|
|
46405
46335
|
integrationId: string().optional(),
|
|
46406
46336
|
system: literal("ecowitt").optional(),
|
|
46407
46337
|
name: string().optional()
|
|
46408
46338
|
});
|
|
46409
46339
|
/**
|
|
46410
|
-
*
|
|
46411
|
-
* declares `getAccessoryChildren()`
|
|
46412
|
-
* {@link EcowittSensorDevice} per sensor in the
|
|
46413
|
-
* reconciles additions/removals when the
|
|
46414
|
-
* `applyDerivedSpec`. Mirrors `HaContainerDevice` (which
|
|
46415
|
-
* live and is re-derived on reconcile).
|
|
46340
|
+
* One gateway-group Container for an Ecowitt station. A CHILD of the gateway Hub
|
|
46341
|
+
* (standalone mode). Owns no caps itself — it declares `getAccessoryChildren()`
|
|
46342
|
+
* so the kernel auto-spawns one {@link EcowittSensorDevice} per sensor in the
|
|
46343
|
+
* LIVE `sensors[]` config and reconciles additions/removals when the gateway
|
|
46344
|
+
* re-persists the list via `applyDerivedSpec`. Mirrors `HaContainerDevice` (which
|
|
46345
|
+
* reads its `entities[]` live and is re-derived on reconcile).
|
|
46416
46346
|
*/
|
|
46417
46347
|
var EcowittContainerDevice = class extends BaseDevice {
|
|
46418
46348
|
features = [DeviceFeature.Resyncable];
|
|
46419
|
-
|
|
46349
|
+
gatewayId;
|
|
46420
46350
|
integrationId;
|
|
46421
46351
|
constructor(ctx) {
|
|
46422
46352
|
const cfg = ecowittContainerSchema.parse(ctx.persistedConfig ?? {});
|
|
46423
46353
|
super(ctx, ecowittContainerSchema, { type: DeviceType.Container });
|
|
46424
|
-
this.
|
|
46354
|
+
this.gatewayId = cfg.gatewayId;
|
|
46425
46355
|
this.integrationId = cfg.integrationId;
|
|
46426
|
-
this.online = ecowittFacades.get(this.
|
|
46356
|
+
this.online = ecowittFacades.get(this.gatewayId) !== null;
|
|
46427
46357
|
this.updateSourceInfo({
|
|
46428
|
-
id: this.
|
|
46358
|
+
id: this.gatewayId,
|
|
46429
46359
|
system: "ecowitt"
|
|
46430
46360
|
});
|
|
46431
46361
|
}
|
|
@@ -46440,7 +46370,7 @@ var EcowittContainerDevice = class extends BaseDevice {
|
|
|
46440
46370
|
};
|
|
46441
46371
|
const config = {
|
|
46442
46372
|
sensorId: sensor.sensorId,
|
|
46443
|
-
|
|
46373
|
+
gatewayId: this.gatewayId,
|
|
46444
46374
|
quantity: sensor.quantity,
|
|
46445
46375
|
capabilities: [capForQuantity(sensor.quantity)],
|
|
46446
46376
|
system: "ecowitt",
|
|
@@ -46456,328 +46386,290 @@ var EcowittContainerDevice = class extends BaseDevice {
|
|
|
46456
46386
|
}
|
|
46457
46387
|
};
|
|
46458
46388
|
//#endregion
|
|
46459
|
-
//#region src/
|
|
46460
|
-
/** Default multi-broker config — a fresh install starts with no gateways. */
|
|
46461
|
-
var DEFAULTS = { brokers: [] };
|
|
46389
|
+
//#region src/devices/ecowitt-gateway-device.ts
|
|
46462
46390
|
/**
|
|
46463
|
-
* Ecowitt
|
|
46391
|
+
* Ecowitt gateway — a {@link DeviceType.Hub} device (standalone mode, Reolink
|
|
46392
|
+
* pattern). The operator-supplied CONNECTION lives on THIS device's config; the
|
|
46393
|
+
* gateway owns exactly one live `@apocaliss92/nodewitt` client (via an
|
|
46394
|
+
* {@link EcowittIntegrationManager}) keyed on its own `stableId` and published on
|
|
46395
|
+
* the in-process {@link ecowittFacades} resolver so its container + sensor
|
|
46396
|
+
* children read the live snapshot.
|
|
46464
46397
|
*
|
|
46465
|
-
*
|
|
46466
|
-
*
|
|
46467
|
-
*
|
|
46468
|
-
*
|
|
46469
|
-
*
|
|
46470
|
-
*
|
|
46471
|
-
* `applyDerivedSpec`, which spawns new sensor children + removes orphaned ones.
|
|
46398
|
+
* It registers the `device-discovery` cap: `refreshDiscovery`/`listDiscovered`
|
|
46399
|
+
* enumerate the THREE gateway-group Container candidates (gateway /
|
|
46400
|
+
* weather-station / temp-sensor-ch1) that actually have sensors; `adoptDevice`
|
|
46401
|
+
* spawns a group {@link EcowittContainerDevice} child whose sensors materialise
|
|
46402
|
+
* as entity children; `releaseDevice` removes it. On every nodewitt snapshot the
|
|
46403
|
+
* gateway re-derives each adopted group Container's `sensors[]` additively.
|
|
46472
46404
|
*/
|
|
46473
|
-
var
|
|
46474
|
-
|
|
46475
|
-
|
|
46476
|
-
|
|
46477
|
-
|
|
46478
|
-
constructor() {
|
|
46479
|
-
|
|
46405
|
+
var EcowittGatewayDevice = class extends BaseDevice {
|
|
46406
|
+
features = [];
|
|
46407
|
+
manager = null;
|
|
46408
|
+
eventUnsubscribers = [];
|
|
46409
|
+
latestSensors = [];
|
|
46410
|
+
constructor(ctx) {
|
|
46411
|
+
ecowittGatewaySchema.parse(ctx.persistedConfig ?? {});
|
|
46412
|
+
super(ctx, ecowittGatewaySchema, { type: DeviceType.Hub });
|
|
46413
|
+
this.online = false;
|
|
46414
|
+
this.registerDeviceDiscovery();
|
|
46415
|
+
this.updateSourceInfo({
|
|
46416
|
+
id: this.stableId,
|
|
46417
|
+
system: "ecowitt"
|
|
46418
|
+
});
|
|
46480
46419
|
}
|
|
46481
|
-
|
|
46482
|
-
|
|
46483
|
-
|
|
46484
|
-
|
|
46485
|
-
|
|
46486
|
-
|
|
46487
|
-
|
|
46488
|
-
this.registry.setOnBrokerDisconnected((brokerId) => {
|
|
46489
|
-
this.setBrokerDevicesOnline(brokerId, false);
|
|
46490
|
-
});
|
|
46491
|
-
this.registry.setOnSensorsChanged((brokerId, sensors) => {
|
|
46492
|
-
this.reconcileGatewaySensors(brokerId, sensors);
|
|
46493
|
-
});
|
|
46494
|
-
await this.registry.restore(this.config.brokers);
|
|
46495
|
-
this.ctx.logger.info("Ecowitt: provider initialised", { meta: { brokerCount: this.config.brokers.length } });
|
|
46496
|
-
await this.reconcileIntegrationsToBrokers();
|
|
46497
|
-
this.subscribeIntegrationLifecycle();
|
|
46498
|
-
return [
|
|
46499
|
-
...regs,
|
|
46500
|
-
{
|
|
46501
|
-
capability: brokerCapability,
|
|
46502
|
-
provider: this.buildBrokerProvider()
|
|
46503
|
-
},
|
|
46504
|
-
{
|
|
46505
|
-
capability: deviceAdoptionCapability,
|
|
46506
|
-
provider: this.buildAdoptionProvider()
|
|
46507
|
-
}
|
|
46508
|
-
];
|
|
46420
|
+
/** Adopt a pre-built manager (created by `onCreateDevice` so the live client
|
|
46421
|
+
* starts once) — mirrors `ReolinkHub.adoptApi`. Published on the resolver so
|
|
46422
|
+
* children pick it up. */
|
|
46423
|
+
adoptManager(manager) {
|
|
46424
|
+
this.manager = manager;
|
|
46425
|
+
const facade = manager.facade;
|
|
46426
|
+
if (facade !== null) ecowittFacades.set(this.stableId, facade);
|
|
46509
46427
|
}
|
|
46510
|
-
async
|
|
46511
|
-
|
|
46512
|
-
|
|
46513
|
-
|
|
46514
|
-
|
|
46515
|
-
|
|
46516
|
-
|
|
46517
|
-
|
|
46518
|
-
}
|
|
46519
|
-
this.ctx.logger.warn("Ecowitt onConfigChanged: removeEntry failed", { meta: {
|
|
46520
|
-
brokerId: liveId,
|
|
46521
|
-
error: errMsg(err)
|
|
46522
|
-
} });
|
|
46523
|
-
}
|
|
46524
|
-
for (const entry of persisted) {
|
|
46525
|
-
if (entry.id && liveIds.has(entry.id)) {
|
|
46526
|
-
if (sameConnection(entry.connection, reg.getConnection(entry.id))) continue;
|
|
46527
|
-
try {
|
|
46528
|
-
await reg.updateEntry(entry.id, entry.connection);
|
|
46529
|
-
} catch (err) {
|
|
46530
|
-
this.ctx.logger.warn("Ecowitt onConfigChanged: updateEntry failed", { meta: {
|
|
46531
|
-
brokerId: entry.id,
|
|
46532
|
-
error: errMsg(err)
|
|
46533
|
-
} });
|
|
46534
|
-
}
|
|
46535
|
-
continue;
|
|
46536
|
-
}
|
|
46537
|
-
try {
|
|
46538
|
-
const created = await reg.createEntry(entry.name, entry.connection);
|
|
46539
|
-
if (created.id !== entry.id) {
|
|
46540
|
-
const next = persisted.map((b) => b === entry ? {
|
|
46541
|
-
...b,
|
|
46542
|
-
id: created.id
|
|
46543
|
-
} : b);
|
|
46544
|
-
await this.updateGlobalSettings({ brokers: next });
|
|
46545
|
-
}
|
|
46546
|
-
} catch (err) {
|
|
46547
|
-
this.ctx.logger.warn("Ecowitt onConfigChanged: failed to start new broker", { meta: {
|
|
46548
|
-
brokerName: entry.name,
|
|
46549
|
-
error: errMsg(err)
|
|
46550
|
-
} });
|
|
46551
|
-
}
|
|
46552
|
-
}
|
|
46428
|
+
async onActivate() {
|
|
46429
|
+
if (this.manager === null) this.ensureManager().catch((err) => {
|
|
46430
|
+
this.ctx.logger.warn("Ecowitt gateway initial connect failed", { meta: { error: errMsg(err) } });
|
|
46431
|
+
});
|
|
46432
|
+
else this.refreshDiscoveryFromClient().catch(() => {});
|
|
46433
|
+
this.eventUnsubscribers.push(this.ctx.eventBus.subscribe({ category: EventCategory.DeviceUnregistered }, (event) => {
|
|
46434
|
+
if (event.data.parentDeviceId !== this.id) return;
|
|
46435
|
+
this.refreshDiscoveryFromClient().catch(() => {});
|
|
46436
|
+
}));
|
|
46553
46437
|
}
|
|
46554
|
-
async
|
|
46555
|
-
try {
|
|
46556
|
-
|
|
46438
|
+
async removeDevice() {
|
|
46439
|
+
for (const unsub of this.eventUnsubscribers) try {
|
|
46440
|
+
unsub();
|
|
46441
|
+
} catch {}
|
|
46442
|
+
this.eventUnsubscribers.length = 0;
|
|
46443
|
+
const mgr = this.manager;
|
|
46444
|
+
this.manager = null;
|
|
46445
|
+
ecowittFacades.set(this.stableId, null);
|
|
46446
|
+
if (mgr) try {
|
|
46447
|
+
await mgr.stop();
|
|
46557
46448
|
} catch (err) {
|
|
46558
|
-
this.ctx.logger.warn("Ecowitt:
|
|
46449
|
+
this.ctx.logger.warn("Ecowitt gateway: client stop failed", { meta: { error: errMsg(err) } });
|
|
46559
46450
|
}
|
|
46560
|
-
this.registry = null;
|
|
46561
|
-
await super.onShutdown();
|
|
46562
46451
|
}
|
|
46563
|
-
|
|
46564
|
-
|
|
46565
|
-
|
|
46566
|
-
|
|
46567
|
-
|
|
46568
|
-
|
|
46569
|
-
|
|
46570
|
-
|
|
46571
|
-
|
|
46572
|
-
|
|
46573
|
-
*/
|
|
46574
|
-
async reconcileGatewaySensors(brokerId, sensors) {
|
|
46575
|
-
try {
|
|
46576
|
-
const reg = this.ctx.kernel.deviceRegistry;
|
|
46577
|
-
const devices = this.ctx.kernel.devices;
|
|
46578
|
-
if (!reg || !devices) return;
|
|
46579
|
-
let containerId = null;
|
|
46580
|
-
for (const d of reg.getAllForAddon(this.addonId)) {
|
|
46581
|
-
if (d.parentDeviceId !== null) continue;
|
|
46582
|
-
const cfg = await devices.loadConfig(d.id).catch(() => ({}));
|
|
46583
|
-
if (cfg["system"] === "ecowitt" && cfg["brokerId"] === brokerId) {
|
|
46584
|
-
containerId = d.id;
|
|
46585
|
-
break;
|
|
46586
|
-
}
|
|
46587
|
-
}
|
|
46588
|
-
if (containerId === null) return;
|
|
46589
|
-
const nextSensors = sensors.map((s) => ({
|
|
46590
|
-
sensorId: s.id,
|
|
46591
|
-
quantity: s.quantity,
|
|
46592
|
-
...s.channel !== void 0 ? { channel: s.channel } : {},
|
|
46593
|
-
...s.name !== void 0 ? { name: s.name } : {}
|
|
46594
|
-
}));
|
|
46595
|
-
const cfg = await devices.loadConfig(containerId).catch(() => ({}));
|
|
46596
|
-
if (sensorsEqual(Array.isArray(cfg["sensors"]) ? cfg["sensors"] : [], nextSensors)) return;
|
|
46597
|
-
await devices.applyDerivedSpec(containerId, { config: { sensors: nextSensors } });
|
|
46598
|
-
this.ctx.logger.info("Ecowitt: gateway sensors reconciled", { meta: {
|
|
46599
|
-
brokerId,
|
|
46600
|
-
deviceId: containerId,
|
|
46601
|
-
sensorCount: nextSensors.length
|
|
46602
|
-
} });
|
|
46452
|
+
async applySettingsPatch(patch) {
|
|
46453
|
+
if (!("connection" in patch)) return;
|
|
46454
|
+
const parsed = ecowittGatewaySchema.parse({
|
|
46455
|
+
connection: patch["connection"],
|
|
46456
|
+
system: "ecowitt-gateway"
|
|
46457
|
+
});
|
|
46458
|
+
await this.config.setAll({ connection: parsed.connection });
|
|
46459
|
+
const mgr = this.manager;
|
|
46460
|
+
if (mgr) try {
|
|
46461
|
+
await mgr.applyConnection(parsed.connection);
|
|
46603
46462
|
} catch (err) {
|
|
46604
|
-
this.ctx.logger.warn("Ecowitt
|
|
46605
|
-
brokerId,
|
|
46606
|
-
error: errMsg(err)
|
|
46607
|
-
} });
|
|
46463
|
+
this.ctx.logger.warn("Ecowitt gateway: applyConnection failed", { meta: { error: errMsg(err) } });
|
|
46608
46464
|
}
|
|
46609
|
-
|
|
46610
|
-
|
|
46611
|
-
return buildEcowittBrokerProvider({
|
|
46612
|
-
ownerAddonId: this.ctx.id,
|
|
46613
|
-
registry: this.requireRegistry(),
|
|
46614
|
-
getBrokers: () => this.config.brokers,
|
|
46615
|
-
persistBrokers: (brokers) => this.updateGlobalSettings({ brokers: [...brokers] }),
|
|
46616
|
-
cascadeRemoveDevices: (brokerId) => this.cascadeRemoveDevicesForBroker(brokerId),
|
|
46617
|
-
logger: this.ctx.logger
|
|
46465
|
+
else await this.ensureManager().catch((err) => {
|
|
46466
|
+
this.ctx.logger.warn("Ecowitt gateway re-connect after settings change failed", { meta: { error: errMsg(err) } });
|
|
46618
46467
|
});
|
|
46619
46468
|
}
|
|
46620
|
-
|
|
46621
|
-
|
|
46622
|
-
|
|
46623
|
-
|
|
46624
|
-
|
|
46625
|
-
|
|
46626
|
-
|
|
46627
|
-
|
|
46628
|
-
|
|
46629
|
-
|
|
46469
|
+
/** Build + start the per-device nodewitt client (if not already running). */
|
|
46470
|
+
async ensureManager() {
|
|
46471
|
+
if (this.manager !== null) return;
|
|
46472
|
+
const connection = this.config.values.connection;
|
|
46473
|
+
const mgr = new EcowittIntegrationManager({
|
|
46474
|
+
id: this.stableId,
|
|
46475
|
+
name: this.name,
|
|
46476
|
+
connection,
|
|
46477
|
+
logger: this.ctx.logger,
|
|
46478
|
+
onConnected: () => this.setGatewayOnline(true),
|
|
46479
|
+
onDisconnected: () => this.setGatewayOnline(false),
|
|
46480
|
+
onSensorsChanged: (_id, sensors) => this.handleSensorsChanged(sensors),
|
|
46481
|
+
onFacadeBuilt: (_id, facade) => ecowittFacades.set(this.stableId, facade)
|
|
46630
46482
|
});
|
|
46483
|
+
this.manager = mgr;
|
|
46484
|
+
await mgr.start();
|
|
46631
46485
|
}
|
|
46632
|
-
|
|
46633
|
-
|
|
46634
|
-
|
|
46635
|
-
|
|
46636
|
-
|
|
46637
|
-
|
|
46638
|
-
|
|
46639
|
-
|
|
46640
|
-
|
|
46641
|
-
|
|
46642
|
-
|
|
46643
|
-
|
|
46644
|
-
|
|
46645
|
-
|
|
46646
|
-
|
|
46647
|
-
|
|
46648
|
-
|
|
46649
|
-
|
|
46650
|
-
|
|
46651
|
-
|
|
46652
|
-
|
|
46653
|
-
|
|
46654
|
-
|
|
46655
|
-
|
|
46656
|
-
|
|
46657
|
-
|
|
46658
|
-
|
|
46659
|
-
|
|
46660
|
-
|
|
46661
|
-
await this.updateGlobalSettings({ brokers: nextBrokers });
|
|
46662
|
-
} catch (err) {
|
|
46663
|
-
this.ctx.logger.warn("Ecowitt integration→broker reconcile failed", { meta: { error: errMsg(err) } });
|
|
46664
|
-
}
|
|
46665
|
-
}
|
|
46666
|
-
subscribeIntegrationLifecycle() {
|
|
46667
|
-
const handler = (event) => {
|
|
46668
|
-
const addonId = event.data["addonId"];
|
|
46669
|
-
if (typeof addonId === "string" && addonId !== this.ctx.id) return;
|
|
46670
|
-
this.reconcileIntegrationsToBrokers();
|
|
46671
|
-
};
|
|
46672
|
-
this.ctx.eventBus.subscribe({ category: EventCategory.IntegrationEnabled }, handler);
|
|
46673
|
-
this.ctx.eventBus.subscribe({ category: EventCategory.IntegrationDisabled }, handler);
|
|
46674
|
-
this.ctx.eventBus.subscribe({ category: EventCategory.IntegrationDeleted }, handler);
|
|
46675
|
-
}
|
|
46676
|
-
buildAdoptionProvider() {
|
|
46677
|
-
return buildEcowittAdoptionProvider({
|
|
46678
|
-
registry: {
|
|
46679
|
-
getFacadeForBroker: (id) => this.requireRegistry().get(id) !== null ? { getSensors: () => ecowittFacades.getSensors(id) } : null,
|
|
46680
|
-
list: () => this.requireRegistry().list().map((b) => ({
|
|
46681
|
-
id: b.id,
|
|
46682
|
-
name: b.name
|
|
46683
|
-
}))
|
|
46684
|
-
},
|
|
46685
|
-
logger: this.ctx.logger,
|
|
46686
|
-
getBrokerIdForIntegration: async (id) => {
|
|
46687
|
-
const brokerId = (await this.ctx.api.integrations.getSettings.query({ id }))["brokerId"];
|
|
46688
|
-
if (typeof brokerId !== "string") throw new Error(`integration ${id} has no linked brokerId`);
|
|
46689
|
-
return brokerId;
|
|
46486
|
+
setGatewayOnline(online) {
|
|
46487
|
+
if (this.online === online) return;
|
|
46488
|
+
this.markOnline(online);
|
|
46489
|
+
this.ctx.logger.info("Ecowitt gateway " + (online ? "online" : "offline"), { tags: { deviceId: this.id } });
|
|
46490
|
+
this.setContainersOnline(online).catch(() => {});
|
|
46491
|
+
}
|
|
46492
|
+
async setContainersOnline(online) {
|
|
46493
|
+
const children = await this.ctx.devices.getChildren(this.id).catch(() => []);
|
|
46494
|
+
for (const child of children) {
|
|
46495
|
+
if (child.type !== DeviceType.Container) continue;
|
|
46496
|
+
if (child.online === online) continue;
|
|
46497
|
+
child.markOnline(online);
|
|
46498
|
+
}
|
|
46499
|
+
}
|
|
46500
|
+
/** On each snapshot: cache sensors, re-derive discovery, additively reconcile
|
|
46501
|
+
* every adopted group Container's `sensors[]`. */
|
|
46502
|
+
handleSensorsChanged(sensors) {
|
|
46503
|
+
this.latestSensors = sensors;
|
|
46504
|
+
this.refreshDiscoveryFromClient().catch(() => {});
|
|
46505
|
+
this.reconcileGroupSensors(sensors).catch((err) => {
|
|
46506
|
+
this.ctx.logger.warn("Ecowitt gateway: sensor reconcile failed", { meta: { error: errMsg(err) } });
|
|
46507
|
+
});
|
|
46508
|
+
ecowittFacades.emitSnapshot(this.stableId);
|
|
46509
|
+
}
|
|
46510
|
+
registerDeviceDiscovery() {
|
|
46511
|
+
this.ctx.registerNativeCap(deviceDiscoveryCapability, {
|
|
46512
|
+
getStatus: async ({ deviceId }) => {
|
|
46513
|
+
if (deviceId !== this.id) return null;
|
|
46514
|
+
return this.runtimeState.getCapState("device-discovery") ?? null;
|
|
46690
46515
|
},
|
|
46691
|
-
|
|
46692
|
-
|
|
46693
|
-
|
|
46694
|
-
if (!reg || !devices) return [];
|
|
46695
|
-
const out = [];
|
|
46696
|
-
for (const d of reg.getAllForAddon(this.addonId)) {
|
|
46697
|
-
if (d.parentDeviceId !== null) continue;
|
|
46698
|
-
const config = await devices.loadConfig(d.id).catch(() => ({}));
|
|
46699
|
-
out.push({
|
|
46700
|
-
id: d.id,
|
|
46701
|
-
config
|
|
46702
|
-
});
|
|
46703
|
-
}
|
|
46704
|
-
return out;
|
|
46516
|
+
listDiscovered: async ({ deviceId }) => {
|
|
46517
|
+
if (deviceId !== this.id) return [];
|
|
46518
|
+
return this.runtimeState.getCapState("device-discovery")?.discovered ?? [];
|
|
46705
46519
|
},
|
|
46706
|
-
|
|
46707
|
-
|
|
46708
|
-
|
|
46709
|
-
|
|
46710
|
-
brokerId,
|
|
46711
|
-
sensors: ecowittFacades.getSensors(brokerId).map((s) => ({
|
|
46712
|
-
sensorId: s.id,
|
|
46713
|
-
quantity: s.quantity,
|
|
46714
|
-
...s.channel !== void 0 ? { channel: s.channel } : {},
|
|
46715
|
-
...s.name !== void 0 ? { name: s.name } : {}
|
|
46716
|
-
})),
|
|
46717
|
-
system: "ecowitt",
|
|
46718
|
-
integrationId,
|
|
46719
|
-
name
|
|
46720
|
-
};
|
|
46721
|
-
const stableId = this.generateStableId(DeviceType.Container, config);
|
|
46722
|
-
const device = await devices.create(stableId, EcowittContainerDevice, config, null, {
|
|
46723
|
-
type: DeviceType.Container,
|
|
46724
|
-
name,
|
|
46725
|
-
integrationId
|
|
46726
|
-
});
|
|
46727
|
-
const children = await devices.getChildren(device.id);
|
|
46728
|
-
return {
|
|
46729
|
-
deviceId: device.id,
|
|
46730
|
-
accessoryDeviceIds: children.map((c) => c.id)
|
|
46731
|
-
};
|
|
46520
|
+
refreshDiscovery: async ({ deviceId }) => {
|
|
46521
|
+
if (deviceId !== this.id) return [];
|
|
46522
|
+
await this.refreshDiscoveryFromClient();
|
|
46523
|
+
return this.runtimeState.getCapState("device-discovery")?.discovered ?? [];
|
|
46732
46524
|
},
|
|
46733
|
-
|
|
46734
|
-
|
|
46525
|
+
adoptDevice: async ({ deviceId, childNativeId, name }) => {
|
|
46526
|
+
if (deviceId !== this.id) throw new Error(`adoptDevice: deviceId mismatch — got ${deviceId}, expected ${this.id}`);
|
|
46527
|
+
return this.adoptGroupContainer(childNativeId, name);
|
|
46735
46528
|
},
|
|
46736
|
-
|
|
46737
|
-
|
|
46738
|
-
|
|
46739
|
-
return devices.loadConfig(id).catch(() => null);
|
|
46529
|
+
releaseDevice: async ({ deviceId, childDeviceId }) => {
|
|
46530
|
+
if (deviceId !== this.id) return;
|
|
46531
|
+
await this.releaseGroupContainer(childDeviceId);
|
|
46740
46532
|
}
|
|
46741
46533
|
});
|
|
46534
|
+
this.setCapSlice(deviceDiscoveryCapability, {
|
|
46535
|
+
discovered: [],
|
|
46536
|
+
lastDiscoveryAt: null,
|
|
46537
|
+
lastError: null,
|
|
46538
|
+
lastFetchedAt: 0
|
|
46539
|
+
});
|
|
46742
46540
|
}
|
|
46743
|
-
|
|
46744
|
-
|
|
46745
|
-
|
|
46746
|
-
|
|
46747
|
-
|
|
46748
|
-
|
|
46749
|
-
|
|
46750
|
-
|
|
46751
|
-
|
|
46752
|
-
|
|
46753
|
-
|
|
46754
|
-
|
|
46755
|
-
|
|
46756
|
-
|
|
46757
|
-
|
|
46758
|
-
|
|
46759
|
-
|
|
46760
|
-
|
|
46761
|
-
|
|
46541
|
+
/** Enumerate the three gateway-group Container candidates from the live client
|
|
46542
|
+
* snapshot, flag `alreadyAdopted` per group, persist into the slice. */
|
|
46543
|
+
async refreshDiscoveryFromClient() {
|
|
46544
|
+
let lastError = null;
|
|
46545
|
+
let discovered = [];
|
|
46546
|
+
try {
|
|
46547
|
+
const sensors = ecowittFacades.get(this.stableId)?.getSensors() ?? this.latestSensors;
|
|
46548
|
+
const adoptedByGroup = await this.adoptedContainerIdByGroup();
|
|
46549
|
+
discovered = buildEcowittGatewayCandidates({
|
|
46550
|
+
gatewayId: this.stableId,
|
|
46551
|
+
gatewayName: this.name,
|
|
46552
|
+
sensors,
|
|
46553
|
+
adoptedDeviceIdByGroup: adoptedByGroup
|
|
46554
|
+
});
|
|
46555
|
+
} catch (err) {
|
|
46556
|
+
lastError = errMsg(err);
|
|
46557
|
+
this.ctx.logger.warn("Ecowitt gateway discovery refresh failed", { meta: { error: lastError } });
|
|
46558
|
+
}
|
|
46559
|
+
this.runtimeState.setCapState(deviceDiscoveryCapability.name, {
|
|
46560
|
+
discovered,
|
|
46561
|
+
lastDiscoveryAt: Date.now(),
|
|
46562
|
+
lastError,
|
|
46563
|
+
lastFetchedAt: Date.now()
|
|
46564
|
+
});
|
|
46762
46565
|
}
|
|
46763
|
-
|
|
46764
|
-
|
|
46566
|
+
/** Map each device group → the adopted group Container's device id (null when
|
|
46567
|
+
* not adopted), by walking this gateway's direct children. */
|
|
46568
|
+
async adoptedContainerIdByGroup() {
|
|
46569
|
+
const out = {};
|
|
46570
|
+
const children = await this.ctx.devices.getChildren(this.id).catch(() => []);
|
|
46571
|
+
for (const child of children) {
|
|
46572
|
+
if (child.type !== DeviceType.Container) continue;
|
|
46573
|
+
const cfg = await this.ctx.devices.loadConfig(child.id).catch(() => ({}));
|
|
46574
|
+
if (cfg["system"] !== "ecowitt") continue;
|
|
46575
|
+
out[configDeviceGroup(cfg)] = child.id;
|
|
46576
|
+
}
|
|
46577
|
+
return out;
|
|
46765
46578
|
}
|
|
46766
|
-
|
|
46767
|
-
|
|
46768
|
-
|
|
46769
|
-
|
|
46770
|
-
|
|
46771
|
-
|
|
46772
|
-
|
|
46773
|
-
|
|
46579
|
+
/** Promote a discovered group candidate to a real group Container child. */
|
|
46580
|
+
async adoptGroupContainer(childNativeId, nameOverride) {
|
|
46581
|
+
const group = ECOWITT_DEVICE_GROUPS.find((g) => groupNativeId(this.stableId, g) === childNativeId);
|
|
46582
|
+
if (group === void 0) throw new Error(`adoptDevice: ${childNativeId} does not match any gateway group`);
|
|
46583
|
+
const existingId = (await this.adoptedContainerIdByGroup())[group];
|
|
46584
|
+
if (typeof existingId === "number") {
|
|
46585
|
+
const existing = (await this.ctx.devices.getAll()).find((d) => d.id === existingId);
|
|
46586
|
+
if (existing) return {
|
|
46587
|
+
deviceId: existing.id,
|
|
46588
|
+
stableId: existing.stableId
|
|
46589
|
+
};
|
|
46590
|
+
}
|
|
46591
|
+
const sensors = (ecowittFacades.get(this.stableId)?.getSensors() ?? this.latestSensors).filter((s) => deviceGroupForSensor(s.category, s.channel) === group).map(sensorToEntry);
|
|
46592
|
+
const name = nameOverride ?? `${this.name} — ${group}`;
|
|
46593
|
+
const config = {
|
|
46594
|
+
gatewayId: this.stableId,
|
|
46595
|
+
deviceGroup: group,
|
|
46596
|
+
sensors,
|
|
46597
|
+
system: "ecowitt",
|
|
46598
|
+
name
|
|
46599
|
+
};
|
|
46600
|
+
const stableId = `${this.stableId}:${group}`;
|
|
46601
|
+
const created = await this.ctx.devices.create(stableId, EcowittContainerDevice, config, this.id, {
|
|
46602
|
+
type: DeviceType.Container,
|
|
46603
|
+
name
|
|
46604
|
+
});
|
|
46605
|
+
this.ctx.logger.info("Ecowitt gateway: adopted group container", {
|
|
46606
|
+
tags: { deviceId: created.id },
|
|
46607
|
+
meta: {
|
|
46608
|
+
group,
|
|
46609
|
+
stableId,
|
|
46610
|
+
sensorCount: sensors.length
|
|
46611
|
+
}
|
|
46612
|
+
});
|
|
46613
|
+
await this.refreshDiscoveryFromClient().catch(() => {});
|
|
46614
|
+
return {
|
|
46615
|
+
deviceId: created.id,
|
|
46616
|
+
stableId
|
|
46617
|
+
};
|
|
46774
46618
|
}
|
|
46775
|
-
|
|
46776
|
-
|
|
46777
|
-
|
|
46619
|
+
async releaseGroupContainer(childDeviceId) {
|
|
46620
|
+
const child = (await this.ctx.devices.getAll()).find((d) => d.id === childDeviceId);
|
|
46621
|
+
if (!child || child.parentDeviceId !== this.id) throw new Error(`releaseDevice: ${childDeviceId} is not a child of gateway ${this.id}`);
|
|
46622
|
+
await this.ctx.devices.remove(childDeviceId);
|
|
46623
|
+
await this.refreshDiscoveryFromClient().catch(() => {});
|
|
46624
|
+
}
|
|
46625
|
+
/** Re-derive every adopted group Container's `sensors[]` from the live
|
|
46626
|
+
* snapshot (group-filtered) and re-persist via `applyDerivedSpec` when it
|
|
46627
|
+
* changed. Best-effort. */
|
|
46628
|
+
async reconcileGroupSensors(sensors) {
|
|
46629
|
+
const byGroup = bucketSensorsByGroup(sensors);
|
|
46630
|
+
const children = await this.ctx.devices.getChildren(this.id).catch(() => []);
|
|
46631
|
+
for (const child of children) {
|
|
46632
|
+
if (child.type !== DeviceType.Container) continue;
|
|
46633
|
+
const cfg = await this.ctx.devices.loadConfig(child.id).catch(() => ({}));
|
|
46634
|
+
if (cfg["system"] !== "ecowitt") continue;
|
|
46635
|
+
const group = configDeviceGroup(cfg);
|
|
46636
|
+
const nextSensors = byGroup.get(group) ?? [];
|
|
46637
|
+
if (sensorsEqual(Array.isArray(cfg["sensors"]) ? cfg["sensors"] : [], nextSensors)) continue;
|
|
46638
|
+
await this.ctx.devices.applyDerivedSpec(child.id, { config: { sensors: nextSensors } });
|
|
46639
|
+
this.ctx.logger.info("Ecowitt gateway: group sensors reconciled", { meta: {
|
|
46640
|
+
deviceId: child.id,
|
|
46641
|
+
group,
|
|
46642
|
+
sensorCount: nextSensors.length
|
|
46643
|
+
} });
|
|
46644
|
+
}
|
|
46778
46645
|
}
|
|
46779
46646
|
};
|
|
46780
|
-
/**
|
|
46647
|
+
/** Resolve `deviceGroup` from a persisted container config (defaults to 'gateway'). */
|
|
46648
|
+
function configDeviceGroup(config) {
|
|
46649
|
+
const g = config["deviceGroup"];
|
|
46650
|
+
return ECOWITT_DEVICE_GROUPS.find((group) => group === g) ?? "gateway";
|
|
46651
|
+
}
|
|
46652
|
+
/** Build the persisted sensor entry (incl. self-describing category) from a live Sensor. */
|
|
46653
|
+
function sensorToEntry(s) {
|
|
46654
|
+
return {
|
|
46655
|
+
sensorId: s.id,
|
|
46656
|
+
quantity: s.quantity,
|
|
46657
|
+
...s.channel !== void 0 ? { channel: s.channel } : {},
|
|
46658
|
+
...s.name !== void 0 ? { name: s.name } : {},
|
|
46659
|
+
...s.category !== void 0 ? { category: s.category } : {}
|
|
46660
|
+
};
|
|
46661
|
+
}
|
|
46662
|
+
/** Bucket live sensors into their device group. */
|
|
46663
|
+
function bucketSensorsByGroup(sensors) {
|
|
46664
|
+
const byGroup = /* @__PURE__ */ new Map();
|
|
46665
|
+
for (const group of ECOWITT_DEVICE_GROUPS) byGroup.set(group, []);
|
|
46666
|
+
for (const s of sensors) {
|
|
46667
|
+
const group = deviceGroupForSensor(s.category, s.channel);
|
|
46668
|
+
byGroup.get(group)?.push(sensorToEntry(s));
|
|
46669
|
+
}
|
|
46670
|
+
return byGroup;
|
|
46671
|
+
}
|
|
46672
|
+
/** Structural equality of two persisted sensor lists (order-independent by id + name). */
|
|
46781
46673
|
function sensorsEqual(a, b) {
|
|
46782
46674
|
if (a.length !== b.length) return false;
|
|
46783
46675
|
const aById = /* @__PURE__ */ new Map();
|
|
@@ -46795,4 +46687,140 @@ function sensorsEqual(a, b) {
|
|
|
46795
46687
|
return true;
|
|
46796
46688
|
}
|
|
46797
46689
|
//#endregion
|
|
46798
|
-
|
|
46690
|
+
//#region src/addon.ts
|
|
46691
|
+
/**
|
|
46692
|
+
* Ecowitt weather-station device-provider addon — `mode: standalone` (the
|
|
46693
|
+
* Reolink pattern). No broker, no device-adoption cap. A gateway is added as a
|
|
46694
|
+
* DEVICE via the manual-creation form: the CONNECTION (transport / host / port /
|
|
46695
|
+
* password OR listener) lives on the gateway DEVICE config. The created gateway
|
|
46696
|
+
* is a {@link DeviceType.Hub} ({@link EcowittGatewayDevice}) that owns its own
|
|
46697
|
+
* live `@apocaliss92/nodewitt` client and registers `device-discovery` to adopt
|
|
46698
|
+
* its own children: up to THREE group {@link DeviceType.Container} children
|
|
46699
|
+
* (gateway / weather-station / temp-sensor-ch1), each fanning out one typed
|
|
46700
|
+
* sensor child per `Sensor.quantity`.
|
|
46701
|
+
*
|
|
46702
|
+
* `instanceMode: multiple` — many gateways may be added.
|
|
46703
|
+
*/
|
|
46704
|
+
var EcowittProviderAddon = class extends BaseDeviceProvider {
|
|
46705
|
+
addonId = "provider-ecowitt";
|
|
46706
|
+
providerName = "Ecowitt";
|
|
46707
|
+
deviceClasses = {
|
|
46708
|
+
[DeviceType.Hub]: EcowittGatewayDevice,
|
|
46709
|
+
[DeviceType.Container]: EcowittContainerDevice
|
|
46710
|
+
};
|
|
46711
|
+
constructor() {
|
|
46712
|
+
super({});
|
|
46713
|
+
}
|
|
46714
|
+
async supportsDiscovery() {
|
|
46715
|
+
return true;
|
|
46716
|
+
}
|
|
46717
|
+
async getDiscoveryParamsSchema() {
|
|
46718
|
+
return buildDiscoveryParamsFormSchema();
|
|
46719
|
+
}
|
|
46720
|
+
async discoverDevices(input) {
|
|
46721
|
+
const broadcastAddr = typeof input?.params?.["broadcastAddress"] === "string" ? input.params["broadcastAddress"].trim() : "";
|
|
46722
|
+
const timeoutMs = typeof input?.params?.["timeoutMs"] === "number" ? input.params["timeoutMs"] : void 0;
|
|
46723
|
+
const gateways = await Ecowitt.discover({
|
|
46724
|
+
...broadcastAddr.length > 0 ? { broadcastAddr } : {},
|
|
46725
|
+
...timeoutMs !== void 0 ? { timeoutMs } : {}
|
|
46726
|
+
});
|
|
46727
|
+
this.ctx.logger.info("Ecowitt discovery complete", { meta: {
|
|
46728
|
+
count: gateways.length,
|
|
46729
|
+
broadcastAddr: broadcastAddr.length > 0 ? broadcastAddr : "local"
|
|
46730
|
+
} });
|
|
46731
|
+
return gateways.map((g) => {
|
|
46732
|
+
const displayName = g.model ?? g.name;
|
|
46733
|
+
return {
|
|
46734
|
+
stableId: `ecowitt:${slugifyHost(g.ip)}`,
|
|
46735
|
+
type: DeviceType.Hub,
|
|
46736
|
+
suggestedName: displayName,
|
|
46737
|
+
prefilledConfig: {
|
|
46738
|
+
name: displayName,
|
|
46739
|
+
connection: {
|
|
46740
|
+
transport: "local",
|
|
46741
|
+
host: g.ip
|
|
46742
|
+
}
|
|
46743
|
+
}
|
|
46744
|
+
};
|
|
46745
|
+
});
|
|
46746
|
+
}
|
|
46747
|
+
async adoptDiscoveredDevice(input) {
|
|
46748
|
+
return this.createDevice({
|
|
46749
|
+
type: DeviceType.Hub,
|
|
46750
|
+
config: input.candidate.prefilledConfig
|
|
46751
|
+
});
|
|
46752
|
+
}
|
|
46753
|
+
async supportsManualCreation() {
|
|
46754
|
+
return true;
|
|
46755
|
+
}
|
|
46756
|
+
async onGetCreationSchema(type) {
|
|
46757
|
+
if (type !== DeviceType.Hub) return null;
|
|
46758
|
+
return buildConnectionFormSchema();
|
|
46759
|
+
}
|
|
46760
|
+
async onCreateDevice(type, config) {
|
|
46761
|
+
if (type !== DeviceType.Hub) throw new Error(`Ecowitt provider does not support device type: ${type}`);
|
|
46762
|
+
const name = typeof config["name"] === "string" ? config["name"].trim() : "";
|
|
46763
|
+
if (!name) throw new Error("Gateway name is required");
|
|
46764
|
+
const connection = settingsToEcowittConfig(config);
|
|
46765
|
+
if (connection.transport === "local" && connection.host.trim().length === 0) throw new Error("Gateway host is required for local-poll transport");
|
|
46766
|
+
const stableId = this.generateStableId(DeviceType.Hub, { connection });
|
|
46767
|
+
const manager = new EcowittIntegrationManager({
|
|
46768
|
+
id: stableId,
|
|
46769
|
+
name,
|
|
46770
|
+
connection,
|
|
46771
|
+
logger: this.ctx.logger,
|
|
46772
|
+
onConnected: () => void 0,
|
|
46773
|
+
onDisconnected: () => void 0,
|
|
46774
|
+
onSensorsChanged: () => void 0,
|
|
46775
|
+
onFacadeBuilt: (_id, facade) => ecowittFacades.set(stableId, facade)
|
|
46776
|
+
});
|
|
46777
|
+
try {
|
|
46778
|
+
await manager.start();
|
|
46779
|
+
} catch (err) {
|
|
46780
|
+
this.ctx.logger.warn("Ecowitt create: initial client start failed — device kept", { meta: {
|
|
46781
|
+
stableId,
|
|
46782
|
+
error: errMsg(err)
|
|
46783
|
+
} });
|
|
46784
|
+
}
|
|
46785
|
+
return {
|
|
46786
|
+
meta: {
|
|
46787
|
+
type: DeviceType.Hub,
|
|
46788
|
+
name
|
|
46789
|
+
},
|
|
46790
|
+
config: {
|
|
46791
|
+
connection,
|
|
46792
|
+
system: "ecowitt-gateway"
|
|
46793
|
+
},
|
|
46794
|
+
onAfterCreate: async (device) => {
|
|
46795
|
+
if (device instanceof EcowittGatewayDevice) device.adoptManager(manager);
|
|
46796
|
+
}
|
|
46797
|
+
};
|
|
46798
|
+
}
|
|
46799
|
+
/**
|
|
46800
|
+
* Gateway stableId — derived from the connection (Reolink-style host/identity
|
|
46801
|
+
* key), NOT a broker id. Priority: `stationId` (operator-provided stable id) →
|
|
46802
|
+
* `host` (local transport) → `listen:<port>` (listener transport). Re-adding
|
|
46803
|
+
* the same gateway reuses its persisted row.
|
|
46804
|
+
*/
|
|
46805
|
+
generateStableId(_type, config) {
|
|
46806
|
+
const connection = extractConnection(config);
|
|
46807
|
+
const station = typeof connection?.stationId === "string" ? connection.stationId.trim() : "";
|
|
46808
|
+
if (station.length > 0) return `ecowitt:${slugifyHost(station)}`;
|
|
46809
|
+
if (connection?.transport === "local") {
|
|
46810
|
+
const host = connection.host.trim();
|
|
46811
|
+
if (host.length > 0) return `ecowitt:${slugifyHost(host)}`;
|
|
46812
|
+
}
|
|
46813
|
+
if (connection?.transport === "listener") return `ecowitt:listen-${connection.listenPort}`;
|
|
46814
|
+
throw new Error("Ecowitt: gateway resolved neither a station id nor a host/listen endpoint — cannot persist a stable row key.");
|
|
46815
|
+
}
|
|
46816
|
+
};
|
|
46817
|
+
/** Narrow the create-spec config's `connection` field to an {@link EcowittConfig}. */
|
|
46818
|
+
function extractConnection(config) {
|
|
46819
|
+
const raw = config?.["connection"];
|
|
46820
|
+
if (typeof raw !== "object" || raw === null) return null;
|
|
46821
|
+
const transport = raw.transport;
|
|
46822
|
+
if (transport !== "local" && transport !== "listener") return null;
|
|
46823
|
+
return settingsToEcowittConfig(raw);
|
|
46824
|
+
}
|
|
46825
|
+
//#endregion
|
|
46826
|
+
export { EcowittProviderAddon, deviceGroupForSensor as a, valueFieldForCap as c, ecowittGatewaySchema as d, settingsToEcowittConfig as f, capForQuantity as i, buildConnectionFormSchema as l, groupNativeId as n, deviceGroupLabel as o, ECOWITT_DEVICE_GROUPS as r, sensorLabel as s, buildEcowittGatewayCandidates as t, ecowittConfigSchema as u };
|