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